Skip to content

Latest commit

 

History

History
284 lines (243 loc) · 13.5 KB

File metadata and controls

284 lines (243 loc) · 13.5 KB

Edge Orchestration on x86_64 Linux

Quick start

This section provides how to download and run pre-built Docker image without building the project.

1. Install docker-ce

2. Download Docker image

Please download edge-orchestration docker container

3. Load Docker image from tar file

$ docker load -i edge-orchestration.tar

If it succeeds, you can see the Docker image as follows:

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
edge-orchestration         coconut             502e3c07b01f        3 minutes ago       185MB

4. Run with Docker image

Please see the below How to work to know how to run Edge Orchestration Docker image


How to build

Build Prerequisites

For execution of docker commands with non-root privileges you need to add $USER to docker group.
$ sudo usermod -aG docker $USER

To build Edge Orchestrator from Go sources, you need to set GOPATH environment variable:
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOPATH/bin

  • extra Go utilities: (optional)

    $ go get github.com/axw/gocov/gocov
    
    $ go get github.com/matm/gocov-html
    
    $ go install honnef.co/go/tools/cmd/staticcheck@latest
    
  • extra linux utilities:

$ sudo apt-get install tree jq

For build of edge-orchestration project you should run the make create_context and specify the configuration file name for example: x86_64c and make (in the case of building in protected mode, use add x86_64ns), see examples below:

$ make distclean
$ make create_context CONFIGFILE=x86_64c
$ make

or for protected mode:

$ make distclean
$ make create_context CONFIGFILE=x86_64cs
$ make

To change the configuration file, you must execute the command make distclean

To easy change the configuration, you can use the kconfig-frontends. For Ubuntu 20.04 you can execute next command sudo apt-get install kconfig-frontends.

After successfully build you can run edge-orchestration by execute next command:

$ make run

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:coconut "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         coconut             502e3c07b01f        3 seconds ago       185MB
  • All Build Options
$ make help

If you build the edge-orchestration as c-object, then a more detailed description can be found x86_64_native.md


API Document

Edge Orchestration provides REST APIs for its operation. Description of APIs is stored in /docs folder.

Note that you can visit Swagger Editor to graphically investigate the REST API in YAML.


How to work

0. Prerequisites

  • Same network connected among the devices.
  • Same Authentication key in /var/edge-orchestration/user/orchestration_userID.txt
    • 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 (Any cert file can be authentication key)
  • Edge Orchestration Docker image
    • Please see the above How to build to know how to build Edge Orchestration Docker image
  • If you use in secure mode, you must deploy the key infrastructure.
  • If you use Data Storage, you must setup the Data Storage configuration and run the EdgeX Foundry containers

1. Run Edge Orchestration container

$ 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:coconut
  • Environment Variables

    You can adjust the configuration of the edge-orchestration container by passing the environment variables below on the docker run command.

    • SECURE

      Secure mode can be enabled by setting SECURE to true.

      $ docker run -it -d --privileged --network="host" --name edge-orchestration -e SECURE=true -v /var/edge-orchestration/:/var/edge-orchestration/:rw -v /var/run/docker.sock:/var/run/docker.sock:rw -v /proc/:/process/:ro edge-orchestration:coconut
    • MNEDC

      MNEDC mode can be enabled by setting MNEDC to server or client.

      $ docker run -it -d --privileged --network="host" --name edge-orchestration -e MNEDC=server -v /var/edge-orchestration/:/var/edge-orchestration/:rw -v /var/run/docker.sock:/var/run/docker.sock:rw -v /proc/:/process/:ro edge-orchestration:coconut
  • 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

2. Request to execute a service

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 with secure option. You need to add a JSON Web Token into request header Authorization: {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 HS256 Admin
    

    To add your container hash to the container white list /var/edge-orchestration/data/cwl/containerwhitelist.txt, you need to add a hash line to the end file.

    # echo "fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752" >> /var/edge-orchestration/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     (amd64)
    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)