From f91d40405a0bb7c607da1830222e6b0d45b6f22f Mon Sep 17 00:00:00 2001 From: David Delabassee Date: Wed, 5 Dec 2018 17:01:50 +0100 Subject: [PATCH 1/5] update to match the latest Flow API, initial commit --- Flow101/README.md | 82 ++++++++++++++++-------- Flow101/images/simple-flow-ui-async.png | Bin 5023 -> 34133 bytes Flow101/images/simple-flow-ui.png | Bin 13776 -> 45281 bytes 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/Flow101/README.md b/Flow101/README.md index a352543..f7becdf 100644 --- a/Flow101/README.md +++ b/Flow101/README.md @@ -6,7 +6,9 @@ Due to ongoing changes to Fn core, parts of this tutorial may not function as described. Check back for updates. ``` -This tutorial is based on [Matthew Gilliard's "Flow 101" blog post](https://mjg123.github.io/2017/10/10/FnProject-Flow-101.html). +This tutorial is based on [Matthew Gilliard's "Flow 101" blog post](https://mjg123.github.io/2017/10/10/FnProject-Flow-101.html). + +:point_up: Please be aware that the Fn Flow API has evolved since Matthew wrote his "Flow 101" post. [Fn Project](http://fnproject.io/) was released in October 2017. [Chad Arimura](https://twitter.com/chadarimura/) explained the motivation and structure of the project in a good amount of detail in his post ["8 Reasons why we built the Fn Project"](https://medium.com/fnproject/8-reasons-why-we-built-the-fn-project-bcfe45c5ae63), with one of the major components being **Fn Flow**. Flow allows developers to build high-level workflows of functions with some notable features: @@ -31,14 +33,16 @@ A simple Flow function looks like this: public String handleRequest(int x) { Flow flow = Flows.currentFlow(); + String funcToInvoke = "..."; // functionId of the function to invoke return flow.completedValue(x) .thenApply(i -> i+1) - .thenCompose( s -> Flow.invokeFunction("./isPrime", s) ) + .thenCompose( s -> Flow.invokeFunction(funcToInvoke, ... ) .get(); } ``` +:point_up: For illustration purpose, the above code is a simplification of the Fn Flow API and hence won't compile as is. If you've used a promises-style API before then this will be familiar. The closest analogue in core Java is the [CompletionStage API](http://download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletionStage.html) which was even called [`Promise`](http://cs.oswego.edu/pipermail/concurrency-interest/2012-December/010423.html) in a pre-release draft. @@ -106,7 +110,7 @@ Start the **Flow Server**: >```sh >docker run --rm -d \ > -p 8081:8081 \ -> -e API_URL="http://$FNSERVER_IP:8080/r" \ +> -e API_URL="http://$FNSERVER_IP:8080/invoke" \ > -e no_proxy=$FNSERVER_IP \ > --name flowserver \ > fnproject/flow:latest @@ -164,27 +168,46 @@ Flow has a comprehensive test framework, but lets concentrate on playing with th Make peace with yourself after that, then let's get the code in shape. +First, update the pom.xml to use Fn Flow. + +```xml + +... + + com.fnproject.fn + flow-runtime + LATEST + +... + +``` + + ![user input](../images/userinput.png) Change `HelloFunction.java` to look like this: ```java package com.example.fn; +import com.fnproject.fn.api.FnFeature; import com.fnproject.fn.api.flow.Flow; import com.fnproject.fn.api.flow.Flows; +import com.fnproject.fn.runtime.flow.FlowFeature; +@FnFeature(FlowFeature.class) public class HelloFunction { public String handleRequest(int x) { - Flow fl = Flows.currentFlow(); + Flow fl = Flows.currentFlow(); - return fl.completedValue(x) - .thenApply( i -> i*2 ) - .thenApply( i -> "Your number is " + i ) - .get(); + return fl.completedValue(x) + .thenApply( i -> i*2 ) + .thenApply( i -> "Your number is " + i ) + .get(); } -} -``` +}``` + +:point_up: Double check that your function is importing `com.fnproject.fn.api.flow.Flow` and not `java.util.concurrent.Flow`! Then deploy this to an app which we call `flow101` on the local Fn server. @@ -200,11 +223,11 @@ Then configure the function to talk to the Flow Server. >fn config app flow101 COMPLETER_BASE_URL "http://$FLOWSERVER_IP:8081" >``` -You can now invoke the function using `fn call`: +You can now invoke the function using `fn invoke flow101 simple-flow`: ![user input](../images/userinput.png) >```sh ->echo 2 | fn call flow101 /simple-flow +>echo 2 | fn invoke flow101 simple-flow >``` The output looks something like the following: @@ -213,18 +236,7 @@ The output looks something like the following: Your number is 4 ``` -Alternatively, you can now invoke the function using `curl`: - -![user input](../images/userinput.png) ->```sh ->curl -d "2" http://localhost:8080/r/flow101/simple-flow ->``` - -The output looks something like the following: - -``` -Your number is 4 -``` +Alternatively, you can configure an HTTP trigger and invoke the function using `curl`. ## Exploring the Flow UI @@ -234,13 +246,31 @@ Browsing to [http://localhost:3002](http://localhost:3002) you should see someth Which is showing us 3 function invocations: - * The main flow function, in blue + * The main flow function at the top * `.thenApply` for the code `i -> i*2` * `.thenApply` for the code `i -> "Your number is " + i` Click on any of these and see the detail for each one expanded at the bottom of the screen. -The blue function is shown as running for the whole time that the `thenApply` stages are. Why? Because we are calling `.get()` at the end, so this is synchronously waiting for the final result of the chain. Exercise: Try removing the `.get()` from the code (you'll need to return a different String, and don't forget to re-deploy). Now it will look like: +Note that Fn Flow using functionId to reference functions. To know the functionId of the main function, just use the following command : `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` if you're lazy. + +```json +{ + "annotations": { + "fnproject.io/fn/invokeEndpoint": "http://localhost:8080/invoke/01CXZF8FF8NG8G00GZJ000002R" + }, + "app_id": "...", + "created_at": "...", + "id": "01CXZF8FF8NG8G00GZJ000002R", + ... +} +``` + +The `ìd` shoud match the id of the main function that you see in the UI. + +:point_up: Make sure to not confuse `id` which is the functionId with the applicationId, i.e. `app_id`. + +The main function is shown as running for the whole time that the `thenApply` stages are. Why? Because we are calling `.get()` at the end, so this is synchronously waiting for the final result of the chain. Exercise: Try removing the `.get()` from the code (you'll need to return a different String, and don't forget to re-deploy). Now it will look like: ![flow-ui](images/simple-flow-ui-async.png) diff --git a/Flow101/images/simple-flow-ui-async.png b/Flow101/images/simple-flow-ui-async.png index 293f2d4c263764fd280f6bf0a1b89af0e786565d..3d829e22528d42932e623262c3f03b472d961cfb 100644 GIT binary patch literal 34133 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 literal 5023 zcmb_ghc{f^*B;^3#VBEjU^1e&B)Z_$2|=RQL3B|@ixB0fPt@p9LzEEV)kcdpx?!~F zEsQRDpD}!s_aFFuYkl8Zx14*=UT5!n_Os7D&jZ)fQKz9~r33%~G@2SJuK)m|X+k@h z{0`xoNy3aL+$cOXOuYdBDuzEN5g;oEM0iQ&qxnLWY=x4VniWEcZO{h*800lo6b=06 z_7(#T4Az&(4jmmlHtuLs7KMgd*aOM+3=YHIjgQx){`RV~STB2q61;m*^V(<0%w9lC zm$_EIYIoRM#w_5+uiZyguoP~Mn@ZbcyJhCB|BsowJorQ>G%&sDGyO8obE z7V2sHrtC=Y`B1GYTOS<&(5Tz(M2Nab6aaWdh%gBW0BG0%0Dn^w12`jz002H}Kqw>W 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 diff --git a/Flow101/images/simple-flow-ui.png b/Flow101/images/simple-flow-ui.png index 926e74263d2bdb9eb90755a1eb0397d5c76b36cc..ebc757fd4a0820cb57b00842ad479121e026565e 100644 GIT binary patch literal 45281 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

Efx^AZ3J4ibSxj5Yu=H+g( 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 literal 13776 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 aheUsM(79Il!G!VeI^?93!L<@5A^!`NKN6V$ From 4734afbe6eff3bfd0788ac9c4d82cf6dd6bc9f15 Mon Sep 17 00:00:00 2001 From: David Delabassee Date: Wed, 5 Dec 2018 17:10:02 +0100 Subject: [PATCH 2/5] cleaning --- Flow101/README.md | 75 ++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/Flow101/README.md b/Flow101/README.md index f7becdf..9d1f546 100644 --- a/Flow101/README.md +++ b/Flow101/README.md @@ -42,7 +42,7 @@ A simple Flow function looks like this: } ``` -:point_up: For illustration purpose, the above code is a simplification of the Fn Flow API and hence won't compile as is. +:point_up: For illustration purpose, the above code is a simplification of the Fn Flow API and hence it won't compile as-is. If you've used a promises-style API before then this will be familiar. The closest analogue in core Java is the [CompletionStage API](http://download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletionStage.html) which was even called [`Promise`](http://cs.oswego.edu/pipermail/concurrency-interest/2012-December/010423.html) in a pre-release draft. @@ -68,16 +68,16 @@ Currently FnProject is available to download, to experiment with, and to run on Install the **`fn`** CLI tool: ![user input](../images/userinput.png) ->```sh ->curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh ->``` +```sh +curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh +``` Then start the **Fn server**: ![user input](../images/userinput.png) ->```sh ->fn start ->``` +```sh +fn start +``` The output looks something like the following. The version number below is old. You should see the latest version number in your case. @@ -89,7 +89,7 @@ time="2017-10-11T13:12:44Z" level=info msg="Serving Functions API on address `:8 / /_ / __ \ / __/ / / / / /_/ /_/ /_/ - v0.3.119 + v0.3.629 ``` The **Flow Server** needs to know how to call the Fn server, so ask Docker which IP address to use. @@ -107,14 +107,14 @@ FNSERVER_IP=$(docker inspect --type container -f '{{.NetworkSettings.I Start the **Flow Server**: ![user input](../images/userinput.png) ->```sh ->docker run --rm -d \ -> -p 8081:8081 \ -> -e API_URL="http://$FNSERVER_IP:8080/invoke" \ -> -e no_proxy=$FNSERVER_IP \ -> --name flowserver \ -> fnproject/flow:latest ->``` +```sh +docker run --rm -d \ + -p 8081:8081 \ + -e API_URL="http://$FNSERVER_IP:8080/invoke" \ + -e no_proxy=$FNSERVER_IP \ + --name flowserver \ + fnproject/flow:latest +``` Then start the Flow **UI**: @@ -130,14 +130,14 @@ FLOWSERVER_IP=$(docker inspect --type container -f '{{.NetworkSettings ![user input](../images/userinput.png) ->```sh ->docker run --rm -d \ -> -p 3002:3000 \ -> --name flowui \ -> -e API_URL=http://$FNSERVER_IP:8080 \ -> -e COMPLETER_BASE_URL=http://$FLOWSERVER_IP:8081 \ -> fnproject/flow:ui ->``` +```sh +docker run --rm -d \ + -p 3002:3000 \ + --name flowui \ + -e API_URL=http://$FNSERVER_IP:8080 \ + -e COMPLETER_BASE_URL=http://$FLOWSERVER_IP:8081 \ + fnproject/flow:ui +``` Now, everything's set so lets crack on! @@ -148,27 +148,27 @@ Now, everything's set so lets crack on! Create a new function: ![user input](../images/userinput.png) ->```sh ->fn init --runtime=java simple-flow ->``` +```sh +fn init --runtime=java simple-flow +``` Change directory: ![user input](../images/userinput.png) ->```sh ->cd simple-flow ->``` +```sh +cd simple-flow +``` Flow has a comprehensive test framework, but lets concentrate on playing with the code for the time being: ![user input](../images/userinput.png) ->```sh -> rm -rf src/test ## yolo ->``` +```sh +rm -rf src/test ## yolo +``` Make peace with yourself after that, then let's get the code in shape. -First, update the pom.xml to use Fn Flow. +First, update the `pom.xml` to use Fn Flow. ```xml @@ -205,7 +205,8 @@ public class HelloFunction { .thenApply( i -> "Your number is " + i ) .get(); } -}``` +} +``` :point_up: Double check that your function is importing `com.fnproject.fn.api.flow.Flow` and not `java.util.concurrent.Flow`! @@ -252,7 +253,9 @@ Which is showing us 3 function invocations: Click on any of these and see the detail for each one expanded at the bottom of the screen. -Note that Fn Flow using functionId to reference functions. To know the functionId of the main function, just use the following command : `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` if you're lazy. +:point_up: You might want to Zoom to see more (see at the bottom of the UI). + +Note that Fn Flow using functionId to reference functions. To know the functionId of the main function, just use the following command : `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~~if you're lazy ~~ to save some time. ```json { From b6ddb94c6b3e9bed564f81bda18f541341a251b8 Mon Sep 17 00:00:00 2001 From: David Delabassee Date: Wed, 5 Dec 2018 17:17:04 +0100 Subject: [PATCH 3/5] cleaning --- Flow101/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Flow101/README.md b/Flow101/README.md index 9d1f546..540540c 100644 --- a/Flow101/README.md +++ b/Flow101/README.md @@ -253,9 +253,9 @@ Which is showing us 3 function invocations: Click on any of these and see the detail for each one expanded at the bottom of the screen. -:point_up: You might want to Zoom to see more (see at the bottom of the UI). +:point_up: You might want to Zoom to see more details (see at the bottom of the UI). -Note that Fn Flow using functionId to reference functions. To know the functionId of the main function, just use the following command : `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~~if you're lazy ~~ to save some time. +Note that Fn Flow using *functionId* to reference functions. To know the *functionId* of the main function, just use the following command: `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~if you're lazy~ to save some time. ```json { @@ -269,9 +269,9 @@ Note that Fn Flow using functionId to reference functions. To know the functionI } ``` -The `ìd` shoud match the id of the main function that you see in the UI. +The `ìd` shoud match the *functionId* of the main function that you see in the UI. -:point_up: Make sure to not confuse `id` which is the functionId with the applicationId, i.e. `app_id`. +:point_up: Make sure to not confuse `id` which is the *functionId* with the *applicationId*, i.e. `app_id`. The main function is shown as running for the whole time that the `thenApply` stages are. Why? Because we are calling `.get()` at the end, so this is synchronously waiting for the final result of the chain. Exercise: Try removing the `.get()` from the code (you'll need to return a different String, and don't forget to re-deploy). Now it will look like: From 4a70ff677b0a9a48155004e22789dfd906057da7 Mon Sep 17 00:00:00 2001 From: David Delabassee Date: Wed, 5 Dec 2018 17:24:03 +0100 Subject: [PATCH 4/5] cleaning --- Flow101/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Flow101/README.md b/Flow101/README.md index 540540c..98f7b20 100644 --- a/Flow101/README.md +++ b/Flow101/README.md @@ -44,14 +44,14 @@ A simple Flow function looks like this: ``` :point_up: For illustration purpose, the above code is a simplification of the Fn Flow API and hence it won't compile as-is. -If you've used a promises-style API before then this will be familiar. The closest analogue in core Java is the [CompletionStage API](http://download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletionStage.html) which was even called [`Promise`](http://cs.oswego.edu/pipermail/concurrency-interest/2012-December/010423.html) in a pre-release draft. +If you've used a promises-style API before then this will be familiar. The closest analogue in core Java is the [CompletionStage API](http://download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletionStage.html). Anyway it's easy to tell the stages of what's going to happen: - Start with a value provided by the user - - Apply some transformation `i -> i+1` - - Pass that to an external function called `./isPrime` - - Then return get the result and return it + - then apply some transformation `i -> i+1` + - then pass that to an external function + - finally wait for the return and return it. Internally the `Flow` class submits each stage in this workflow to the Flow Server. You'll meet it soon. The Flow Server will then orchestrate each stage as an individual call to Fn. Flow Server is responsible for working out which stages are ready to be called, calling them, handling the results and triggering any following stages until you reach the point where there's no more work to do. @@ -210,7 +210,7 @@ public class HelloFunction { :point_up: Double check that your function is importing `com.fnproject.fn.api.flow.Flow` and not `java.util.concurrent.Flow`! -Then deploy this to an app which we call `flow101` on the local Fn server. +Then deploy this function to an app which we call `flow101` on the local Fn server. ![user input](../images/userinput.png) >```sh @@ -253,7 +253,7 @@ Which is showing us 3 function invocations: Click on any of these and see the detail for each one expanded at the bottom of the screen. -:point_up: You might want to Zoom to see more details (see at the bottom of the UI). +:point_up: You might want to zoom to see more details, see the buttons at the bottom of the UI. Note that Fn Flow using *functionId* to reference functions. To know the *functionId* of the main function, just use the following command: `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~if you're lazy~ to save some time. @@ -269,7 +269,7 @@ Note that Fn Flow using *functionId* to reference functions. To know the *functi } ``` -The `ìd` shoud match the *functionId* of the main function that you see in the UI. +The `id` should match the *functionId* of the main function that you see in the UI. :point_up: Make sure to not confuse `id` which is the *functionId* with the *applicationId*, i.e. `app_id`. From 235565d3fc2fc6a8cbc25890ccd1b9e6b3bc8b06 Mon Sep 17 00:00:00 2001 From: David Delabassee Date: Wed, 5 Dec 2018 17:26:54 +0100 Subject: [PATCH 5/5] cleaning --- Flow101/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow101/README.md b/Flow101/README.md index 98f7b20..9a24dc0 100644 --- a/Flow101/README.md +++ b/Flow101/README.md @@ -255,7 +255,7 @@ Click on any of these and see the detail for each one expanded at the bottom of :point_up: You might want to zoom to see more details, see the buttons at the bottom of the UI. -Note that Fn Flow using *functionId* to reference functions. To know the *functionId* of the main function, just use the following command: `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~if you're lazy~ to save some time. +Note that Fn Flow is using *functionId* to reference functions. To know the *functionId* of the main function, just use the following command: `fn inspect function flow101 simple-flow` or simply `fn i f flow101 simple-flow` ~if you're lazy~ to save some time. ```json {