Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Deployment, as well as other tasks such as starting and stopping the cluster, is coordinated through a set of Ansible playbooks. (Ansible playbooks are a system used by the Ansible tool for describing the desired state of a system. In many ways they are similar to shell scripts. For more details see the Ansible documentation.) The playbooks are run by the deploy node and build node, and they execute commands on the deploy node, the master node, the build node, and in some cases on the edge nodes. Once the nodes are set up, most activity is carried out by Kubernetes. Kubernetes is configured by the playbooks and told to start or stop services on the edge nodes. These services are run in containers, and the images for these containers are stored in a local Docker registry. There are containers for the Kubernetes components themselves, plus Flannel (a component which provides networking inside the Kubernetes cluster), EdgeX Foundry services, and four custom services (sync-app and image-app and device-lora and device-camera) built using the EdgeX SDKs.

...

  • Build node
    • make 4.2.1, build-essential 12.8, python3-pip 20.0.2, default-jre 2:1.11-72
    • Robot Framework 6.0
    • Docker (docker.io) 20.10.12
    • Go 1.16.10
  • Deploy node
    • make 4.2.1, build-essential 12.8, python3-pip 20.0.2
    • Ansible 2.12.95
    • Ansible collections community.docker, kubernetes.core, community.crypto
  • Master node
    • Docker (docker.io) 20.10.12
    • python3-pip 20.0.2
    • Python packages cryptography and kubernetes
    • mosquitto 2.0.15, mosquitto-clients 2.0.15
    • Kubernetes (kubectl, kubelet, kubeadm) 1.22.9
    • Flannel 0.17.0, flannel-cni-plugin 1.0.1 (Note: These are containers installed via Kubernetes through a config file)
  • Edge node
    • Docker (docker.io) 20.10.12
    • Kubernetes (kubelet, kubeadm) 1.22.9 (kubectl may be installed for debugging purposes)

...

Modify the hosts file in the deploy/playbook directory with the host names and IP addresses of the master, build, cicd, and edge nodes.  

all:
hosts:
children:
  deploy:
hosts:
localhost:
master:
    hosts:
sdt-master: # hostname of master node
edge_nodes:
  hosts:
jet03: # hostname of first edge node
      ip: 192.168.2.27 # IP address of first edge node
  lora_id: 1
     jet04: # hostname of second edge node
      ip: 192.168.2.29 # IP address of second edge node
    lora_id: 4
vars:
     ansible_user: edge
     ansible_ssh_private_key_file: ~/.ssh/edge
build:
hosts:
sdt-build: # hostname of build node
ip: 192.168.10.203 # IP address of build node
cicd:
hosts:
sdt-cicd: # hostname of cicd node
ip: 192.168.10.200 # IP address of cicd node

Modify the host names and ip IP addresses of the master/, build/, cicd /and deploy nodes in the cicd/playbook/hosts file. 

...

  • Make sure there are entries for the cicd, build, master and edge node names in /etc/hosts
  • Install required software packages including Docker, Kubernetes, pip, and mosquitto
  • Install Python packages used by other playbooks (kubernetes and cryptography)
  • Make sure the user can run Docker commands
  • Prepare basic configuration for Docker and Kubernetes
  • Set up a user name and password for the MQTT service

...

