To install the Raspbian operating system follow the instructions. We recommend using a balenaEtcher to writing an image of a the Raspbian on the SD card
SD card must be at least 16 Gb
Insert the SD card into the Raspberry pi 3 and turn on the power. Make configuration settings for the Raspbian the first time you turn it on.
This section provides how to download and run pre-built Docker image without building the project.
TBD
To let the Edge Orchestration devices communicate with each other, each devices should have same authentication key in:
/var/edge-orchestration/data/cert/edge-orchestration.key
$ sudo cp {SampleKey.key} /var/edge-orchestration/data/cert/edge-orchestration.key
Any cert file can be authentication key
TBD
- docker
$ curl -sSL https://get.docker.com | sh
$ sudo usermod -aG docker $USER
$ newgrp docker
For execution of docker commands with non-root privileges you need to add
$USER
to docker group.
$ sudo usermod -aG docker $USER
- go compiler
$ sudo apt install golang
- glide
$ sudo apt install golang-glide
- edge-orchestration source code
$ git clone https://github.com/lf-edge/edge-home-orchestration-go.git
Temporarily build of Edge Orchestration is done directly on the Raspberry Pi 3 board
This project offers Docker image build as a default build option.
$ ./build.sh
This build script will build Edge Orchestration in Docker Container environment.
If it succeeds, you can see the container runs as follows:
**********************************
Run Docker container
**********************************
5d2efd81057fe56236602acfece0e8f11d447b54627f4f3669b18c85a95b8687
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d2efd81057f edge-orchestration:baobab "sh run.sh" Less than a second ago Up Less than a second edge-orchestration
and the built image as follows:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
edge-orchestration baobab 502e3c07b01f 3 seconds ago 132MB
- All Build Options
build script
Usage:
----------------------------------------------------------------------------------------------
./build.sh : build edge-orchestration by default container
./build.sh secure : build edge-orchestration by default container with secure option
./build.sh container : build Docker container as build system environmet
./build.sh container secure : build Docker container as build system environmet with secure option
./build.sh object : build object (c-object, java-object)
./build.sh object secure : build object (c-object, java-object) with secure option
./build.sh clean : build clean
./build.sh test [PKG_NAME] : run unittests (optional for PKG_NAME)
----------------------------------------------------------------------------------------------
Edge Orchestration provides only one REST API for its operation. Description for the APIs are stored in /doc folder.
- edge_orchestration_api.yaml or
- edge_orchestration_api_secure.yaml for secure mode.
Note that you can visit Swagger Editor to graphically investigate the REST API in YAML.
- Same network connected among the devices.
- Same Authentication key in /var/edge-orchestration/user/orchestration_userID.txt
- Please see the above 4. Add Key file to know how to add authentication key
- Edge Orchestration Docker image
- Please see the above How to build to know how to build Edge Orchestration Docker image
$ docker run -it -d \
--privileged \
--network="host" \
--name edge-orchestration \
-v /var/edge-orchestration/:/var/edge-orchestration/:rw \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
-v /proc/:/process/:ro \
edge-orchestration:baobab
- Result
$ docker logs -f edge-orchestration
2019/10/16 07:35:45 main_secured.go:89: [interface] OrchestrationInit
2019/10/16 07:35:45 main_secured.go:90: >>> commitID : c3041ae
2019/10/16 07:35:45 main_secured.go:91: >>> version :
2019/10/16 07:35:45 main_secured.go:92: >>> buildTime : {build time}
2019/10/16 07:35:45 main_secured.go:93: >>> buildTags : secure
2019/10/16 07:35:45 discovery.go:256: [discoverymgr] UUID : {$UUID}
2019/10/16 07:35:45 discovery.go:338: [discoverymgr] [{$discovery_ip_list}]
2019/10/16 07:35:45 discovery.go:369: [deviceDetectionRoutine] edge-orchestration-{$UUID}
2019/10/16 07:35:45 discovery.go:370: [deviceDetectionRoutine] confInfo : ExecType(container), Platform(docker)
2019/10/16 07:35:45 discovery.go:371: [deviceDetectionRoutine] netInfo : IPv4({$discovery_ip_list})
2019/10/16 07:35:45 discovery.go:372: [deviceDetectionRoutine] serviceInfo : Services([])
2019/10/16 07:35:45 discovery.go:373:
2019/10/16 07:35:45 tls.go:40: SetCertFilePath: /var/edge-orchestration/data/cert
2019/10/16 07:35:45 tls.go:40: SetCertFilePath: /var/edge-orchestration/data/cert
2019/10/16 07:35:45 route.go:76: {APIV1Ping GET /api/v1/ping 0x8090f0}
2019/10/16 07:35:45 route.go:76: {APIV1ServicemgrServicesPost POST /api/v1/servicemgr/services 0x809160}
2019/10/16 07:35:45 route.go:76: {APIV1ServicemgrServicesNotificationServiceIDPost POST /api/v1/servicemgr/services/notification/{serviceid} 0x8091c0}
2019/10/16 07:35:45 route.go:76: {APIV1ScoringmgrScoreLibnameGet GET /api/v1/scoringmgr/score 0x809220}
2019/10/16 07:35:45 route.go:76: {APIV1RequestServicePost POST /api/v1/orchestration/services 0x806cb0}
2019/10/16 07:35:45 route.go:104: ListenAndServeTLS_For_Inter
2019/10/16 07:35:45 route.go:111: ListenAndServe
2019/10/16 07:35:45 main_secured.go:141: interface orchestration init done
RESTAPI
-
POST
-
IP:56001/api/v1/orchestration/services
-
BODY :
{ "ServiceName": "hello-world", "ServiceInfo": [ { "ExecutionType": "container", "ExecCmd": [ "docker", "run", "-v", "/var/run:/var/run:rw", "hello-world" ] }], "StatusCallbackURI": "http://localhost:8888/api/v1/services/notification" }
-
Curl Example:
$ curl -X POST "IP:56001/api/v1/orchestration/services" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"ServiceName\": \"hello-world\", \"ServiceInfo\": [{ \"ExecutionType\": \"container\", \"ExecCmd\": [ \"docker\", \"run\", \"-v\", \"/var/run:/var/run:rw\", \"hello-world\"]}], \"StatusCallbackURI\": \"http://localhost:8888/api/v1/services/notification\"}"
If the
edge-orchestration
was assembled withsecure
option. You need to add a JSON Web Token into request headerAuthorization: {token}
and a image digest (sha256) to the last parameter."hello-world@sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752"
. More information about it you can find here.$ curl -X POST "IP:56001/api/v1/orchestration/services" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: $EDGE_ORCHESTRATION_TOKEN" -d "{ \"ServiceName\": \"hello-world\", \"ServiceInfo\": [{ \"ExecutionType\": \"container\", \"ExecCmd\": [ \"docker\", \"run\", \"-v\", \"/var/run:/var/run:rw\", \"hello-world@sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752\"]}], \"StatusCallbackURI\": \"http://localhost:8888/api/v1/services/notification\"}"
To add the
EDGE_ORCHESTRATION_TOKEN
variable to the environment execute the next command:$ . tools/jwt_gen.sh
To add your container hash to the container white list
/var/edge-erchestration/data/cwl/containerwhitelist.txt
, you need to add a hash line to the end file.# echo "fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752" >> /var/edge-erchestration/data/cwl/containerwhitelist.txt
-
Result(Execution on itself)
$ docker logs -f edge-orchestration 2019/06/07 05:41:03 externalhandler.go:75: [RestExternalInterface] APIV1RequestServicePost 2019/06/07 05:41:03 orchestration_api.go:70: [RequestService] container_service: [docker run -v /var/run:/var/run:rw hello-world] 2019/06/07 05:41:03 scoringmgr.go:131: [IN] getScoreLocalEnv 2019/06/07 05:41:03 scoringmgr.go:139: scoringmgr scoreValue : 7.481732534124991 2019/06/07 05:41:03 orchestration_api.go:90: [orchestrationapi] [{192.168.1.37 7.481732534124991}] 2019/06/07 05:41:03 route.go:87: POST /api/v1/orchestration/services APIV1RequestServicePost 272.182µs 2019/06/07 05:41:03 containerexecutor.go:75: [containerexecutor] container_service [docker run -v /var/run:/var/run:rw hello-world] 2019/06/07 05:41:03 containerexecutor.go:76: [containerexecutor] parameter length : 5 2019/06/07 06:46:12 route.go:87: POST /api/v1/orchestration/services APIV1RequestServicePost 396.063µs {"status":"Pulling from library/hello-world","id":"latest"} {"status":"Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe"} {"status":"Status: Image is up to date for hello-world:latest"} 2019/06/07 05:41:21 containerexecutor.go:90: [containerexecutor] create container : bb8c3425ec 2019/06/07 05:41:22 containerexecutor.go:108: [containerexecutor] container execution status : 0 2019-06-07T05:41:22.144893108Z 2019-06-07T05:45:35.717107646Z Hello from Docker! 2019-06-07T05:45:35.717110637Z This message shows that your installation appears to be working correctly. 2019-06-07T05:45:35.717112612Z 2019-06-07T05:45:35.717114418Z To generate this message, Docker took the following steps: 2019-06-07T05:45:35.717116284Z 1. The Docker client contacted the Docker daemon. 2019-06-07T05:45:35.717118076Z 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 2019-06-07T05:45:35.717120060Z (arm32v7) 2019-06-07T05:45:35.717121906Z 3. The Docker daemon created a new container from that image which runs the 2019-06-07T05:45:35.717123788Z executable that produces the output you are currently reading. 2019-06-07T05:45:35.717125570Z 4. The Docker daemon streamed that output to the Docker client, which sent it 2019-06-07T05:45:35.717127407Z to your terminal. 2019-06-07T05:45:35.717129190Z 2019-06-07T05:45:35.717130971Z To try something more ambitious, you can run an Ubuntu container with: 2019-06-07T05:45:35.717132780Z $ docker run -it ubuntu bash 2019-06-07T05:45:35.717134548Z 2019-06-07T05:45:35.717136249Z Share images, automate workflows, and more with a free Docker ID: 2019-06-07T05:45:35.717138053Z https://hub.docker.com/ 2019-06-07T05:45:35.717139826Z 2019-06-07T05:45:35.717141538Z For more examples and ideas, visit: 2019-06-07T05:45:35.717143307Z https://docs.docker.com/get-started/ 2019-06-07T05:45:35.717145081Z 2019/06/07 05:41:22 orchestration_api.go:163: [orchestrationapi] service status changed [appNames:container_service][status:Finished]
-
Not supported docker run option [Args in Body]
--detach-keys --disable-content-trust --sig-proxy --name --platform --help --cpu-percent (Windows only option) --cpu-count (Windows only option) --io-maxbandwidth (Windows only option) --io-maxiops (Windows only option)