Once the key files have been created, the following command can be run from the deploy node to copy the key to build node so a password will not be required for each login. (The administrative user's password will be requested when running this command.)

ssh-copy-id -i ~/.ssh/lfedge_build.pub sdt-admin@nodename

Note, if you use an administrative account with a different name, change the variable ansible_user in the build group in the cicd/playbook/hosts file to match the user name you are using.

...

The playbook will perform the following initialization tasks:

  • Make sure there is an entry are entries for the master node and deploy node nodes in /etc/hosts
  • Install required software packages including Docker and Go and Robot Framework
  • Make sure the user can run Docker commands
  • Configure Docker, including adding the certificates to secure access to the private registry

...

Once the key files have been created, the following command can be run from the deploy node to copy the key to build node so a password will not be required for each login. (The administrative user's password will be requested when running this command.)

ssh-copy-id -i ~/.ssh/lfedge_cicd.pub sdt-admin@nodename

Note, if you use an administrative account with a different name, change the variable ansible_user in the cicd group in the cicd/playbook/hosts file to match the user name you are using.

...

At this time, images for the four custom services, sync-app and , image-app and , device-lora and device-camera, need to be built from source and pushed to the private Docker registry. (In the future these images should be available on Docker Hub or another public registry.) Use the following playbooks from the cicd/playbook directory on the build deploy node to do so.

Note, limited by base image NVIDIA L4T CUDA which only supports arm architecture, so custom service imageservice image-app also app also only supports arm architecture. Other custom services support both arm64 and amd64 architecturearchitectures.

This command executed on the deploy node will build local docker images of the custom microservices:

...

The build command can take some time, depending on connection speed and the load on the deploy host, especially the compilation of cross-compiled images.

This command executed on the deploy node will push the images to the private registry:

ansible-playbook -i ./hosts push_images.yml

At time of writing this step will also create some workaround images required to enable EdgeX security features in this blueprint's Kubernetes configuration. Hopefully, these images will no longer be needed once fixes have been made upstream.

Starting the Cluster

With the base software installed and configured on the master and edge nodes, the following command executed on the deploy node will start the cluster:

...

This command only starts the master node in the Kubernetes cluster. The state of the master node can be confirmed using the kubectl get node command  command on the master node.

sdt-admin@sdt-master:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 3d5h v1.22.9

...

ansible-playbook -i ./hosts join_cluster.yml

The kubectl get nodenodes command on the master node can be used to confirm the state of the edge nodes.

...

  • Modify the file edgex.yml in the deploy/playbook/group_vars/all directory to decide which services will be started. For details, please refer to the section Enabling and Disabling Optional Services below.
  • If the custom service device-camera will be started, set the camera_ip value to the IP address of the camera node in the deploy\playbook\host_vars\jet03.yml file and the deploy\playbook\host_vars\jet04.yml file. 
  • If you are using different hostnames host names of the edge nodes, change the file name of  files in the deploy\playbook\host_vars directory, and change destination_host value in the files in the deploy\playbook\host_vars directory.

...

Note, during initialization of the services you may see some containers restart one or more times. This is part of the timeout and retry behavior of the services waiting for other services to complete initialization and does not indicate a problem.

Camera Nodes

Configuration of  the Camera Nodes (TODO)

Consult the installation instructions for the H.View HV-500E6A hardware.

Readings received from Camera nodes These readings should appear in the core-data database and be possible to monitor using the edgex-events-nodename channel. For example, the following command run on the master node should show the readings arriving at an edge node named "jet03":

...

*** Settings ***
Library SSHLibrary
Library String

*** Variables ***
${HOME} /home/sdt-admin # host directory of build and deploy node
${DEPLOY_HOST} sdt-deploy # hostname of deploy node
${DEPLOY_USER} sdt-admin # username of deploy node
${DEPLOY_KEY} ${HOME}/.ssh/lfedge_deploy # private key in build node to access deploy node
${DEPLOY_PWD} password
${PLAYBOOK_PATH} lf-edge/deploy/playbook # playbook path of build and deploy node
${EDGE_HOST1} jet03 # hostname of edge node#1
${EDGE_HOST2} jet04 # hostname of edge node#2
${EDGE_USER} edge # username of edge node
${EDGE_KEY} ${HOME}/.ssh/edge # private key in deploy node to access edge node

*** Keywords ***
……
……

...

The custom services can be rebuilt by running the build_images.yml playbook in cicd/playbook. After successfully building a new version of a service, use push_images.yml to push the images to the private Docker registry. The source for the services is found in edgex/sync-app and , edgex/image-app, edgex/device-camera, and edgex/device-lora.

License

...

PackageLicense TypeLicense URL
bitbucket.org/bertimus9/systemstatMIThttps://bitbucket.org/bertimus9/systemstat/src/master0eeff89b0690/LICENSE
github.com/armon/go-metricsMIThttps://github.com/armon/go-metrics/blob/masterf0300d1749da/LICENSE
github.com/cenkalti/backoffMIThttps://github.com/cenkalti/backoff/blob/masterv2.2.1/LICENSE
github.com/diegoholiveira/jsonlogicMIThttps://github.com/diegoholiveira/jsonlogic/blob/masterab7989be08b9/LICENSE
github.com/eclipse/paho.mqtt.golangBSD-3-Clausehttps://github.com/eclipse/paho.mqtt.golang/blob/masterv1.3.5/LICENSE
github.com/edgexfoundry/app-functions-sdk-go/v2Apache-2.0https://github.com/edgexfoundry/app-functions-sdk-go/blob/master/v2v2.1.0/LICENSE
github.com/edgexfoundry/app-functions-sdk-go/v2/internal/etmMIThttps://github.com/edgexfoundry/app-functions-sdk-go/blob/master/v2.1.0/internal/etm/LICENSE
github.com/edgexfoundry/go-mod-bootstrap/v2Apache-2.0https://github.com/edgexfoundry/go-mod-bootstrap/blob/master/v2.1.0/LICENSE
github.com/edgexfoundry/go-mod-configuration/v2Apache-2.0https://github.com/edgexfoundry/go-mod-configuration/blob/master/v2.1.0/LICENSE
github.com/edgexfoundry/go-mod-core-contracts/v2Apache-2.0https://github.com/edgexfoundry/go-mod-core-contracts/blob/master/v2.1.0/LICENSE
github.com/edgexfoundry/go-mod-messaging/v2Apache-2.0https://github.com/edgexfoundry/go-mod-messaging/blob/master/v2.1.0/LICENSE
github.com/edgexfoundry/go-mod-registry/v2Apache-2.0https://github.com/edgexfoundry/go-mod-registry/blob/master/v2.1.0/LICENSE
github.com/edgexfoundry/go-mod-secrets/v2Apache-2.0https://github.com/edgexfoundry/go-mod-secrets/blob/master/v2.1.0/LICENSE
github.com/fatih/colorMIThttps://github.com/fatih/color/blob/masterv1.9.0/LICENSE.md
github.com/fxamacker/cbor/v2MIThttps://github.com/fxamacker/cbor/blob/master/v2.3.0/LICENSE
github.com/go-kit/kit/logMIThttps://github.com/go-kit/kit/blob/master/logv0.11.0/LICENSE
github.com/go-logfmt/logfmtMIThttps://github.com/go-logfmt/logfmt/blob/masterv0.5.0/LICENSE
github.com/gomodulego-playground/redigolocalesMITApache-2.0https://github.com/gomodulego-playground/redigolocales/blob/masterv0.14.0/LICENSE
github.com/google/uuidBSD-3-Clausego-playground/universal-translatorMIThttps://github.com/google/uuidgo-playground/universal-translator/blob/masterv0.18.0/LICENSE
github.com/go-playground/validator/localesv10MIThttps://github.com/go-playground/localesvalidator/blob/masterv10.9.0/LICENSE
github.com/go-playground/universal-translatorMITredis/redis/v7BSD-2-Clausehttps://github.com/go-playgroundredis/universal-translatorredis/blob/masterv7.3.0/LICENSE
github.com/go-playground/validator/v10gomodule/redigoApache-2.0MIThttps://github.com/go-playgroundgomodule/validatorredigo/blob/master/v10v2.0.0/LICENSE
github.com/go-redis/redis/v7google/uuidBSD-23-Clausehttps://github.com/go-redisgoogle/redisuuid/blob/master/v7v1.3.0/LICENSE
github.com/gorilla/muxBSD-3-Clausehttps://github.com/gorilla/mux/blob/masterv1.8.0/LICENSE
github.com/gorilla/websocketBSD-2-Clausehttps://github.com/gorilla/websocket/blob/masterv1.4.2/LICENSE
github.com/hashicorp/consul/apiMPL-2.0https://github.com/hashicorp/consul/blob/master/api/v1.9.1/api/LICENSE
github.com/hashicorp/errwrapMPL-2.0https://github.com/hashicorp/errwrap/blob/masterv1.0.0/LICENSE
github.com/hashicorp/go-cleanhttpMPL-2.0https://github.com/hashicorp/go-cleanhttp/blob/masterv0.5.1/LICENSE
github.com/hashicorp/go-hclogMIThttps://github.com/hashicorp/go-hclog/blob/masterv0.12.0/LICENSE
github.com/hashicorp/go-immutable-radixMPL-2.0https://github.com/hashicorp/go-immutable-radix/blob/masterv1.0.0/LICENSE
github.com/hashicorp/golanggo-lru/simplelrumultierrorMPL-2.0https://github.com/hashicorp/golanggo-lrumultierror/blob/master/simplelruv1.1.1/LICENSE
github.com/hashicorp/go-multierrorrootcertsMPL-2.0https://github.com/hashicorp/go-multierrorrootcerts/blob/masterv1.0.2/LICENSE
github.com/hashicorp/gogolang-rootcertslru/simplelruMPL-2.0https://github.com/hashicorp/gogolang-rootcertslru/blob/masterv0.5.0/LICENSE
github.com/hashicorp/serf/coordinateMPL-2.0https://github.com/hashicorp/serf/blob/master/coordinatev0.9.5/LICENSE
github.com/leodido/go-urnMIThttps://github.com/leodido/go-urn/blob/masterv1.2.1/LICENSE
github.com/mattn/go-colorableMIThttps://github.com/mattn/go-colorable/blob/masterv0.1.6/LICENSE
github.com/mattn/go-isattyMIThttps://github.com/mattn/go-isatty/blob/masterv0.0.12/LICENSE
github.com/mitchellh/consulstructureMIThttps://github.com/mitchellh/consulstructure/blob/master56fdc4d2da54/LICENSE
github.com/mitchellh/copystructureMIThttps://github.com/mitchellh/copystructure/blob/masterv1.0.0/LICENSE
github.com/mitchellh/mapstructureMIThttps://github.com/mitchellh/mapstructure/blob/masterv1.1.2/LICENSE
github.com/mitchellh/reflectwalkMIThttps://github.com/mitchellh/reflectwalk/blob/masterv1.0.0/LICENSE
github.com/pebbe/zmq4BSD-2-Clausehttps://github.com/pebbe/zmq4/blob/masterv1.2.7/LICENSE.txt
github.com/pelletier/go-tomlApache-2.0https://github.com/pelletier/go-toml/blob/masterv1.9.4/LICENSE
github.com/x448/float16MIThttps://github.com/x448/float16/blob/masterv0.8.4/LICENSE
golang.org/x/crypto/sha3BSD-3-Clausehttps://pkgcs.goopensource.devgoogle/golang.orggo/x/crypto/sha3?tab=licenses/+/a769d52b:LICENSE
golang.org/x/netBSD-3-Clausehttps://pkgcs.goopensource.devgoogle/golang.orggo/x/net?tab=licenses/+/a5a99cb3:LICENSE
golang.org/x/sysBSD-3-Clausehttps://pkgcs.goopensource.devgoogle/golang.orggo/x/sys?tab=licenses/+/e5e7981a:LICENSE
golang.org/x/textBSD-3-Clausehttps://pkgcs.goopensource.devgoogle/golang.orggo/x/text?tab=licenses/+/v0.3.6:LICENSE

LoRa Device Service

The LoRa device service is linked with the following packages when compiled:

PackageLicense TypeLicense URL
bitbucket.org/bertimus9/systemstatMIThttps://bitbucket.org/bertimus9/systemstat/src/master/LICENSE
github.com/armon/go-metricsMIThttps://github.com/armon/go-metrics/blob/master/LICENSE
github.com/cenkalti/backoffMIThttps://github.com/cenkalti/backoff/blob/master/LICENSE
github.com/eclipse/paho.mqtt.golangBSD-3-Clausehttps://github.com/eclipse/paho.mqtt.golang/blob/master/LICENSE
github.com/edgexfoundry/device-sdk-go/v2Apache-2.0https://github.com/edgexfoundry/device-sdk-go/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-bootstrap/v2Apache-2.0https://github.com/edgexfoundry/go-mod-bootstrap/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-configuration/v2Apache-2.0https://github.com/edgexfoundry/go-mod-configuration/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-core-contracts/v2Apache-2.0https://github.com/edgexfoundry/go-mod-core-contracts/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-messaging/v2Apache-2.0https://github.com/edgexfoundry/go-mod-messaging/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-registry/v2Apache-2.0https://github.com/edgexfoundry/go-mod-registry/blob/master/v2/LICENSE
github.com/edgexfoundry/go-mod-secrets/v2Apache-2.0https://github.com/edgexfoundry/go-mod-secrets/blob/master/v2/LICENSE
github.com/fatih/colorMIThttps://github.com/fatih/color/blob/master/LICENSE.md
github.com/fxamacker/cbor/v2MIThttps://github.com/fxamacker/cbor/blob/master/v2/LICENSE
github.com/go-kit/kit/logMIThttps://github.com/go-kit/kit/blob/master/log/LICENSE
github.com/go-logfmt/logfmtMIThttps://github.com/go-logfmt/logfmt/blob/master/LICENSE
github.com/google/uuidBSD-3-Clausehttps://github.com/google/uuid/blob/master/LICENSE
github.com/go-playground/localesMIThttps://github.com/go-playground/locales/blob/master/LICENSE
github.com/go-playground/universal-translatorMIThttps://github.com/go-playground/universal-translator/blob/master/LICENSE
github.com/go-playground/validator/v10MIThttps://github.com/go-playground/validator/blob/master/v10/LICENSE
github.com/go-redis/redis/v7BSD-2-Clausehttps://github.com/go-redis/redis/blob/master/v7/LICENSE
github.com/gorilla/muxBSD-3-Clausehttps://github.com/gorilla/mux/blob/master/LICENSE
github.com/gorilla/websocketBSD-2-Clausehttps://github.com/gorilla/websocket/blob/master/LICENSE
github.com/hashicorp/consul/apiMPL-2.0https://github.com/hashicorp/consul/blob/master/api/LICENSE
github.com/hashicorp/errwrapMPL-2.0https://github.com/hashicorp/errwrap/blob/master/LICENSE
github.com/hashicorp/go-cleanhttpMPL-2.0https://github.com/hashicorp/go-cleanhttp/blob/master/LICENSE
github.com/hashicorp/go-hclogMIThttps://github.com/hashicorp/go-hclog/blob/master/LICENSE
github.com/hashicorp/go-immutable-radixMPL-2.0https://github.com/hashicorp/go-immutable-radix/blob/master/LICENSE
github.com/hashicorp/golang-lru/simplelruMPL-2.0https://github.com/hashicorp/golang-lru/blob/master/simplelru/LICENSE
github.com/hashicorp/go-multierrorMPL-2.0https://github.com/hashicorp/go-multierror/blob/master/LICENSE
github.com/hashicorp/go-rootcertsMPL-2.0https://github.com/hashicorp/go-rootcerts/blob/master/LICENSE
github.com/hashicorp/serf/coordinateMPL-2.0https://github.com/hashicorp/serf/blob/master/coordinate/LICENSE
github.com/leodido/go-urnMIThttps://github.com/leodido/go-urn/blob/master/LICENSE
github.com/mattn/go-colorableMIThttps://github.com/mattn/go-colorable/blob/master/LICENSE
github.com/mattn/go-isattyMIThttps://github.com/mattn/go-isatty/blob/master/LICENSE
github.com/mitchellh/consulstructureMIThttps://github.com/mitchellh/consulstructure/blob/master/LICENSE
github.com/mitchellh/copystructureMIThttps://github.com/mitchellh/copystructure/blob/master/LICENSE
github.com/mitchellh/mapstructureMIThttps://github.com/mitchellh/mapstructure/blob/master/LICENSE
github.com/mitchellh/reflectwalkMIThttps://github.com/mitchellh/reflectwalk/blob/master/LICENSE
github.com/OneOfOne/xxhashApache-2.0https://github.com/OneOfOne/xxhash/blob/master/LICENSE
github.com/pebbe/zmq4BSD-2-Clausehttps://github.com/pebbe/zmq4/blob/master/LICENSE.txt
github.com/pelletier/go-tomlApache-2.0https://github.com/pelletier/go-toml/blob/master/LICENSE
github.com/tarm/serialBSD-3-Clausehttps://github.com/tarm/serial/blob/master/LICENSE
github.com/x448/float16MIThttps://github.com/x448/float16/blob/master/LICENSE
golang.org/x/crypto/sha3BSD-3-Clausehttps://pkg.go.dev/golang.org/x/crypto/sha3?tab=licenses
golang.org/x/netBSD-3-Clausehttps://pkg.go.dev/golang.org/x/net?tab=licenses
golang.org/x/sysBSD-3-Clausehttps://pkg.go.dev/golang.org/x/sys?tab=licenses
golang.org/x/textBSD-3-Clausehttps://pkg.go.dev/golang.org/x/text?tab=licenses
gopkg.in/yaml.v3MIThttps://github.com/go-yaml/yaml/blob/v3/LICENSE

Image Application

The image application is linked with the following packages when compiled:

PackageLicense TypeLicense URL
bitbucket.org/bertimus9/systemstatMIThttps://bitbucket.org/bertimus9/systemstat/src/0eeff89b0690/LICENSE
github.com/armon/go-metricsMIThttps://github.com/armon/go-metrics/blob/f0300d1749da/LICENSE
github.com/cenkalti/backoffMIThttps://github.com/cenkalti/backoff/blob/v2.2.1/LICENSE
github.com/diegoholiveira/jsonlogicMIThttps://github.com/diegoholiveira/jsonlogic/blob/ab7989be08b9/LICENSE
github.com/eclipse/paho.mqtt.golangBSD-3-Clausehttps://github.com/eclipse/paho.mqtt.golang/blob/v1.3.5/LICENSE
github.com/edgexfoundry/app-functions-sdk-go/v2Apache-2.0https://github.com/edgexfoundry/app-functions-sdk-go/blob/v2.2.0/LICENSE
github.com/edgexfoundry/app-functions-sdk-go/v2/internal/etmMIThttps://github.com/edgexfoundry/app-functions-sdk-go/blob/v2.2.0/internal/etm/LICENSE
github.com/edgexfoundry/go-mod-bootstrap/v2Apache-2.0https://github.com/edgexfoundry/go-mod-bootstrap/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-configuration/v2Apache-2.0https://github.com/edgexfoundry/go-mod-configuration/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-core-contracts/v2Apache-2.0https://github.com/edgexfoundry/go-mod-core-contracts/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-messaging/v2Apache-2.0https://github.com/edgexfoundry/go-mod-messaging/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-registry/v2Apache-2.0https://github.com/edgexfoundry/go-mod-registry/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-secrets/v2Apache-2.0https://github.com/edgexfoundry/go-mod-secrets/blob/v2.2.0/LICENSE
github.com/fatih/colorMIThttps://github.com/fatih/color/blob/v1.9.0/LICENSE.md
github.com/fxamacker/cbor/v2MIThttps://github.com/fxamacker/cbor/blob/v2.4.0/LICENSE
github.com/go-kit/logMIThttps://github.com/go-kit/log/blob/v0.2.0/LICENSE
github.com/go-logfmt/logfmtMIThttps://github.com/go-logfmt/logfmt/blob/v0.5.1/LICENSE
github.com/go-playground/localesMIThttps://github.com/go-playground/locales/blob/v0.14.0/LICENSE
github.com/go-playground/universal-translatorMIThttps://github.com/go-playground/universal-translator/blob/v0.18.0/LICENSE
github.com/go-playground/validator/v10MIThttps://github.com/go-playground/validator/blob/v10.10.1/LICENSE
github.com/go-redis/redis/v7BSD-2-Clausehttps://github.com/go-redis/redis/blob/v7.3.0/LICENSE
github.com/golang/protobufBSD-3-Clausehttps://github.com/golang/protobuf/blob/v1.5.2/LICENSE
github.com/gomodule/redigo/redisApache-2.0https://github.com/gomodule/redigo/blob/v1.8.8/LICENSE
github.com/google/uuidBSD-3-Clausehttps://github.com/google/uuid/blob/v1.3.0/LICENSE
github.com/gorilla/muxBSD-3-Clausehttps://github.com/gorilla/mux/blob/v1.8.0/LICENSE
github.com/gorilla/websocketBSD-2-Clausehttps://github.com/gorilla/websocket/blob/v1.4.2/LICENSE
github.com/hashicorp/consul/apiMPL-2.0https://github.com/hashicorp/consul/blob/api/v1.9.1/api/LICENSE
github.com/hashicorp/errwrapMPL-2.0https://github.com/hashicorp/errwrap/blob/v1.0.0/LICENSE
github.com/hashicorp/go-cleanhttpMPL-2.0https://github.com/hashicorp/go-cleanhttp/blob/v0.5.1/LICENSE
github.com/hashicorp/go-hclogMIThttps://github.com/hashicorp/go-hclog/blob/v0.12.0/LICENSE
github.com/hashicorp/go-immutable-radixMPL-2.0https://github.com/hashicorp/go-immutable-radix/blob/v1.0.0/LICENSE
github.com/hashicorp/go-multierrorMPL-2.0https://github.com/hashicorp/go-multierror/blob/v1.1.1/LICENSE
github.com/hashicorp/go-rootcertsMPL-2.0https://github.com/hashicorp/go-rootcerts/blob/v1.0.2/LICENSE
github.com/hashicorp/golang-lru/simplelruMPL-2.0https://github.com/hashicorp/golang-lru/blob/v0.5.1/LICENSE
github.com/hashicorp/serf/coordinateMPL-2.0https://github.com/hashicorp/serf/blob/v0.9.5/LICENSE
github.com/leodido/go-urnMIThttps://github.com/leodido/go-urn/blob/v1.2.1/LICENSE
github.com/mattn/go-colorableMIThttps://github.com/mattn/go-colorable/blob/v0.1.6/LICENSE
github.com/mattn/go-isattyMIThttps://github.com/mattn/go-isatty/blob/v0.0.12/LICENSE
github.com/mitchellh/consulstructureMIThttps://github.com/mitchellh/consulstructure/blob/56fdc4d2da54/LICENSE
github.com/mitchellh/copystructureMIThttps://github.com/mitchellh/copystructure/blob/v1.0.0/LICENSE
github.com/mitchellh/mapstructureMIThttps://github.com/mitchellh/mapstructure/blob/v1.1.2/LICENSE
github.com/mitchellh/reflectwalkMIThttps://github.com/mitchellh/reflectwalk/blob/v1.0.0/LICENSE
github.com/pebbe/zmq4BSD-2-Clausehttps://github.com/pebbe/zmq4/blob/v1.2.7/LICENSE.txt
github.com/pelletier/go-tomlApache-2.0https://github.com/pelletier/go-toml/blob/v1.9.4/LICENSE
github.com/rcrowley/go-metricsBSD-2-Clause-FreeBSDhttps://github.com/rcrowley/go-metrics/blob/3113b8401b8a/LICENSE
github.com/spiffe/go-spiffe/v2Apache-2.0https://github.com/spiffe/go-spiffe/blob/v2.0.0/v2/LICENSE
github.com/x448/float16MIThttps://github.com/x448/float16/blob/v0.8.4/LICENSE
github.com/zeebo/errsMIThttps://github.com/zeebo/errs/blob/v1.2.2/LICENSE
gocv.io/x/gocvApache-2.0https://github.com/hybridgroup/gocv/blob/v0.31.0/LICENSE.txt
golang.org/x/cryptoBSD-3-Clausehttps://cs.opensource.google/go/x/crypto/+/v0.1.0:LICENSE
golang.org/x/netBSD-3-Clausehttps://cs.opensource.google/go/x/net/+/v0.1.0:LICENSE
golang.org/x/sys/unixBSD-3-Clausehttps://cs.opensource.google/go/x/sys/+/v0.1.0:LICENSE
golang.org/x/textBSD-3-Clausehttps://cs.opensource.google/go/x/text/+/v0.4.0:LICENSE
google.golang.org/genproto/googleapis/rpc/statusApache-2.0https://github.com/googleapis/go-genproto/blob/37a418bb8959/LICENSE
google.golang.org/grpcApache-2.0https://github.com/grpc/grpc-go/blob/v1.48.0/LICENSE
google.golang.org/protobufBSD-3-Clausehttps://github.com/protocolbuffers/protobuf-go/blob/v1.28.1/LICENSE
gopkg.in/square/go-jose.v2Apache-2.0https://github.com/square/go-jose/blob/v2.4.1/LICENSE
gopkg.in/square/go-jose.v2/jsonBSD-3-Clausehttps://github.com/square/go-jose/blob/v2.4.1/json/LICENSE

Camera Device Service

The camera device service is linked with the following packages when compiled:

PackageLicense TypeLicense URL
bitbucket.org/bertimus9/systemstatMIThttps://bitbucket.org/bertimus9/systemstat/src/v0.5.0/LICENSE
github.com/OneOfOne/xxhashApache-2.0https://github.com/OneOfOne/xxhash/blob/v1.2.8/LICENSE
github.com/armon/go-metricsMIThttps://github.com/armon/go-metrics/blob/f0300d1749da/LICENSE
github.com/cenkalti/backoffMIThttps://github.com/cenkalti/backoff/blob/v2.2.1/LICENSE
github.com/eclipse/paho.mqtt.golangEPL-2.0https://github.com/eclipse/paho.mqtt.golang/blob/v1.4.1/LICENSE
github.com/edgexfoundry/device-camera-goApache-2.0https://github.com/edgexfoundry/device-camera-go/blob/HEAD/LICENSE
github.com/edgexfoundry/device-sdk-go/v2Apache-2.0https://github.com/edgexfoundry/device-sdk-go/blob/v2.2.1-dev.10/LICENSE
github.com/edgexfoundry/go-mod-bootstrap/v2Apache-2.0https://github.com/edgexfoundry/go-mod-bootstrap/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-configuration/v2Apache-2.0https://github.com/edgexfoundry/go-mod-configuration/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-core-contracts/v2Apache-2.0https://github.com/edgexfoundry/go-mod-core-contracts/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-messaging/v2Apache-2.0https://github.com/edgexfoundry/go-mod-messaging/blob/v2.2.1-dev.5/LICENSE
github.com/edgexfoundry/go-mod-registry/v2Apache-2.0https://github.com/edgexfoundry/go-mod-registry/blob/v2.2.0/LICENSE
github.com/edgexfoundry/go-mod-secrets/v2Apache-2.0https://github.com/edgexfoundry/go-mod-secrets/blob/v2.2.0/LICENSE
github.com/faceterteam/onvif4goMIThttps://github.com/faceterteam/onvif4go/blob/v0.4.0/LICENSE
github.com/fatih/colorMIThttps://github.com/fatih/color/blob/v1.9.0/LICENSE.md
github.com/fxamacker/cbor/v2MIThttps://github.com/fxamacker/cbor/blob/v2.4.0/LICENSE
github.com/go-kit/logMIThttps://github.com/go-kit/log/blob/v0.2.0/LICENSE
github.com/go-logfmt/logfmtMIThttps://github.com/go-logfmt/logfmt/blob/v0.5.1/LICENSE
github.com/go-playground/localesMIThttps://github.com/go-playground/locales/blob/v0.14.0/LICENSE
github.com/go-playground/universal-translatorMIThttps://github.com/go-playground/universal-translator/blob/v0.18.0/LICENSE
github.com/go-playground/validator/v10MIThttps://github.com/go-playground/validator/blob/v10.10.1/LICENSE
github.com/go-redis/redis/v7BSD-2-Clausehttps://github.com/go-redis/redis/blob/v7.3.0/LICENSE
github.com/golang/protobufBSD-3-Clausehttps://github.com/golang/protobuf/blob/v1.5.2/LICENSE
github.com/google/uuidBSD-3-Clausehttps://github.com/google/uuid/blob/v1.3.0/LICENSE
github.com/gorilla/muxBSD-3-Clausehttps://github.com/gorilla/mux/blob/v1.8.0/LICENSE
github.com/gorilla/websocketBSD-2-Clausehttps://github.com/gorilla/websocket/blob/v1.4.2/LICENSE
github.com/hashicorp/consul/apiMPL-2.0https://github.com/hashicorp/consul/blob/api/v1.9.1/api/LICENSE
github.com/hashicorp/errwrapMPL-2.0https://github.com/hashicorp/errwrap/blob/v1.0.0/LICENSE
github.com/hashicorp/go-cleanhttpMPL-2.0https://github.com/hashicorp/go-cleanhttp/blob/v0.5.1/LICENSE
github.com/hashicorp/go-hclogMIThttps://github.com/hashicorp/go-hclog/blob/v0.12.0/LICENSE
github.com/hashicorp/go-immutable-radixMPL-2.0https://github.com/hashicorp/go-immutable-radix/blob/v1.0.0/LICENSE
github.com/hashicorp/go-multierrorMPL-2.0https://github.com/hashicorp/go-multierror/blob/v1.1.1/LICENSE
github.com/hashicorp/go-rootcertsMPL-2.0https://github.com/hashicorp/go-rootcerts/blob/v1.0.2/LICENSE
github.com/hashicorp/golang-lru/simplelruMPL-2.0https://github.com/hashicorp/golang-lru/blob/v0.5.0/LICENSE
github.com/hashicorp/serf/coordinateMPL-2.0https://github.com/hashicorp/serf/blob/v0.9.5/LICENSE
github.com/leodido/go-urnMIThttps://github.com/leodido/go-urn/blob/v1.2.1/LICENSE
github.com/mattn/go-colorableMIThttps://github.com/mattn/go-colorable/blob/v0.1.6/LICENSE
github.com/mattn/go-isattyMIThttps://github.com/mattn/go-isatty/blob/v0.0.12/LICENSE
github.com/mitchellh/consulstructureMIThttps://github.com/mitchellh/consulstructure/blob/56fdc4d2da54/LICENSE
github.com/mitchellh/copystructureMIThttps://github.com/mitchellh/copystructure/blob/v1.0.0/LICENSE
github.com/mitchellh/mapstructureMIThttps://github.com/mitchellh/mapstructure/blob/v1.1.2/LICENSE
github.com/mitchellh/reflectwalkMIThttps://github.com/mitchellh/reflectwalk/blob/v1.0.0/LICENSE
github.com/pebbe/zmq4BSD-2-Clausehttps://github.com/pebbe/zmq4/blob/v1.2.7/LICENSE.txt
github.com/pelletier/go-tomlApache-2.0https://github.com/pelletier/go-toml/blob/v1.9.5/LICENSE
github.com/rcrowley/go-metricsBSD-2-Clause-FreeBSDhttps://github.com/rcrowley/go-metrics/blob/3113b8401b8a/LICENSE
github.com/spiffe/go-spiffe/v2Apache-2.0https://github.com/spiffe/go-spiffe/blob/v2.0.0/v2/LICENSE
github.com/x448/float16MIThttps://github.com/x448/float16/blob/v0.8.4/LICENSE
github.com/zeebo/errsMIThttps://github.com/zeebo/errs/blob/v1.2.2/LICENSE
golang.org/x/cryptoBSD-3-Clausehttps://cs.opensource.google/go/x/crypto/+/e495a2d5:LICENSE
golang.org/x/netBSD-3-Clausehttps://cs.opensource.google/go/x/net/+/69e39bad:LICENSE
golang.org/x/sync/semaphoreBSD-3-Clausehttps://cs.opensource.google/go/x/sync/+/036812b2:LICENSE
golang.org/x/sysBSD-3-Clausehttps://cs.opensource.google/go/x/sys/+/3681064d:LICENSE
golang.org/x/textBSD-3-Clausehttps://cs.opensource.google/go/x/text/+/v0.3.7:LICENSE
google.golang.org/genproto/googleapis/rpc/statusApache-2.0https://github.com/googleapis/go-genproto/blob/3a66f561d7aa/LICENSE
google.golang.org/grpcApache-2.0https://github.com/grpc/grpc-go/blob/v1.42.0/LICENSE
google.golang.org/protobufBSD-3-Clausehttps://github.com/protocolbuffers/protobuf-go/blob/v1.27.1/LICENSE
gopkg.in/square/go-jose.v2Apache-2.0https://github.com/square/go-jose/blob/v2.4.1/LICENSE
gopkg.in/square/go-jose.v2/jsonBSD-3-Clausehttps://github.com/square/go-jose/blob/v2.4.1/json/LICENSE
gopkg.in/yaml.v3MIThttps://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE

References

...