diff --git a/.github/workflows/trivyimagescan.yaml b/.github/workflows/trivyimagescan.yaml
index 7a93cdc..044f869 100644
--- a/.github/workflows/trivyimagescan.yaml
+++ b/.github/workflows/trivyimagescan.yaml
@@ -35,7 +35,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/as-vending:dev'
+ image-ref: 'automated-vending/as-vending:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-as-vending.sarif'
@@ -64,7 +64,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/as-controller-board-status:dev'
+ image-ref: 'automated-vending/as-controller-board-status:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-as-controller-board-status.sarif'
@@ -93,7 +93,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/ds-card-reader:dev'
+ image-ref: 'automated-vending/ds-card-reader:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-ds-card-reader.sarif'
@@ -122,7 +122,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/ds-controller-board:dev'
+ image-ref: 'automated-vending/ds-controller-board:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-ds-controller-board.sarif'
@@ -151,7 +151,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/ms-authentication:dev'
+ image-ref: 'automated-vending/ms-authentication:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-ms-authentication.sarif'
@@ -180,7 +180,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/ms-inventory:dev'
+ image-ref: 'automated-vending/ms-inventory:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-ms-inventory.sarif'
@@ -209,7 +209,7 @@ jobs:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
with:
- image-ref: 'automated-checkout/ms-ledger:dev'
+ image-ref: 'automated-vending/ms-ledger:dev'
format: 'template'
template: '@/contrib/sarif.tpl'
output: 'trivy-results-ms-ledger.sarif'
diff --git a/LICENSE b/LICENSE
index 7c6d70c..9a3563f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/Makefile b/Makefile
index 13c8568..0cec633 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: clean \
@@ -37,24 +37,26 @@ run-portainer:
docker compose -f docker-compose.portainer.yml up -d
run:
- docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml up -d
+ docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml up -d
+
+run-edgex:
+ docker compose -f docker-compose.edgex.yml up -d
run-physical:
- docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml -f docker-compose.physical.card-reader.yml -f docker-compose.physical.controller-board.yml up -d
+ docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml -f docker-compose.physical.card-reader.yml -f docker-compose.physical.controller-board.yml up -d
run-physical-card-reader:
- docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml -f docker-compose.physical.card-reader.yml up -d
+ docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml -f docker-compose.physical.card-reader.yml up -d
run-physical-controller-board:
- docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml -f docker-compose.physical.controller-board.yml up -d
+ docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml -f docker-compose.physical.controller-board.yml up -d
down:
- -docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml stop -t 1
- -docker compose -f docker-compose.ac.yml -f docker-compose.edgex.yml down
+ -docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml stop -t 1
+ -docker compose -f docker-compose.av.yml -f docker-compose.edgex.yml down
clean: down docker-rm
- docker rmi -f $$(docker images | grep '' | awk '{print $$3}') && \
- docker rmi -f $$(docker images | grep automated-checkout | awk '{print $$3}') && \
+ docker rmi -f $$(docker images | grep 'automated-vending' | awk '{print $$3}') && \
docker volume prune -f && \
docker network prune -f
diff --git a/README.md b/README.md
index a73811c..f65baaf 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
-# Automated Checkout
+# Automated Vending
-For complete documentation on the Automated Checkout Reference Design, please visit **[this repository's GitHub Pages site](https://intel-retail.github.io/automated-vending/index.html)**.
+For complete documentation on the Automated Vending Reference Design, please visit **[this repository's GitHub Pages site](https://intel-retail.github.io/automated-vending/index.html)**.
diff --git a/as-controller-board-status/.golangci.yml b/as-controller-board-status/.golangci.yml
index 61af441..efc6e80 100644
--- a/as-controller-board-status/.golangci.yml
+++ b/as-controller-board-status/.golangci.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
run:
diff --git a/as-controller-board-status/Dockerfile b/as-controller-board-status/Dockerfile
index d4e0044..e2d44e2 100644
--- a/as-controller-board-status/Dockerfile
+++ b/as-controller-board-status/Dockerfile
@@ -1,14 +1,15 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-FROM golang:1.18-alpine3.16 AS builder
+FROM golang:1.20-alpine3.17 AS builder
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
# add git for go modules
-RUN apk update && apk add --no-cache make git gcc libc-dev zeromq-dev linux-headers
+# hadolint ignore=DL3018
+RUN apk update && apk add --no-cache make git
ENV GO111MODULE=on
WORKDIR /usr/local/bin/
@@ -28,13 +29,12 @@ COPY . .
RUN make gobuild
# Next image - Copy built Go binary into new workspace
-FROM alpine
+FROM alpine:3.17
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
-RUN apk --no-cache add zeromq
-COPY --from=builder /usr/local/bin/as-controller-board-status/res/configuration.toml /res/configuration.toml
+COPY --from=builder /usr/local/bin/as-controller-board-status/res/configuration.yaml /res/configuration.yaml
COPY --from=builder /usr/local/bin/as-controller-board-status/main /as-controller-board-status
CMD [ "/as-controller-board-status", "-cp=consul.http://edgex-core-consul:8500", "-r"]
diff --git a/as-controller-board-status/LICENSE b/as-controller-board-status/LICENSE
index 7bad583..4f84e34 100644
--- a/as-controller-board-status/LICENSE
+++ b/as-controller-board-status/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/as-controller-board-status/Makefile b/as-controller-board-status/Makefile
index 9215ffa..2531110 100644
--- a/as-controller-board-status/Makefile
+++ b/as-controller-board-status/Makefile
@@ -1,9 +1,9 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: build gobuild run gorun stop test lint
-MICROSERVICE=automated-checkout/as-controller-board-status
+MICROSERVICE=automated-vending/as-controller-board-status
ARCH=$(shell uname -m)
@@ -19,7 +19,7 @@ docker:
.
gobuild: tidy
- CGO_ENABLED=1 GOOS=linux go build -ldflags='-s -w' -a -installsuffix cgo main.go
+ CGO_ENABLED=0 GOOS=linux go build -ldflags='-s -w' -a main.go
run:
docker run \
@@ -34,10 +34,10 @@ stop:
docker rm -f $(MICROSERVICE):dev
test:
- go test -tags no_zmq -test.v -cover ./...
+ go test -test.v -cover ./...
testHTML:
- go test -tags no_zmq -test.v -coverprofile=test_coverage.out ./... && \
+ go test -test.v -coverprofile=test_coverage.out ./... && \
go tool cover -html=test_coverage.out
lint:
diff --git a/as-controller-board-status/config/configuration.go b/as-controller-board-status/config/configuration.go
index bf7e1fa..e0ad3ba 100644
--- a/as-controller-board-status/config/configuration.go
+++ b/as-controller-board-status/config/configuration.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package config
@@ -19,7 +19,8 @@ type ControllerBoardStatusConfig struct {
DeviceName string
MaxTemperatureThreshold float64
MinTemperatureThreshold float64
- DoorStatusCommandEndpoint string
+ InferenceDeviceName string
+ InferenceDoorStatusCmd string
NotificationCategory string
NotificationEmailAddresses string
NotificationLabels string
diff --git a/as-controller-board-status/functions/common.go b/as-controller-board-status/functions/common.go
index 965b3c1..439ec94 100644
--- a/as-controller-board-status/functions/common.go
+++ b/as-controller-board-status/functions/common.go
@@ -1,14 +1,13 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
import (
"bytes"
+ "encoding/json"
"fmt"
"net/http"
-
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
)
const (
@@ -22,13 +21,14 @@ const (
// and submit it as part of the outbound REST request.
func (boardStatus *CheckBoardStatus) RESTCommandJSON(restURL string, restMethod string, inputInterface interface{}) (err error) {
// Serialize the inputInterface
- inputInterfaceJSON, err := utilities.GetAsJSON(inputInterface)
+ inputInterfaceJSON, err := json.Marshal(inputInterface)
+
if err != nil {
return fmt.Errorf("failed to serialize the input interface as JSON: %v", err.Error())
}
// Build out the request
- req, err := http.NewRequest(restMethod, restURL, bytes.NewBuffer([]byte(inputInterfaceJSON)))
+ req, err := http.NewRequest(restMethod, restURL, bytes.NewBuffer(inputInterfaceJSON))
if err != nil {
return fmt.Errorf("failed to build the REST %v request for the URL %v due to error: %v", restMethod, restURL, err.Error())
}
diff --git a/as-controller-board-status/functions/common_test.go b/as-controller-board-status/functions/common_test.go
index cda5269..3bc7ad5 100644
--- a/as-controller-board-status/functions/common_test.go
+++ b/as-controller-board-status/functions/common_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -20,7 +20,6 @@ const (
DeviceName = "DeviceName"
MaxTemperatureThreshold = "MaxTemperatureThreshold"
MinTemperatureThreshold = "MinTemperatureThreshold"
- DoorStatusCommandEndpoint = "DoorStatusCommandEndpoint"
NotificationCategory = "NotificationCategory"
NotificationEmailAddresses = "NotificationEmailAddresses"
NotificationLabels = "NotificationLabels"
@@ -43,12 +42,13 @@ func GetCommonSuccessConfig() *config.ControllerBoardStatusConfig {
DeviceName: "controller-board",
MaxTemperatureThreshold: 83.0,
MinTemperatureThreshold: 10.0,
- DoorStatusCommandEndpoint: "http://localhost:48082/api/v2/device/name/Inference-device/vendingDoorStatus",
+ InferenceDeviceName: "Inference-device",
+ InferenceDoorStatusCmd: "inferenceDoorStatus",
NotificationCategory: "HW_HEALTH",
NotificationEmailAddresses: "test@site.com,test@site.com",
NotificationLabels: "HW_HEALTH",
NotificationReceiver: "System Administrator",
- NotificationSender: "Automated Checkout Maintenance Notification",
+ NotificationSender: "Automated Vending Maintenance Notification",
NotificationSeverity: "CRITICAL",
NotificationName: "maintenance-notification",
NotificationSubscriptionMaxRESTRetries: 10,
@@ -166,7 +166,7 @@ func prepRESTCommandJSONTest() ([]testTableRESTCommandJSONStruct, []*httptest.Se
"test": make(chan bool),
},
HTTPTestServer: testServerStatusOK,
- Output: fmt.Errorf("failed to serialize the input interface as JSON: Failed to marshal into JSON string: json: unsupported type: chan bool"),
+ Output: fmt.Errorf("failed to serialize the input interface as JSON: json: unsupported type: chan bool"),
})
output = append(output,
testTableRESTCommandJSONStruct{
diff --git a/as-controller-board-status/functions/models.go b/as-controller-board-status/functions/models.go
index eaea365..e571dbf 100644
--- a/as-controller-board-status/functions/models.go
+++ b/as-controller-board-status/functions/models.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -9,7 +9,7 @@ import (
"strings"
"time"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/interfaces"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/interfaces"
)
// ControllerBoardStatusAppSettings is a data structure that holds the
@@ -19,7 +19,6 @@ type ControllerBoardStatusAppSettings struct {
DeviceName string
MaxTemperatureThreshold float64
MinTemperatureThreshold float64
- DoorStatusCommandEndpoint string
NotificationCategory string
NotificationEmailAddresses []string
NotificationLabels []string
@@ -70,6 +69,7 @@ type CheckBoardStatus struct {
Configuration *config.ControllerBoardStatusConfig
SubscriptionClient interfaces.SubscriptionClient
NotificationClient interfaces.NotificationClient
+ CommandClient interfaces.CommandClient
ControllerBoardStatus *ControllerBoardStatus
averageTemperatureMeasurement time.Duration
notificationSubscriptionRESTRetryInterval time.Duration
@@ -79,15 +79,6 @@ type CheckBoardStatus struct {
notificationLabels []string
}
-// VendingDoorStatus is a string representation of a boolean whose state corresponds
-// to the whether the doorClosed state is true or false. This data is sent
-// to the MQTT device service for processing by the Automated Checkout inference
-// algorithm, which will act if the door state flips from open (false) to
-// closed (true).
-type VendingDoorStatus struct {
- VendingDoorStatus string `json:"inferenceDoorStatus"` // TODO: remove inference and rename to vendingDoorStatus
-}
-
func (checkBoardStatus *CheckBoardStatus) ParseStringConfigurations() error {
var err error
checkBoardStatus.notificationEmailAddresses = strings.Split(checkBoardStatus.Configuration.NotificationEmailAddresses, ",")
diff --git a/as-controller-board-status/functions/notify.go b/as-controller-board-status/functions/notify.go
index addba41..37c5d01 100644
--- a/as-controller-board-status/functions/notify.go
+++ b/as-controller-board-status/functions/notify.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -9,8 +9,8 @@ import (
"github.com/google/uuid"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/requests"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/requests"
)
// SubscribeToNotificationService configures an email notification and submits
diff --git a/as-controller-board-status/functions/notify_test.go b/as-controller-board-status/functions/notify_test.go
index 4b4010d..aaf0d66 100644
--- a/as-controller-board-status/functions/notify_test.go
+++ b/as-controller-board-status/functions/notify_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -10,8 +10,8 @@ import (
"net/http/httptest"
"testing"
- client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/interfaces/mocks"
- edgex_errors "github.com/edgexfoundry/go-mod-core-contracts/v2/errors"
+ client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/interfaces/mocks"
+ edgex_errors "github.com/edgexfoundry/go-mod-core-contracts/v3/errors"
assert "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
diff --git a/as-controller-board-status/functions/output.go b/as-controller-board-status/functions/output.go
index ad350b1..2a3068b 100644
--- a/as-controller-board-status/functions/output.go
+++ b/as-controller-board-status/functions/output.go
@@ -1,19 +1,21 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
import (
+ "context"
"encoding/json"
+ "errors"
"fmt"
"net/http"
"sort"
"strconv"
"time"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
)
const (
@@ -22,13 +24,14 @@ const (
// ControllerBoardDeviceServiceDeviceName is the name of the EdgeX device
// corresponding to our upstream event source.
ControllerBoardDeviceServiceDeviceName = "controller-board"
+ ControllerBoardResourceName = "controller-board-status"
)
// CheckControllerBoardStatus is an EdgeX function that is passed into the EdgeX SDK's function pipeline.
// It is a decision function that allows for multiple devices to have their events processed
// correctly by this application service. In this case, only one unique type of EdgeX device will come
// through to this function, but in general this is basically a template function that is also followed
-// in other services in the Automated Checkout project.
+// in other services in the Automated Vending project.
func (boardStatus *CheckBoardStatus) CheckControllerBoardStatus(ctx interfaces.AppFunctionContext, data interface{}) (bool, interface{}) {
if data == nil {
// We didn't receive a result
@@ -45,9 +48,13 @@ func (boardStatus *CheckBoardStatus) CheckControllerBoardStatus(ctx interfaces.A
if len(eventReading.Value) < 1 {
return false, fmt.Errorf("event reading was empty")
}
-
lc.Debugf("Received event reading value: %s", eventReading.Value)
+ if eventReading.ResourceName != ControllerBoardResourceName {
+ lc.Debugf("Non %s event: %s", ControllerBoardResourceName, eventReading.ResourceName)
+ continue
+ }
+
// Unmarshal the event reading data into the global controllerBoardStatus variable
err := json.Unmarshal([]byte(eventReading.Value), &boardStatus.ControllerBoardStatus)
if err != nil {
@@ -121,7 +128,7 @@ func getTempThresholdExceededMessage(minOrMax string, avgTemp float64, tempThres
if minOrMax != maximum && minOrMax != minimum {
return "", fmt.Errorf("Please specify minOrMax as \"%v\" or \"%v\", the value given was \"%v\"", maximum, minimum, minOrMax)
}
- resultMessage := fmt.Sprintf("The internal automated checkout's temperature is currently %.2f, and this temperature exceeds the configured %v temperature threshold of %v degrees. The automated checkout needs maintenance as of: %s", avgTemp, minOrMax, tempThreshold, time.Now().Format("_2 Jan, Mon | 3:04PM MST"))
+ resultMessage := fmt.Sprintf("The internal automated vending's temperature is currently %.2f, and this temperature exceeds the configured %v temperature threshold of %v degrees. The automated vending needs maintenance as of: %s", avgTemp, minOrMax, tempThreshold, time.Now().Format("_2 Jan, Mon | 3:04PM MST"))
return resultMessage, nil
}
@@ -227,8 +234,8 @@ func AvgTemp(measurements []TempMeasurement, duration time.Duration) (float64, i
}
// processVendingDoorState checks to see if the vending door state has changed
-// and if it has changed, it will then submit EdgeX commands (REST calls)
-// to the MQTT device service and the central vending state endpoint.
+// and if it has changed, it will then submit the new state to the central vending state endpoint
+// and to EdgeX via command client.
func (boardStatus *CheckBoardStatus) processVendingDoorState(lc logger.LoggingClient, doorClosed bool) error {
if boardStatus.DoorClosed != doorClosed {
// Set the boardStatus's DoorClosed value to the new value
@@ -246,14 +253,48 @@ func (boardStatus *CheckBoardStatus) processVendingDoorState(lc logger.LoggingCl
return fmt.Errorf("failed to submit the controller board's status to the central vending state service: %v", err.Error())
}
- // Prepare a message to be sent to the MQTT bus. Depending on the state
- // of the door, this message may trigger a CV inference
- err = boardStatus.RESTCommandJSON(boardStatus.Configuration.DoorStatusCommandEndpoint, http.MethodPut, VendingDoorStatus{
- VendingDoorStatus: strconv.FormatBool(doorClosed),
- })
+ // Prepare and send EdgeX command. Depending on the state of the door, this message may trigger a CV inference
+ settings := make(map[string]string)
+ settings["inferenceDoorStatus"] = strconv.FormatBool(doorClosed)
+ err = boardStatus.SendCommand(lc, http.MethodPut, boardStatus.Configuration.InferenceDeviceName, boardStatus.Configuration.InferenceDoorStatusCmd,
+ settings)
+ if err != nil {
+ return fmt.Errorf("failed to submit the vending door state to the command client: %v", err.Error())
+ }
+ }
+
+ return nil
+}
+
+// SendCommand issues CommandClient GET and SET command calls, CommandClient takes care of http calls,
+// here the requirement are actionName, deviceName, commandName and settings, logger client is needed for logging
+func (boardStatus *CheckBoardStatus) SendCommand(lc logger.LoggingClient, actionName string, deviceName string,
+ commandName string, settings map[string]string) error {
+ lc.Debug("Sending Command")
+
+ switch actionName {
+ case http.MethodPut:
+ lc.Debugf("executing %s action", actionName)
+ lc.Debugf("Issuing SET command '%s' for device '%s'", commandName, deviceName)
+
+ response, err := boardStatus.CommandClient.IssueSetCommandByName(context.Background(), deviceName, commandName, settings)
if err != nil {
- return fmt.Errorf("failed to submit the vending door state to the MQTT device service: %v", err.Error())
+ return fmt.Errorf("failed to issue '%s' set command to '%s' device: %s", commandName, deviceName, err.Error())
}
+
+ lc.Debugf("response status: %d", response.StatusCode)
+
+ case http.MethodGet:
+ lc.Debugf("executing %s action", actionName)
+ lc.Debugf("Issuing GET command '%s' for device '%s'", commandName, deviceName)
+ response, err := boardStatus.CommandClient.IssueGetCommandByName(context.Background(), deviceName, commandName, false, true)
+ if err != nil {
+ return fmt.Errorf("failed to issue '%s' get command to '%s' device: %s", commandName, deviceName, err.Error())
+ }
+ lc.Debugf("response status: %d", response.StatusCode)
+
+ default:
+ return errors.New("Invalid action requested: " + actionName)
}
return nil
diff --git a/as-controller-board-status/functions/output_test.go b/as-controller-board-status/functions/output_test.go
index 1ba0ca8..dd95ac7 100644
--- a/as-controller-board-status/functions/output_test.go
+++ b/as-controller-board-status/functions/output_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -6,16 +6,17 @@ package functions
import (
"as-controller-board-status/config"
"fmt"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/common"
"net/http"
"net/http/httptest"
"testing"
"time"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/interfaces/mocks"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/interfaces/mocks"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -29,12 +30,13 @@ func getCommonApplicationSettingsTyped() *config.ControllerBoardStatusConfig {
DeviceName: "controller-board",
MaxTemperatureThreshold: temp51,
MinTemperatureThreshold: temp49,
- DoorStatusCommandEndpoint: "http://localhost:48082/api/v2/device/name/Inference-device/vendingDoorStatus",
+ InferenceDeviceName: "Inference-device",
+ InferenceDoorStatusCmd: "inferenceDoorStatus",
NotificationCategory: "HW_HEALTH",
NotificationEmailAddresses: "test@site.com,test@site.com",
NotificationLabels: "HW_HEALTH",
NotificationReceiver: "System Administrator",
- NotificationSender: "Automated Checkout Maintenance Notification",
+ NotificationSender: "Automated Vending Maintenance Notification",
NotificationSeverity: "CRITICAL",
NotificationName: "maintenance-notification",
NotificationSubscriptionMaxRESTRetries: 10,
@@ -83,9 +85,12 @@ const (
// x failure to run ProcessApplicationSettings due to missing config option
// x failure to unmarshal ControllerBoardStatus from event reading
// x failure to call processTemperature, which can be created by sending a
-// status other than "Accepted" via the NotificationHost
+//
+// status other than "Accepted" via the NotificationHost
+//
// x failure to call processVendingDoorState, which can be created by
-// sending a status other than status OK to the DoorStatusCommandEndpoint
+//
+// sending a status other than status OK to the DoorStatusCommandEndpoint
//
// = 6 test cases total, 3 httptest servers
//
@@ -116,11 +121,22 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
mockNotificationClient := &client_mocks.NotificationClient{}
mockNotificationClient.On("SendNotification", mock.Anything, mock.Anything).Return(nil, nil)
+ resp := common.BaseResponse{
+ StatusCode: http.StatusOK,
+ }
+ mockCommandClient := &client_mocks.CommandClient{}
+ mockCommandClient.On("IssueSetCommandByName", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(resp, nil)
+
+ resp = common.BaseResponse{
+ StatusCode: http.StatusInternalServerError,
+ }
+ mockErrCommandClient := &client_mocks.CommandClient{}
+ mockErrCommandClient.On("IssueSetCommandByName", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(resp, nil)
+
// The success condition is ideal, and is configured to use URL's that all
// respond with responses that correspond to successful scenarios.
edgexcontextSuccess := pkg.NewAppFuncContextForTest(correlationID, lc)
configSuccess := getCommonApplicationSettingsTyped()
- configSuccess.DoorStatusCommandEndpoint = testServerStatusOK.URL
configSuccess.VendingEndpoint = testServerStatusOK.URL
configSuccess.MinTemperatureThreshold = temp51
configSuccess.MaxTemperatureThreshold = temp49
@@ -130,7 +146,6 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
// board state that has more measurements than the cutoff
edgexcontextSuccessMinThresholdExceeded := pkg.NewAppFuncContextForTest(correlationID, lc)
configSuccessMinThresholdExceeded := getCommonApplicationSettingsTyped()
- configSuccessMinThresholdExceeded.DoorStatusCommandEndpoint = testServerStatusOK.URL
configSuccessMinThresholdExceeded.VendingEndpoint = testServerStatusOK.URL
configSuccessMinThresholdExceeded.MinTemperatureThreshold = temp51
@@ -138,7 +153,6 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
// and make the VendingEndpoint throw an error.
edgexcontextBadVendingEndpointMaxThresholdExceeded := pkg.NewAppFuncContextForTest(correlationID, lc)
configBadVendingEndpointMaxThresholdExceeded := getCommonApplicationSettingsTyped()
- configBadVendingEndpointMaxThresholdExceeded.DoorStatusCommandEndpoint = testServerStatusOK.URL
configBadVendingEndpointMaxThresholdExceeded.VendingEndpoint = testServerThrowError.URL
configBadVendingEndpointMaxThresholdExceeded.MaxTemperatureThreshold = temp49
@@ -147,7 +161,6 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
// we want. We want Accepted, but we're going to get 500
edgexcontextUnacceptingNotificationHostMaxThresholdExceeded := pkg.NewAppFuncContextForTest(correlationID, lc)
configUnacceptingNotificationHostMaxThresholdExceeded := getCommonApplicationSettingsTyped()
- configUnacceptingNotificationHostMaxThresholdExceeded.DoorStatusCommandEndpoint = testServerStatusOK.URL
configUnacceptingNotificationHostMaxThresholdExceeded.VendingEndpoint = testServerStatusOK.URL
configUnacceptingNotificationHostMaxThresholdExceeded.MaxTemperatureThreshold = temp49
@@ -160,20 +173,16 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
configBadNotificationHostThresholdsExceeded.VendingEndpoint = testServerStatusOK.URL
configBadNotificationHostThresholdsExceeded.MaxTemperatureThreshold = temp49
- // Set bad MQTT and Vending endpoints to produce specific error conditions
- // in processTemperature, which first sends a request to MQTT, then
- // another request to the vending endpoint
- edgexcontextBadDoorStatusCommandEndpoint := pkg.NewAppFuncContextForTest(correlationID, lc)
- configBadDoorStatusCommandEndpoint := getCommonApplicationSettingsTyped()
- configBadDoorStatusCommandEndpoint.DoorStatusCommandEndpoint = testServerThrowError.URL
- configBadDoorStatusCommandEndpoint.VendingEndpoint = testServerStatusOK.URL
-
- // As described above, in order to produce the error condition for
- // processTemperature failing to hit the VendingEndpoint, we have to hit
- // the DoorStatusCommandEndpoint successfully first
+ // Setup for Device Command (mockErrCommandClient used in one of the below testcases) to throw error to produce specific error conditions
+ // in processTemperature, which sends a request to the vending endpoint
+ edgexcontextBadDoorStatusCommand := pkg.NewAppFuncContextForTest(correlationID, lc)
+ configBadDoorStatusCommand := getCommonApplicationSettingsTyped()
+ configBadDoorStatusCommand.VendingEndpoint = testServerStatusOK.URL
+
+ // Set the Vending endpoint to throw error for
+ // processTemperature failing to hit the VendingEndpoint
edgexcontextBadVendingEndpoint := pkg.NewAppFuncContextForTest(correlationID, lc)
configBadVendingEndpoint := getCommonApplicationSettingsTyped()
- configBadVendingEndpoint.DoorStatusCommandEndpoint = testServerStatusOK.URL
configBadVendingEndpoint.VendingEndpoint = testServerThrowError.URL
// The expected incoming event reading from the controller board device
@@ -188,7 +197,8 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
DeviceName: ControllerBoardDeviceServiceDeviceName,
Readings: []dtos.BaseReading{
{
- DeviceName: ControllerBoardDeviceServiceDeviceName,
+ ResourceName: ControllerBoardResourceName,
+ DeviceName: ControllerBoardDeviceServiceDeviceName,
SimpleReading: dtos.SimpleReading{
Value: controllerBoardStatusSuccessReadingValue,
},
@@ -202,7 +212,8 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
DeviceName: ControllerBoardDeviceServiceDeviceName,
Readings: []dtos.BaseReading{
{
- DeviceName: ControllerBoardDeviceServiceDeviceName,
+ ResourceName: ControllerBoardResourceName,
+ DeviceName: ControllerBoardDeviceServiceDeviceName,
SimpleReading: dtos.SimpleReading{
Value: `invalid json value`,
},
@@ -227,6 +238,7 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
LastNotified: time.Now().Add(time.Minute * -3),
Configuration: configSuccess,
NotificationClient: mockNotificationClient,
+ CommandClient: mockCommandClient,
},
OutputBool: true,
OutputInterface: controllerBoardStatusEventSuccess,
@@ -318,6 +330,7 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
LastNotified: time.Now().Add(time.Minute * -3),
Configuration: configBadNotificationHostThresholdsExceeded,
NotificationClient: mockNotificationClient,
+ CommandClient: mockCommandClient,
},
OutputBool: true,
OutputInterface: controllerBoardStatusEventSuccess,
@@ -327,17 +340,18 @@ func prepCheckControllerBoardStatusTest() (testTable []testTableCheckControllerB
ExpectedTemperatureMeasurementSliceLength: 1,
},
{
- TestCaseName: "Unsuccessful due to DoorStatusCommandEndpoint not responding with HTTP 200 OK, no temperature notification sent",
- InputEdgexContext: edgexcontextBadDoorStatusCommandEndpoint,
+ TestCaseName: "Unsuccessful due to Device Command not responding with HTTP 200 OK, no temperature notification sent",
+ InputEdgexContext: edgexcontextBadDoorStatusCommand,
InputData: controllerBoardStatusEventSuccess,
InputCheckBoardStatus: CheckBoardStatus{
LastNotified: time.Now().Add(time.Minute * -3),
- Configuration: configBadDoorStatusCommandEndpoint,
+ Configuration: configBadDoorStatusCommand,
NotificationClient: mockNotificationClient,
+ CommandClient: mockErrCommandClient,
},
OutputBool: true,
OutputInterface: controllerBoardStatusEventSuccess,
- OutputLogs: fmt.Sprintf("Encountered error while checking the open/closed state of the door: failed to submit the vending door state to the MQTT device service: Failed to submit REST PUT request due to error: %v \\\"%v\\\": %v", "Put", configBadDoorStatusCommandEndpoint.DoorStatusCommandEndpoint, "EOF"),
+ OutputLogs: fmt.Sprintf("Encountered error while checking the open/closed state of the door: failed to submit the vending door state to the device command: Failed to submit REST PUT request due to error: %v : %v", "Put", "EOF"),
ShouldLastNotifiedBeDifferent: false,
ExpectedTemperatureMeasurementSliceLength: 1,
},
diff --git a/as-controller-board-status/go.mod b/as-controller-board-status/go.mod
index f523b71..cbc46ac 100644
--- a/as-controller-board-status/go.mod
+++ b/as-controller-board-status/go.mod
@@ -1,74 +1,77 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
module as-controller-board-status
-go 1.18
+go 1.20
require (
- github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0
- github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0
+ github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1
+ github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0
github.com/google/uuid v1.3.0
- github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0
- github.com/stretchr/testify v1.8.0
+ github.com/stretchr/testify v1.8.4
)
require (
- bitbucket.org/bertimus9/systemstat v0.5.0 // indirect
- github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
+ github.com/Microsoft/go-winio v0.6.0 // indirect
+ github.com/armon/go-metrics v0.3.10 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9 // indirect
- github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect
- github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 // indirect
+ github.com/diegoholiveira/jsonlogic/v3 v3.2.7 // indirect
+ github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect
+ github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 // indirect
+ github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
- github.com/go-kit/log v0.2.0 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect
- github.com/go-playground/locales v0.14.0 // indirect
- github.com/go-playground/universal-translator v0.18.0 // indirect
- github.com/go-playground/validator/v10 v10.10.1 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.13.0 // indirect
github.com/go-redis/redis/v7 v7.3.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
- github.com/gomodule/redigo v1.8.8 // indirect
+ github.com/gomodule/redigo v1.8.9 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
- github.com/hashicorp/consul/api v1.9.1 // indirect
+ github.com/hashicorp/consul/api v1.20.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
- github.com/hashicorp/go-hclog v0.12.0 // indirect
- github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
+ github.com/hashicorp/go-hclog v0.14.1 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
- github.com/hashicorp/golang-lru v0.5.0 // indirect
- github.com/hashicorp/serf v0.9.5 // indirect
- github.com/leodido/go-urn v1.2.1 // indirect
- github.com/mattn/go-colorable v0.1.6 // indirect
- github.com/mattn/go-isatty v0.0.12 // indirect
+ github.com/hashicorp/golang-lru v0.5.4 // indirect
+ github.com/hashicorp/serf v0.10.1 // indirect
+ github.com/leodido/go-urn v1.2.3 // indirect
+ github.com/mattn/go-colorable v0.1.12 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 // indirect
- github.com/mitchellh/copystructure v1.0.0 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/mapstructure v1.1.2 // indirect
- github.com/mitchellh/reflectwalk v1.0.0 // indirect
- github.com/pebbe/zmq4 v1.2.7 // indirect
- github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
+ github.com/nats-io/nats.go v1.25.0 // indirect
+ github.com/nats-io/nkeys v0.4.4 // indirect
+ github.com/nats-io/nuid v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
- github.com/spiffe/go-spiffe/v2 v2.0.0 // indirect
- github.com/stretchr/objx v0.4.0 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.1.4 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- github.com/zeebo/errs v1.2.2 // indirect
- golang.org/x/crypto v0.1.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
+ github.com/zeebo/errs v1.3.0 // indirect
+ golang.org/x/crypto v0.14.0 // indirect
+ golang.org/x/mod v0.8.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sync v0.1.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
+ golang.org/x/tools v0.6.0 // indirect
+ google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
google.golang.org/grpc v1.53.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
- gopkg.in/square/go-jose.v2 v2.4.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/as-controller-board-status/go.sum b/as-controller-board-status/go.sum
index c365f4a..937e397 100644
--- a/as-controller-board-status/go.sum
+++ b/as-controller-board-status/go.sum
@@ -1,336 +1,334 @@
-bitbucket.org/bertimus9/systemstat v0.5.0 h1:n0aLnh2Jo4nBUBym9cE5PJDG8GT6g+4VuS2Ya2jYYpA=
-bitbucket.org/bertimus9/systemstat v0.5.0/go.mod h1:EkUWPp8lKFPMXP8vnbpT5JDI0W/sTiLZAvN8ONWErHY=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
+github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
+github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9 h1:NAHCNOHtaaYnBt6pGtdW++xkFHuAavi2G7Y1OFNu17E=
-github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9/go.mod h1:9STzWAIpeXT1gYFvw0JM+BkyMmPKYv/ztBNgXX4hAOw=
-github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y=
-github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc=
-github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0 h1:C6ev04yPwmGGfqCcE3mScI5eWc8udLOAIoecV2CV2Vg=
-github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0/go.mod h1:okglOXFO85xwM6bdwB6nMAigOB9wDc24MfcP0/UDYEU=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 h1:4UVNGRaKbkH5aEhQrto26Q65ydmhZYReRw/6ZNQ5J5E=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0/go.mod h1:JKRxVTC5g1IRoQuT6T7pW6O6XnfjQTZgFjEazPHAHng=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 h1:AZeaAPJM5X93ITFgwbwluYDtYEJ7tkCMSlj35GwfLLU=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0/go.mod h1:YP17JhMnXTitowXE13QJwFaKo0oc03iyoKLjWAYl4FE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0 h1:Sfi9jAIgRXZaJQw8Ji6+8//47D+iOyGiXQSNZXhy3HE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0/go.mod h1:jyfVSx7mI3u/o/oo10COxBRBvJ8O/9I3z2xAwPmNt/Q=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 h1:FdnA7hLq0U8PeMAIuJXt4KcXLAyGo7OjckzxTAwaoBc=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0/go.mod h1:+X6C0h8ZTJe+lLU2AGJfiAzCJK3zL+yM6cej9VC+79E=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 h1:dk9ul1t7INAiyZXeu/GrpinFE3qOekdy8uZOqEGgIiE=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0/go.mod h1:DUQRnAd5fVzoROc5SI+PTFUD/vCNeZmZHBMrLElbmwI=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 h1:Rqr1CgBXppAeehCkPAHQ6hjyLlm2KTR4IKiKpExm7gg=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0/go.mod h1:dQiOiga0KMGHXqFs4nI+Rp19hQR3gZ+3lDRgI9x5Q7M=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/diegoholiveira/jsonlogic/v3 v3.2.7 h1:awX07pFPnlntZzRNBcO4a2Ivxa77NMt+narq/6xcS0E=
+github.com/diegoholiveira/jsonlogic/v3 v3.2.7/go.mod h1:9oE8z9G+0OMxOoLHF3fhek3KuqD5CBqM0B6XFL08MSg=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1 h1:EclqSAArZtevlyyJu6TJXjWo6MS7OeQkdD/SOz11r+U=
+github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1/go.mod h1:sgH/44+BsOXtqFnot5bkbyJlJzISD9jiuudKxgnCgmg=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 h1:gXVxaZPcRJl2MhCIK/GOXZnQL+21xOUpGDTLTcVCxSk=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1/go.mod h1:Or09TpF5HF3FjlqX3kJEFhBCsTvbHY0Nu28UF0MvB3w=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 h1:rdk8KMcU8fA6o9MCb0O68bboxZTdLiXTZByNttEtRwE=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0/go.mod h1:8RlYm5CPzZgUsfXDWVP1TIeUMhsDNIdRdj1HXdomtOI=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0 h1:xjwCI34DLM31cSl1q9XmYgXS3JqXufQJMgohnLLLDx0=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0/go.mod h1:zzzWGWij6wAqm1go9TLs++TFMIsBqBb1eRnIj4mRxGw=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 h1:nU37Uo4/kloTMrdqDN9SJuDoXb3FpHaMdwVbHtn9PPk=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0/go.mod h1:x2CueD9gn/CmtCvDNFgrgBnR+B1iWJMSrC5+gesfDJ0=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 h1:6LXGElSScCCQzNpR3WjcgVz0RUc9GbfxETvif/4++iI=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0/go.mod h1:SGyo4fAHzOhDAd2Usa9RaBT/sOzkbceIqLrDG0+iYy8=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 h1:XyoDjeeVBMNwlJb6ljcTOl1QOp5gabcJc7pYSPYKNPA=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1/go.mod h1:Ts9l+TknRKaqFsXmrTuKyV1Y5qIr+eiexVYkQuXnfxk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
-github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
+github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
-github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
-github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
-github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
-github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
-github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ=
+github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4=
github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/gomodule/redigo v1.8.8 h1:f6cXq6RRfiyrOJEV7p3JhLDlmawGBVBBP1MggY8Mo4E=
-github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/hashicorp/consul/api v1.9.1 h1:SngrdG2L62qqLsUz85qcPhFZ78rPf8tcD5qjMgs6MME=
-github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
+github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=
+github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=
+github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=
-github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
+github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU=
+github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE=
+github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
-github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g=
-github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM=
-github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
+github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
+github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=
+github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
+github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
+github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0 h1:t7sYxdPJZ2wjZgFpD+B+rx1Jk//5hkiEDW2ptwjhXAc=
-github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0/go.mod h1:ov2jYqRbWFWuzgUGt6+LMiE+SBkUpI+qzgIWCipFlCo=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA=
+github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
+github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 h1:DcITQwl3ymmg7i1XfwpZFs/TPv2PuTwxE8bnuKVtKlk=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54/go.mod h1:dIfpPVUR+ZfkzkDcKnn+oPW1jKeXe4WlNWc7rIXOVxM=
-github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4=
+github.com/nats-io/nats-server/v2 v2.9.16 h1:SuNe6AyCcVy0g5326wtyU8TdqYmcPqzTjhkHojAjprc=
+github.com/nats-io/nats.go v1.25.0 h1:t5/wCPGciR7X3Mu8QOi4jiJaXaWM8qtkLu4lzGZvYHE=
+github.com/nats-io/nats.go v1.25.0/go.mod h1:D2WALIhz7V8M0pH8Scx8JZXlg6Oqz5VG+nQkK8nJdvg=
+github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA=
+github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pebbe/zmq4 v1.2.7 h1:6EaX83hdFSRUEhgzSW1E/SPoTS3JeYZgYkBvwdcrA9A=
-github.com/pebbe/zmq4 v1.2.7/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
-github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/spiffe/go-spiffe/v2 v2.0.0 h1:y6N7BZAxgaFZYELyrIdxSMm2e2tWpzgQewUts9h1hfM=
-github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/spiffe/go-spiffe/v2 v2.1.4 h1:Z31Ycaf2Z5DF38sQGmp+iGKjBhBlSzfAq68bfy67Mxw=
+github.com/spiffe/go-spiffe/v2 v2.1.4/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g=
-github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
+github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y=
-gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/as-controller-board-status/main.go b/as-controller-board-status/main.go
index 21dec30..b06dddb 100644
--- a/as-controller-board-status/main.go
+++ b/as-controller-board-status/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package main
@@ -9,10 +9,10 @@ import (
"as-controller-board-status/routes"
"os"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/transforms"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/transforms"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
const (
@@ -91,8 +91,14 @@ func (app *boardStatusAppService) CreateAndRunAppService(serviceKey string, newS
app.boardStatus.MaxTemperatureThreshold = app.boardStatus.Configuration.MaxTemperatureThreshold
app.boardStatus.MinTemperatureThreshold = app.boardStatus.Configuration.MinTemperatureThreshold
+ app.boardStatus.CommandClient = app.service.CommandClient()
+ if app.boardStatus.CommandClient == nil {
+ app.lc.Error("error command service missing from client's configuration")
+ return 1
+ }
+
// Create the function pipeline to run when an event is read on the device channels
- err = app.service.SetFunctionsPipeline(
+ err = app.service.SetDefaultFunctionsPipeline(
transforms.NewFilterFor([]string{app.boardStatus.Configuration.DeviceName}).FilterByDeviceName,
app.boardStatus.CheckControllerBoardStatus,
)
@@ -110,9 +116,9 @@ func (app *boardStatusAppService) CreateAndRunAppService(serviceKey string, newS
}
// Tell the SDK to "start" and begin listening for events to trigger the pipeline
- err = app.service.MakeItRun()
+ err = app.service.Run()
if err != nil {
- app.lc.Errorf("MakeItRun returned error: %s", err.Error())
+ app.lc.Errorf("Run returned error: %s", err.Error())
return 1
}
diff --git a/as-controller-board-status/res/configuration.toml b/as-controller-board-status/res/configuration.toml
deleted file mode 100644
index e0267bd..0000000
--- a/as-controller-board-status/res/configuration.toml
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-[Writable]
-LogLevel = 'INFO'
- [Writable.InsecureSecrets]
- [Writable.InsecureSecrets.DB]
- path = "redisdb"
- [Writable.InsecureSecrets.DB.Secrets]
- username = ""
- password = ""
-
-
-[Service]
-HealthCheckInterval = '10s'
-Host = 'localhost'
-Port = 48094
-ReadMaxLimit = 100
-StartupMsg = 'This EdgeX application service reads events from a controller board device service and propagates the information from the controller board to other services and API endpoints'
-RequestTimeout = '30s'
-MaxRequestSize = 0
-ServerBindAddr = ""
-MaxResultCount = 0
-
-[Registry]
-Host = 'localhost'
-Port = 8500
-Type = 'consul'
-
-[Trigger]
-Type="edgex-messagebus"
- [Trigger.EdgexMessageBus]
- Type = "mqtt"
- [Trigger.EdgexMessageBus.SubscribeHost]
- Host = "localhost"
- Port = 1883
- Protocol = "tcp"
- SubscribeTopics="edgex/events/#"
- [Trigger.EdgexMessageBus.Optional]
- authmode = "none"
- ClientId ="as-controller-board-status"
- Qos = "0" # Quality of Sevice values are 0 (At most once), 1 (At least once) or 2 (Exactly once)
- KeepAlive = "10" # Seconds (must be 2 or greater)
- Retained = "false"
- AutoReconnect = "true"
- ConnectTimeout = "5" # Seconds
- SkipCertVerify = "false"
-
-[Clients]
- # Used for version check on start-up
- # Also used for DeviceService, DeviceProfile and Device clients
- [Clients.core-metadata]
- Protocol = "http"
- Host = "localhost"
- Port = 59881
-
- # Used for Notification and Subscription clients
- [Clients.support-notifications]
- Protocol = "http"
- Host = "localhost"
- Port = 59860
-
-[ControllerBoardStatus]
- AverageTemperatureMeasurementDuration = "-15s"
- DeviceName = "controller-board"
- MaxTemperatureThreshold = 83.0
- MinTemperatureThreshold = 10.0
- DoorStatusCommandEndpoint = "http://localhost:59882/api/v2/device/name/Inference-device/inferenceDoorStatus"
- NotificationCategory = "HW_HEALTH"
- NotificationEmailAddresses = "your-email@site.com"
- NotificationLabels = "HW_HEALTH"
- NotificationReceiver = "SystemAdministrator"
- NotificationSender = "AutomatedCheckoutMaintenanceNotification"
- NotificationSeverity = "CRITICAL"
- NotificationName = "maintenance-notification"
- NotificationSubscriptionMaxRESTRetries = 10
- NotificationSubscriptionRESTRetryIntervalDuration = "10s"
- NotificationThrottleDuration = "1m"
- SubscriptionAdminState = "UNLOCKED"
- RESTCommandTimeoutDuration = "15s"
- VendingEndpoint = "http://localhost:59860/boardStatus"
diff --git a/as-controller-board-status/res/configuration.yaml b/as-controller-board-status/res/configuration.yaml
new file mode 100644
index 0000000..2a15144
--- /dev/null
+++ b/as-controller-board-status/res/configuration.yaml
@@ -0,0 +1,46 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+Writable:
+ LogLevel: INFO
+
+Service:
+ Host: localhost
+ Port: 48094
+ StartupMsg: This EdgeX application service reads events from a controller board device service and propagates the information from the controller board to other services and API endpoints
+
+Clients:
+ support-notifications:
+ Protocol: http
+ Host: localhost
+ Port: 59860
+
+ core-command:
+ Protocol: "http"
+ Host: "localhost"
+ Port: 59882
+
+MessageBus:
+ Optional:
+ ClientId: as-controller-board-status
+
+ControllerBoardStatus:
+ AverageTemperatureMeasurementDuration: -15s
+ DeviceName: controller-board
+ MaxTemperatureThreshold: 83.0
+ MinTemperatureThreshold: 10.0
+ InferenceDeviceName: "Inference-device"
+ InferenceDoorStatusCmd: "inferenceDoorStatus"
+ NotificationCategory: HW_HEALTH
+ NotificationEmailAddresses: your-email@site.com
+ NotificationLabels: HW_HEALTH
+ NotificationReceiver: SystemAdministrator
+ NotificationSender: AutomatedVendingMaintenanceNotification
+ NotificationSeverity: CRITICAL
+ NotificationName: maintenance-notification
+ NotificationSubscriptionMaxRESTRetries: 10
+ NotificationSubscriptionRESTRetryIntervalDuration: 10s
+ NotificationThrottleDuration: 1m
+ SubscriptionAdminState: UNLOCKED
+ RESTCommandTimeoutDuration: 15s
+ VendingEndpoint: http://localhost:59860/boardStatus
diff --git a/as-controller-board-status/routes/controller.go b/as-controller-board-status/routes/controller.go
index 4c87960..b4b788f 100644
--- a/as-controller-board-status/routes/controller.go
+++ b/as-controller-board-status/routes/controller.go
@@ -1,17 +1,17 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package routes
import (
+ "encoding/json"
"fmt"
"net/http"
"as-controller-board-status/functions"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
type Controller struct {
@@ -38,16 +38,17 @@ func (c *Controller) AddAllRoutes() error {
}
// GetStatus is a REST API endpoint that enables a web UI or some other downstream
-// service to inquire about the status of the upstream Automated Checkout hardware interface(s).
+// service to inquire about the status of the upstream Automated Vending hardware interface(s).
func (c *Controller) GetStatus(writer http.ResponseWriter, req *http.Request) {
- controllerBoardStatusJSON, err := utilities.GetAsJSON(c.boardStatus.ControllerBoardStatus)
+ controllerBoardStatus, err := json.Marshal(c.boardStatus.ControllerBoardStatus)
if err != nil {
- errMsg := "Failed to serialize the controller board's current state"
- utilities.WriteStringHTTPResponse(writer, req, http.StatusInternalServerError, errMsg, true)
- c.lc.Errorf("%s: %s", errMsg, err.Error())
+ errMsg := fmt.Sprintf("Failed to serialize the controller board's current state: %s", err.Error())
+ c.lc.Error(errMsg)
+
+ writer.WriteHeader(http.StatusInternalServerError)
+ writer.Write([]byte(errMsg))
return
}
-
- utilities.WriteJSONHTTPResponse(writer, req, http.StatusOK, controllerBoardStatusJSON, false)
c.lc.Info("GetStatus successfully!")
+ writer.Write(controllerBoardStatus)
}
diff --git a/as-controller-board-status/routes/controller_test.go b/as-controller-board-status/routes/controller_test.go
index ee41054..18a3d3f 100644
--- a/as-controller-board-status/routes/controller_test.go
+++ b/as-controller-board-status/routes/controller_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package routes
@@ -8,15 +8,14 @@ import (
"as-controller-board-status/functions"
"encoding/json"
"fmt"
- "io/ioutil"
+ "io"
"net/http"
"net/http/httptest"
"testing"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces/mocks"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces/mocks"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -110,9 +109,9 @@ func TestController_GetStatus(t *testing.T) {
resp := w.Result()
defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
+ body, err := io.ReadAll(resp.Body)
assert.NoError(t, err)
- responseContent := utilities.HTTPResponse{}
+ var responseContent functions.ControllerBoardStatus
err = json.Unmarshal(body, &responseContent)
assert.NoError(t, err)
diff --git a/as-vending/.golangci.yml b/as-vending/.golangci.yml
index b6f67b3..40eb688 100644
--- a/as-vending/.golangci.yml
+++ b/as-vending/.golangci.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
run:
# timeout for analysis, e.g. 30s, 5m, default is 1m
diff --git a/as-vending/Dockerfile b/as-vending/Dockerfile
index 5c730cf..ba4feb9 100644
--- a/as-vending/Dockerfile
+++ b/as-vending/Dockerfile
@@ -1,14 +1,15 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-FROM golang:1.18-alpine3.16 AS builder
+FROM golang:1.20-alpine3.17 AS builder
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
# add git for go modules
-RUN apk update && apk add --no-cache make git gcc libc-dev zeromq-dev linux-headers
+# hadolint ignore=DL3018
+RUN apk update && apk add --no-cache make git
ENV GO111MODULE=on
WORKDIR /usr/local/bin/
@@ -28,13 +29,12 @@ COPY . .
RUN make gobuild
# Next image - Copy built Go binary into new workspace
-FROM alpine
+FROM alpine:3.17
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
-RUN apk --no-cache add zeromq
-COPY --from=builder /usr/local/bin/as-vending/res/configuration.toml /res/configuration.toml
+COPY --from=builder /usr/local/bin/as-vending/res/configuration.yaml /res/configuration.yaml
COPY --from=builder /usr/local/bin/as-vending/main /as-vending
CMD [ "/as-vending", "-cp=consul.http://edgex-core-consul:8500", "-r"]
diff --git a/as-vending/LICENSE b/as-vending/LICENSE
index 7c1aef1..df5d5be 100644
--- a/as-vending/LICENSE
+++ b/as-vending/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/as-vending/Makefile b/as-vending/Makefile
index 1dd58e3..2753296 100644
--- a/as-vending/Makefile
+++ b/as-vending/Makefile
@@ -1,9 +1,9 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: build gobuild run gorun stop test lint
-MICROSERVICE=automated-checkout/as-vending
+MICROSERVICE=automated-vending/as-vending
ARCH=$(shell uname -m)
@@ -19,7 +19,7 @@ docker:
.
gobuild: tidy
- CGO_ENABLED=1 GOOS=linux go build -ldflags='-s -w' -a -installsuffix cgo main.go
+ CGO_ENABLED=0 GOOS=linux go build -ldflags='-s -w' -a main.go
run:
docker run \
@@ -34,10 +34,10 @@ stop:
docker rm -f $(MICROSERVICE):latest
test:
- go test -tags no_zmq -test.v -cover -count=1 ./...
+ go test -test.v -cover -count=1 ./...
testHTML:
- go test -tags no_zmq -test.v -coverprofile=test_coverage.out ./... && \
+ go test -test.v -coverprofile=test_coverage.out ./... && \
go tool cover -html=test_coverage.out
lint:
diff --git a/as-vending/config/configuration.go b/as-vending/config/configuration.go
index 57f3436..05813db 100644
--- a/as-vending/config/configuration.go
+++ b/as-vending/config/configuration.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package config
diff --git a/as-vending/functions/models.go b/as-vending/functions/models.go
index 3e079ee..9ee7120 100644
--- a/as-vending/functions/models.go
+++ b/as-vending/functions/models.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -8,7 +8,7 @@ import (
"fmt"
"time"
- clientInterfaces "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/interfaces"
+ clientInterfaces "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/interfaces"
)
// VendingState is a representation of the entire state of vending workflow.
diff --git a/as-vending/functions/output.go b/as-vending/functions/output.go
index 4ed512c..dc8f782 100644
--- a/as-vending/functions/output.go
+++ b/as-vending/functions/output.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
@@ -9,14 +9,14 @@ import (
"encoding/json"
"errors"
"fmt"
+ "io"
"net/http"
"strconv"
"time"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
)
const (
@@ -110,16 +110,18 @@ func (vendingState *VendingState) HandleMqttDeviceReading(lc logger.LoggingClien
return false, err
}
- defer resp.Body.Close()
-
lc.Info("Successfully updated the user's ledger")
var currentLedger Ledger
- _, err = utilities.ParseJSONHTTPResponseContent(resp.Body, ¤tLedger)
+ defer resp.Body.Close()
+ body, err := io.ReadAll(resp.Body)
if err != nil {
- return false, fmt.Errorf("Unable to unmarshal ledger response")
+ return false, fmt.Errorf("Failed to read response body: %s", err.Error())
+ }
+ err = json.Unmarshal(body, ¤tLedger)
+ if err != nil {
+ return false, fmt.Errorf("Failed to unmarshal Ledger from response body: %s", err.Error())
}
-
// Display Ledger Total on LCD
if displayErr := vendingState.displayLedger(lc, vendingState.Configuration.ControllerBoardDeviceName, currentLedger); displayErr != nil {
return false, displayErr
@@ -374,12 +376,16 @@ func (vendingState *VendingState) getCardAuthInfo(lc logger.LoggingClient, authE
return
}
- defer resp.Body.Close()
-
var auth OutputData
- _, err = utilities.ParseJSONHTTPResponseContent(resp.Body, &auth)
+ defer resp.Body.Close()
+ body, err := io.ReadAll(resp.Body)
+ if err != nil {
+ lc.Errorf("Failed to read response body from Authentication for card ID %s: %s", cardID, err.Error())
+ return
+ }
+ err = json.Unmarshal(body, &auth)
if err != nil {
- lc.Errorf("Could not read response body from AuthenticationEndpoint: %v", err)
+ lc.Errorf("Could not unmarshal from AuthenticationEndpoint for card ID %s: %s", cardID, err.Error())
return
}
@@ -440,24 +446,24 @@ func (vendingState *VendingState) SendCommand(lc logger.LoggingClient, actionNam
switch actionName {
case http.MethodPut:
- lc.Infof("executing %s action", actionName)
- lc.Infof("Issuing SET command '%s' for device '%s'", commandName, deviceName)
+ lc.Debugf("executing %s action", actionName)
+ lc.Debugf("Issuing SET command '%s' for device '%s'", commandName, deviceName)
response, err := vendingState.CommandClient.IssueSetCommandByName(context.Background(), deviceName, commandName, settings)
if err != nil {
return fmt.Errorf("failed to issue '%s' set command to '%s' device: %s", commandName, deviceName, err.Error())
}
- lc.Infof("response status: %d", response.StatusCode)
+ lc.Debugf("response status: %d", response.StatusCode)
case http.MethodGet:
- lc.Infof("executing %s action", actionName)
- lc.Infof("Issuing GET command '%s' for device '%s'", commandName, deviceName)
- response, err := vendingState.CommandClient.IssueGetCommandByName(context.Background(), deviceName, commandName, "no", "yes")
+ lc.Debugf("executing %s action", actionName)
+ lc.Debugf("Issuing GET command '%s' for device '%s'", commandName, deviceName)
+ response, err := vendingState.CommandClient.IssueGetCommandByName(context.Background(), deviceName, commandName, false, true)
if err != nil {
return fmt.Errorf("failed to issue '%s' get command to '%s' device: %s", commandName, deviceName, err.Error())
}
- lc.Infof("response status: %d", response.StatusCode)
+ lc.Debugf("response status: %d", response.StatusCode)
default:
return errors.New("Invalid action requested: " + actionName)
diff --git a/as-vending/functions/output_test.go b/as-vending/functions/output_test.go
index 22918ee..061c1c8 100644
--- a/as-vending/functions/output_test.go
+++ b/as-vending/functions/output_test.go
@@ -1,25 +1,25 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package functions
import (
"as-vending/config"
+ "encoding/json"
"errors"
"fmt"
+ "github.com/stretchr/testify/require"
"net/http"
"net/http/httptest"
"os"
"testing"
- client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/interfaces/mocks"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/common"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos/responses"
- edgexError "github.com/edgexfoundry/go-mod-core-contracts/v2/errors"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
-
+ client_mocks "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/interfaces/mocks"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/common"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos/responses"
+ edgexError "github.com/edgexfoundry/go-mod-core-contracts/v3/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
@@ -86,8 +86,12 @@ func TestGetCardAuthInfo(t *testing.T) {
output := OutputData{
CardID: tc.cardID,
}
- authDataJSON, _ := utilities.GetAsJSON(output)
- utilities.WriteJSONHTTPResponse(w, r, tc.statusCode, authDataJSON, false)
+
+ authDataJSON, err := json.Marshal(output)
+ require.NoError(t, err)
+
+ w.WriteHeader(tc.statusCode)
+ w.Write(authDataJSON)
}))
defer testServer.Close()
@@ -176,23 +180,17 @@ func TestHandleMqttDeviceReading(t *testing.T) {
LineTotal: 20.5,
}
- outputJSON, _ := utilities.GetAsJSON(output)
+ outputJSON, err := json.Marshal(output)
+ require.NoError(t, err)
- writeError := false
writeContentType := "json"
if tc.Expected != nil {
- writeError = true
writeContentType = "string"
}
- httpResponse := utilities.HTTPResponse{
- Content: outputJSON,
- ContentType: writeContentType,
- StatusCode: tc.statusCode,
- Error: writeError,
- }
-
- httpResponse.WriteHTTPResponse(w, r)
+ w.WriteHeader(tc.statusCode)
+ w.Header().Set("Content-Type", writeContentType)
+ w.Write(outputJSON)
}))
// VendingState initialization
@@ -290,8 +288,10 @@ func TestVerifyDoorAccess(t *testing.T) {
output := OutputData{
RoleID: tc.RoleID,
}
- authDataJSON, _ := utilities.GetAsJSON(output)
- utilities.WriteJSONHTTPResponse(w, r, http.StatusOK, authDataJSON, false)
+
+ authDataJSON, err := json.Marshal(output)
+ require.NoError(t, err)
+ w.Write(authDataJSON)
}))
vendingState := VendingState{
diff --git a/as-vending/go.mod b/as-vending/go.mod
index 1be190a..2164b87 100644
--- a/as-vending/go.mod
+++ b/as-vending/go.mod
@@ -1,74 +1,77 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
module as-vending
-go 1.18
+go 1.20
require (
- github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0
- github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0
- github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0
- github.com/stretchr/testify v1.8.0
+ github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1
+ github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0
+ github.com/stretchr/testify v1.8.4
)
require (
- bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690 // indirect
- github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
+ github.com/Microsoft/go-winio v0.6.0 // indirect
+ github.com/armon/go-metrics v0.3.10 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9 // indirect
- github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect
- github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 // indirect
+ github.com/diegoholiveira/jsonlogic/v3 v3.2.7 // indirect
+ github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect
+ github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 // indirect
+ github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
- github.com/go-kit/log v0.2.0 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect
- github.com/go-playground/locales v0.14.0 // indirect
- github.com/go-playground/universal-translator v0.18.0 // indirect
- github.com/go-playground/validator/v10 v10.10.1 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.13.0 // indirect
github.com/go-redis/redis/v7 v7.3.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
- github.com/gomodule/redigo v1.8.8 // indirect
+ github.com/gomodule/redigo v1.8.9 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
- github.com/hashicorp/consul/api v1.9.1 // indirect
+ github.com/hashicorp/consul/api v1.20.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
- github.com/hashicorp/go-hclog v0.12.0 // indirect
- github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
+ github.com/hashicorp/go-hclog v0.14.1 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
- github.com/hashicorp/golang-lru v0.5.0 // indirect
- github.com/hashicorp/serf v0.9.5 // indirect
- github.com/leodido/go-urn v1.2.1 // indirect
- github.com/mattn/go-colorable v0.1.6 // indirect
- github.com/mattn/go-isatty v0.0.12 // indirect
+ github.com/hashicorp/golang-lru v0.5.4 // indirect
+ github.com/hashicorp/serf v0.10.1 // indirect
+ github.com/leodido/go-urn v1.2.3 // indirect
+ github.com/mattn/go-colorable v0.1.12 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 // indirect
- github.com/mitchellh/copystructure v1.0.0 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/mapstructure v1.1.2 // indirect
- github.com/mitchellh/reflectwalk v1.0.0 // indirect
- github.com/pebbe/zmq4 v1.2.7 // indirect
- github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
+ github.com/nats-io/nats.go v1.25.0 // indirect
+ github.com/nats-io/nkeys v0.4.4 // indirect
+ github.com/nats-io/nuid v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
- github.com/spiffe/go-spiffe/v2 v2.0.0 // indirect
- github.com/stretchr/objx v0.4.0 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.1.4 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- github.com/zeebo/errs v1.2.2 // indirect
- golang.org/x/crypto v0.1.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
+ github.com/zeebo/errs v1.3.0 // indirect
+ golang.org/x/crypto v0.14.0 // indirect
+ golang.org/x/mod v0.8.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sync v0.1.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
+ golang.org/x/tools v0.6.0 // indirect
+ google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
google.golang.org/grpc v1.53.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
- gopkg.in/square/go-jose.v2 v2.4.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/as-vending/go.sum b/as-vending/go.sum
index 2521773..937e397 100644
--- a/as-vending/go.sum
+++ b/as-vending/go.sum
@@ -1,336 +1,334 @@
-bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690 h1:N9r8OBSXAgEUfho3SQtZLY8zo6E1OdOMvelvP22aVFc=
-bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
+github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
+github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9 h1:NAHCNOHtaaYnBt6pGtdW++xkFHuAavi2G7Y1OFNu17E=
-github.com/diegoholiveira/jsonlogic v1.0.1-0.20200220175622-ab7989be08b9/go.mod h1:9STzWAIpeXT1gYFvw0JM+BkyMmPKYv/ztBNgXX4hAOw=
-github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y=
-github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc=
-github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0 h1:C6ev04yPwmGGfqCcE3mScI5eWc8udLOAIoecV2CV2Vg=
-github.com/edgexfoundry/app-functions-sdk-go/v2 v2.2.0/go.mod h1:okglOXFO85xwM6bdwB6nMAigOB9wDc24MfcP0/UDYEU=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 h1:4UVNGRaKbkH5aEhQrto26Q65ydmhZYReRw/6ZNQ5J5E=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0/go.mod h1:JKRxVTC5g1IRoQuT6T7pW6O6XnfjQTZgFjEazPHAHng=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 h1:AZeaAPJM5X93ITFgwbwluYDtYEJ7tkCMSlj35GwfLLU=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0/go.mod h1:YP17JhMnXTitowXE13QJwFaKo0oc03iyoKLjWAYl4FE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0 h1:Sfi9jAIgRXZaJQw8Ji6+8//47D+iOyGiXQSNZXhy3HE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0/go.mod h1:jyfVSx7mI3u/o/oo10COxBRBvJ8O/9I3z2xAwPmNt/Q=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 h1:FdnA7hLq0U8PeMAIuJXt4KcXLAyGo7OjckzxTAwaoBc=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0/go.mod h1:+X6C0h8ZTJe+lLU2AGJfiAzCJK3zL+yM6cej9VC+79E=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 h1:dk9ul1t7INAiyZXeu/GrpinFE3qOekdy8uZOqEGgIiE=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0/go.mod h1:DUQRnAd5fVzoROc5SI+PTFUD/vCNeZmZHBMrLElbmwI=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 h1:Rqr1CgBXppAeehCkPAHQ6hjyLlm2KTR4IKiKpExm7gg=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0/go.mod h1:dQiOiga0KMGHXqFs4nI+Rp19hQR3gZ+3lDRgI9x5Q7M=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/diegoholiveira/jsonlogic/v3 v3.2.7 h1:awX07pFPnlntZzRNBcO4a2Ivxa77NMt+narq/6xcS0E=
+github.com/diegoholiveira/jsonlogic/v3 v3.2.7/go.mod h1:9oE8z9G+0OMxOoLHF3fhek3KuqD5CBqM0B6XFL08MSg=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1 h1:EclqSAArZtevlyyJu6TJXjWo6MS7OeQkdD/SOz11r+U=
+github.com/edgexfoundry/app-functions-sdk-go/v3 v3.0.1/go.mod h1:sgH/44+BsOXtqFnot5bkbyJlJzISD9jiuudKxgnCgmg=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 h1:gXVxaZPcRJl2MhCIK/GOXZnQL+21xOUpGDTLTcVCxSk=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1/go.mod h1:Or09TpF5HF3FjlqX3kJEFhBCsTvbHY0Nu28UF0MvB3w=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 h1:rdk8KMcU8fA6o9MCb0O68bboxZTdLiXTZByNttEtRwE=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0/go.mod h1:8RlYm5CPzZgUsfXDWVP1TIeUMhsDNIdRdj1HXdomtOI=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0 h1:xjwCI34DLM31cSl1q9XmYgXS3JqXufQJMgohnLLLDx0=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0/go.mod h1:zzzWGWij6wAqm1go9TLs++TFMIsBqBb1eRnIj4mRxGw=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 h1:nU37Uo4/kloTMrdqDN9SJuDoXb3FpHaMdwVbHtn9PPk=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0/go.mod h1:x2CueD9gn/CmtCvDNFgrgBnR+B1iWJMSrC5+gesfDJ0=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 h1:6LXGElSScCCQzNpR3WjcgVz0RUc9GbfxETvif/4++iI=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0/go.mod h1:SGyo4fAHzOhDAd2Usa9RaBT/sOzkbceIqLrDG0+iYy8=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 h1:XyoDjeeVBMNwlJb6ljcTOl1QOp5gabcJc7pYSPYKNPA=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1/go.mod h1:Ts9l+TknRKaqFsXmrTuKyV1Y5qIr+eiexVYkQuXnfxk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
-github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
+github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
-github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
-github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
-github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
-github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
-github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ=
+github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4=
github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/gomodule/redigo v1.8.8 h1:f6cXq6RRfiyrOJEV7p3JhLDlmawGBVBBP1MggY8Mo4E=
-github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/hashicorp/consul/api v1.9.1 h1:SngrdG2L62qqLsUz85qcPhFZ78rPf8tcD5qjMgs6MME=
-github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
+github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=
+github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=
+github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=
-github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
+github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU=
+github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE=
+github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
-github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g=
-github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM=
-github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
+github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
+github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=
+github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
+github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
+github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0 h1:t7sYxdPJZ2wjZgFpD+B+rx1Jk//5hkiEDW2ptwjhXAc=
-github.com/intel-iot-devkit/automated-checkout-utilities v1.0.0/go.mod h1:ov2jYqRbWFWuzgUGt6+LMiE+SBkUpI+qzgIWCipFlCo=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA=
+github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
+github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 h1:DcITQwl3ymmg7i1XfwpZFs/TPv2PuTwxE8bnuKVtKlk=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54/go.mod h1:dIfpPVUR+ZfkzkDcKnn+oPW1jKeXe4WlNWc7rIXOVxM=
-github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4=
+github.com/nats-io/nats-server/v2 v2.9.16 h1:SuNe6AyCcVy0g5326wtyU8TdqYmcPqzTjhkHojAjprc=
+github.com/nats-io/nats.go v1.25.0 h1:t5/wCPGciR7X3Mu8QOi4jiJaXaWM8qtkLu4lzGZvYHE=
+github.com/nats-io/nats.go v1.25.0/go.mod h1:D2WALIhz7V8M0pH8Scx8JZXlg6Oqz5VG+nQkK8nJdvg=
+github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA=
+github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pebbe/zmq4 v1.2.7 h1:6EaX83hdFSRUEhgzSW1E/SPoTS3JeYZgYkBvwdcrA9A=
-github.com/pebbe/zmq4 v1.2.7/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
-github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/spiffe/go-spiffe/v2 v2.0.0 h1:y6N7BZAxgaFZYELyrIdxSMm2e2tWpzgQewUts9h1hfM=
-github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/spiffe/go-spiffe/v2 v2.1.4 h1:Z31Ycaf2Z5DF38sQGmp+iGKjBhBlSzfAq68bfy67Mxw=
+github.com/spiffe/go-spiffe/v2 v2.1.4/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g=
-github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
+github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y=
-gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/as-vending/main.go b/as-vending/main.go
index b9a4aa7..5ae75f3 100644
--- a/as-vending/main.go
+++ b/as-vending/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package main
@@ -10,10 +10,10 @@ import (
"as-vending/functions"
"as-vending/routes"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/transforms"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/transforms"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
const (
@@ -102,7 +102,7 @@ func (app *vendingAppService) CreateAndRunAppService(serviceKey string, newServi
}
// create the function pipeline to run when an event is read on the device channels
- err = app.service.SetFunctionsPipeline(
+ err = app.service.SetDefaultFunctionsPipeline(
transforms.NewFilterFor([]string{app.vendingState.Configuration.CardReaderDeviceName, app.vendingState.Configuration.InferenceDeviceName}).FilterByDeviceName,
app.vendingState.DeviceHelper,
)
@@ -112,9 +112,9 @@ func (app *vendingAppService) CreateAndRunAppService(serviceKey string, newServi
}
// tell the SDK to "start" and begin listening for events to trigger the pipeline.
- err = app.service.MakeItRun()
+ err = app.service.Run()
if err != nil {
- app.lc.Errorf("MakeItRun returned error: %s", err.Error())
+ app.lc.Errorf("Run returned error: %s", err.Error())
return 1
}
diff --git a/as-vending/res/configuration.toml b/as-vending/res/configuration.toml
deleted file mode 100644
index 57eb97e..0000000
--- a/as-vending/res/configuration.toml
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-[Writable]
-LogLevel = 'INFO'
- [Writable.InsecureSecrets]
- [Writable.InsecureSecrets.DB]
- path = "redisdb"
- [Writable.InsecureSecrets.DB.Secrets]
- username = ""
- password = ""
-
-[Service]
-HealthCheckInterval = '10s'
-Host = 'localhost'
-Port = 48099
-StartupMsg = 'This is an Application Service which reads card inputs and publishes lock status back to message bus'
-RequestTimeout = '30s'
-MaxRequestSize = 0
-ServerBindAddr = ""
-MaxResultCount = 0
-
-[Registry]
-Host = 'localhost'
-Port = 8500
-Type = 'consul'
-
-[Trigger]
-Type="edgex-messagebus"
- [Trigger.EdgexMessageBus]
- Type = "mqtt"
- [Trigger.EdgexMessageBus.SubscribeHost]
- Host = "localhost"
- Port = 1883
- Protocol = "tcp"
- SubscribeTopics="edgex/events/#"
- [Trigger.EdgexMessageBus.Optional]
- authmode = "none"
- ClientId ="as-vending"
- Qos = "0" # Quality of Sevice values are 0 (At most once), 1 (At least once) or 2 (Exactly once)
- KeepAlive = "10" # Seconds (must be 2 or greater)
- Retained = "false"
- AutoReconnect = "true"
- ConnectTimeout = "5" # Seconds
- SkipCertVerify = "false"
-
-[Clients]
- # Used for version check on start-up
- # Also used for DeviceService, DeviceProfile and Device clients
- [Clients.core-metadata]
- Protocol = "http"
- Host = "localhost"
- Port = 59881
-
- [Clients.core-command]
- Protocol = "http"
- Host = "localhost"
- Port = 59882
-
-[Vending]
- AuthenticationEndpoint = "http://localhost:48096/authentication"
- ControllerBoardDisplayResetCmd = "displayReset"
- ControllerBoardDisplayRow0Cmd = "displayRow0"
- ControllerBoardDisplayRow1Cmd = "displayRow1"
- ControllerBoardDisplayRow2Cmd = "displayRow2"
- ControllerBoardDisplayRow3Cmd = "displayRow3"
- ControllerBoardLock1Cmd = "lock1"
- ControllerBoardLock2Cmd = "lock2"
- CardReaderDeviceName = "card-reader"
- InferenceDeviceName = "Inference-device"
- ControllerBoardDeviceName = "controller-board"
- DoorCloseStateTimeoutDuration = "20s"
- DoorOpenStateTimeoutDuration = "15s"
- InferenceDoorStatusCmd = "inferenceDoorStatus"
- InferenceHeartbeatCmd = "inferenceHeartbeat"
- InferenceTimeoutDuration = "20s"
- InventoryAuditLogService = "http://localhost:48095/auditlog"
- InventoryService = "http://localhost:48095/inventory/delta"
- LCDRowLength = 19
- LedgerService = "http://localhost:48093/ledger"
\ No newline at end of file
diff --git a/as-vending/res/configuration.yaml b/as-vending/res/configuration.yaml
new file mode 100644
index 0000000..39d4084
--- /dev/null
+++ b/as-vending/res/configuration.yaml
@@ -0,0 +1,43 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+Writable:
+ LogLevel: INFO
+
+Service:
+ Host: localhost
+ Port: 48099
+ StartupMsg: This microservice checks if ID numbers from REST requests are authenticated
+
+Clients:
+ core-command:
+ Protocol: "http"
+ Host: "localhost"
+ Port: 59882
+
+MessageBus:
+ Optional:
+ ClientId: "as-vending"
+
+# Using default Trigger config from common config
+Vending:
+ AuthenticationEndpoint: "http://localhost:48096/authentication"
+ ControllerBoardDisplayResetCmd: "displayReset"
+ ControllerBoardDisplayRow0Cmd: "displayRow0"
+ ControllerBoardDisplayRow1Cmd: "displayRow1"
+ ControllerBoardDisplayRow2Cmd: "displayRow2"
+ ControllerBoardDisplayRow3Cmd: "displayRow3"
+ ControllerBoardLock1Cmd: "lock1"
+ ControllerBoardLock2Cmd: "lock2"
+ CardReaderDeviceName : "card-reader"
+ InferenceDeviceName: "Inference-device"
+ ControllerBoardDeviceName: "controller-board"
+ DoorCloseStateTimeoutDuration: "20s"
+ DoorOpenStateTimeoutDuration: "15s"
+ InferenceDoorStatusCmd: "inferenceDoorStatus"
+ InferenceHeartbeatCmd: "inferenceHeartbeat"
+ InferenceTimeoutDuration: "20s"
+ InventoryAuditLogService: "http://localhost:48095/auditlog"
+ InventoryService: "http://localhost:48095/inventory/delta"
+ LCDRowLength: 19
+ LedgerService: "http://localhost:48093/ledger"
\ No newline at end of file
diff --git a/as-vending/routes/controller.go b/as-vending/routes/controller.go
index 865fe10..a2c5755 100644
--- a/as-vending/routes/controller.go
+++ b/as-vending/routes/controller.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package routes
@@ -11,9 +11,8 @@ import (
"net/http"
"time"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
type Controller struct {
@@ -55,8 +54,16 @@ func (c *Controller) AddAllRoutes() error {
// GetMaintenanceMode will return a JSON response containing the boolean state
// of the vendingState's maintenance mode.
func (c *Controller) GetMaintenanceMode(writer http.ResponseWriter, req *http.Request) {
- mm, _ := utilities.GetAsJSON(functions.MaintenanceMode{MaintenanceMode: c.vendingState.MaintenanceMode})
- utilities.WriteJSONHTTPResponse(writer, req, http.StatusOK, mm, false)
+
+ mm, err := json.Marshal(functions.MaintenanceMode{MaintenanceMode: c.vendingState.MaintenanceMode})
+ if err != nil {
+ errMsg := fmt.Sprintf("failed to marshal requested state: %s", err.Error())
+ c.lc.Error(errMsg)
+ writer.WriteHeader(http.StatusInternalServerError)
+ writer.Write([]byte(errMsg))
+ return
+ }
+ writer.Write(mm)
}
func (c *Controller) errorAddRouteHandler(err error) error {
@@ -137,10 +144,10 @@ func (c *Controller) BoardStatus(writer http.ResponseWriter, req *http.Request)
c.vendingState.MaintenanceMode = true
}
- // Check to see if the board closed state is different than the previous state. If it is we need to update the state and
+ // Check to see if the board closed state is different from the previous state. If it is we need to update the state and
// set the related properties.
if c.vendingState.DoorClosed != boardStatus.DoorClosed {
- c.lc.Errorf("Successfully updated the door event. Door closed: %v", boardStatus.DoorClosed)
+ c.lc.Infof("Successfully updated the door event. Door closed: %v", boardStatus.DoorClosed)
returnval = string("Door closed change event was received ")
status = http.StatusOK //FIXME: This is an issue
c.vendingState.DoorClosed = boardStatus.DoorClosed
diff --git a/as-vending/routes/controller_test.go b/as-vending/routes/controller_test.go
index 326ddd9..2e41a6c 100644
--- a/as-vending/routes/controller_test.go
+++ b/as-vending/routes/controller_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package routes
@@ -9,13 +9,13 @@ import (
"bytes"
"encoding/json"
"fmt"
+ "io"
"net/http"
"net/http/httptest"
"testing"
- "github.com/edgexfoundry/app-functions-sdk-go/v2/pkg/interfaces/mocks"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- utilities "github.com/intel-iot-devkit/automated-checkout-utilities"
+ "github.com/edgexfoundry/app-functions-sdk-go/v3/pkg/interfaces/mocks"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -92,10 +92,13 @@ func TestGetMaintenanceMode(t *testing.T) {
// parse the response
resp := w.Result()
- _, err := utilities.ParseJSONHTTPResponseContent(resp.Body, &maintModeAPIResponse)
+ defer resp.Body.Close()
+ body, err := io.ReadAll(resp.Body)
+ require.NoError(t, err)
+
+ err = json.Unmarshal(body, &maintModeAPIResponse)
require.NoError(t, err)
- defer resp.Body.Close()
assert.Equal(t, maintModeAPIResponse, maintModeTrue, "Received a maintenance mode response that was different than anticipated")
})
t.Run("TestGetMaintenanceMode MaintenanceMode=False", func(t *testing.T) {
@@ -113,10 +116,12 @@ func TestGetMaintenanceMode(t *testing.T) {
// parse the response
resp := w.Result()
- _, err := utilities.ParseJSONHTTPResponseContent(resp.Body, &maintModeAPIResponse)
+ defer resp.Body.Close()
+ body, err := io.ReadAll(resp.Body)
require.NoError(t, err)
- defer resp.Body.Close()
+ err = json.Unmarshal(body, &maintModeAPIResponse)
+ require.NoError(t, err)
assert.Equal(t, maintModeAPIResponse, maintModeFalse, "Received a maintenance mode response that was different than anticipated")
})
}
diff --git a/docker-compose.ac.yml b/docker-compose.av.yml
similarity index 67%
rename from docker-compose.ac.yml
rename to docker-compose.av.yml
index a693992..9702a20 100644
--- a/docker-compose.ac.yml
+++ b/docker-compose.av.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
networks:
@@ -6,18 +6,17 @@ networks:
driver: bridge
services:
ms-authentication:
- container_name: automated-checkout_ms-authentication
+ container_name: automated-vending_ms-authentication
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
environment:
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: ms-authentication
hostname: ms-authentication
- image: automated-checkout/ms-authentication:dev
+ image: automated-vending/ms-authentication:dev
networks:
edgex-network: {}
ports:
@@ -31,16 +30,15 @@ services:
options: { max-file: "5", max-size: 100m }
user: 2002:2001
ms-inventory:
- image: "automated-checkout/ms-inventory:dev"
- container_name: automated-checkout_ms-inventory
+ image: "automated-vending/ms-inventory:dev"
+ container_name: automated-vending_ms-inventory
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
environment:
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: ms-inventory
hostname: ms-inventory
networks:
@@ -58,16 +56,15 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
ms-ledger:
- image: "automated-checkout/ms-ledger:dev"
- container_name: automated-checkout_ms-ledger
+ image: "automated-vending/ms-ledger:dev"
+ container_name: automated-vending_ms-ledger
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
environment:
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: ms-ledger
APPLICATIONSETTINGS_INVENTORYENDPOINT: "http://ms-inventory:48095/inventory"
hostname: ms-ledger
@@ -86,22 +83,17 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
ds-card-reader:
- image: "automated-checkout/ds-card-reader:dev"
- container_name: automated-checkout_ds-card-reader
+ image: "automated-vending/ds-card-reader:dev"
+ container_name: automated-vending_ds-card-reader
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
consul:
condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
EDGEX_SECURITY_SECRET_STORE: "false"
- MESSAGEQUEUE_HOST: edgex-mqtt-broker
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: ds-card-reader
hostname: ds-card-reader
networks:
@@ -116,22 +108,17 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
ds-controller-board:
- image: "automated-checkout/ds-controller-board:dev"
- container_name: automated-checkout_ds-controller-board
+ image: "automated-vending/ds-controller-board:dev"
+ container_name: automated-vending-controller-board
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
consul:
condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
EDGEX_SECURITY_SECRET_STORE: "false"
- MESSAGEQUEUE_HOST: edgex-mqtt-broker
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: ds-controller-board
hostname: ds-controller-board
networks:
@@ -146,14 +133,12 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
ds-cv-inference:
- image: "automated-checkout/ds-cv-inference:dev"
- container_name: automated-checkout_ds-cv-inference
+ image: "automated-vending/ds-cv-inference:dev"
+ container_name: automated-vending_ds-cv-inference
command: ["/go/src/ds-cv-inference/images","mqtt-broker:1883","0.85","/go/src/ds-cv-inference/skumapping.json"]
depends_on:
mqtt-broker:
condition: service_started
- environment:
- SERVICE_HOST: ds-cv-inference
hostname: ds-cv-inference
networks:
edgex-network: {}
@@ -167,24 +152,19 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
as-vending:
- image: "automated-checkout/as-vending:dev"
- container_name: automated-checkout_as-vending
+ image: "automated-vending/as-vending:dev"
+ container_name: automated-vending_as-vending
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
consul:
condition: service_started
environment:
CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: as-vending
- TRIGGER_EDGEXMESSAGEBUS_PUBLISHHOST_HOST: mqtt-broker
- TRIGGER_EDGEXMESSAGEBUS_SUBSCRIBEHOST_HOST: mqtt-broker
VENDING_AUTHENTICATIONENDPOINT: http://ms-authentication:48096/authentication
VENDING_INVENTORYAUDITLOGSERVICE: http://ms-inventory:48095/auditlog
VENDING_INVENTORYSERVICE: http://ms-inventory:48095/inventory/delta
@@ -202,26 +182,20 @@ services:
options: { max-file: "5", max-size: 100m }
user: "2000:2000"
as-controller-board-status:
- image: "automated-checkout/as-controller-board-status:dev"
- container_name: automated-checkout_as-controller-board-status
+ image: "automated-vending/as-controller-board-status:dev"
+ container_name: automated-vending_as-controller-board-status
depends_on:
- data:
+ core-data:
condition: service_started
- command:
+ core-command:
condition: service_started
consul:
condition: service_started
environment:
CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
EDGEX_SECURITY_SECRET_STORE: "false"
- TRIGGER_EDGEXMESSAGEBUS_PUBLISHHOST_HOST: mqtt-broker
- TRIGGER_EDGEXMESSAGEBUS_SUBSCRIBEHOST_HOST: mqtt-broker
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: as-controller-board-status
- CONTROLLERBOARDSTATUS_DOORSTATUSCOMMANDENDPOINT: "http://edgex-core-command:59882/api/v2/device/name/Inference-device/inferenceDoorStatus"
CONTROLLERBOARDSTATUS_VENDINGENDPOINT: "http://as-vending:48099/boardStatus"
CONTROLLERBOARDSTATUS_MAXTEMPERATURETHRESHOLD: "83"
CONTROLLERBOARDSTATUS_MINTEMPERATURETHRESHOLD: "10"
diff --git a/docker-compose.edgex.yml b/docker-compose.edgex.yml
index 337e145..bf2269d 100644
--- a/docker-compose.edgex.yml
+++ b/docker-compose.edgex.yml
@@ -1,4 +1,4 @@
-# Copyright © 2020-2022 Intel Corporation. All rights reserved.
+# Copyright © 2020-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
networks:
@@ -6,47 +6,61 @@ networks:
driver: bridge
services:
consul:
- command: agent -ui -bootstrap -server -client 0.0.0.0
+ command:
+ - agent
+ - -ui
+ - -bootstrap
+ - -server
+ - -client
+ - 0.0.0.0
container_name: edgex-core-consul
hostname: edgex-core-consul
- image: consul:1.10.10
+ image: hashicorp/consul:1.15.2
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:8500:8500/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 8500
+ published: "8500"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: root:root
volumes:
- - consul-config:/consul/config:z
- - consul-data:/consul/data:z
+ - type: volume
+ source: consul-config
+ target: /consul/config
+ volume: {}
+ - type: volume
+ source: consul-data
+ target: /consul/data
+ volume: {}
database:
container_name: edgex-redis
- environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
- DATABASES_PRIMARY_HOST: edgex-redis
- EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
hostname: edgex-redis
- image: redis:6.2.6-alpine
+ image: redis:7.0.11-alpine
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:6379:6379/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 6379
+ published: "6379"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: root:root
volumes:
- - db-data:/data:z
- notifications:
+ - type: volume
+ source: db-data
+ target: /data
+ volume: {}
+ support-notifications:
container_name: edgex-support-notifications
depends_on:
consul:
@@ -54,175 +68,209 @@ services:
database:
condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
- DATABASES_PRIMARY_HOST: edgex-redis
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: edgex-support-notifications
hostname: edgex-support-notifications
- image: edgexfoundry/support-notifications:2.2.0
+ image: edgexfoundry/support-notifications:3.0.0
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:59860:59860/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 59860
+ published: "59860"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: 2002:2001
- metadata:
+ core-metadata:
container_name: edgex-core-metadata
depends_on:
consul:
condition: service_started
database:
condition: service_started
- notifications:
- condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
- DATABASES_PRIMARY_HOST: edgex-redis
EDGEX_SECURITY_SECRET_STORE: "false"
- NOTIFICATIONS_SENDER: edgex-core-metadata
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: edgex-core-metadata
hostname: edgex-core-metadata
- image: edgexfoundry/core-metadata:2.2.0
+ image: edgexfoundry/core-metadata:3.0.0
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:59881:59881/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 59881
+ published: "59881"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: 2002:2001
- data:
+ core-data:
container_name: edgex-core-data
depends_on:
consul:
condition: service_started
- database:
- condition: service_started
- metadata:
+ core-metadata:
condition: service_started
- mqtt-broker:
+ database:
condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
- DATABASES_PRIMARY_HOST: edgex-redis
EDGEX_SECURITY_SECRET_STORE: "false"
- MESSAGEQUEUE_AUTHMODE: none
- MESSAGEQUEUE_HOST: edgex-mqtt-broker
- MESSAGEQUEUE_OPTIONAL_CLIENTID: core-data
- MESSAGEQUEUE_PORT: 1883
- MESSAGEQUEUE_PROTOCOL: tcp
- MESSAGEQUEUE_TYPE: mqtt
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: edgex-core-data
hostname: edgex-core-data
- image: edgexfoundry/core-data:2.2.0
+ image: edgexfoundry/core-data:3.0.0
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:5563:5563/tcp
- - 127.0.0.1:59880:59880/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 59880
+ published: "59880"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: 2002:2001
- command:
+ core-command:
container_name: edgex-core-command
depends_on:
consul:
condition: service_started
- database:
+ core-metadata:
condition: service_started
- metadata:
+ database:
condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
- DATABASES_PRIMARY_HOST: edgex-redis
EDGEX_SECURITY_SECRET_STORE: "false"
- REGISTRY_HOST: edgex-core-consul
+ EXTERNALMQTT_URL: tcp://edgex-mqtt-broker:1883
SERVICE_HOST: edgex-core-command
hostname: edgex-core-command
- image: edgexfoundry/core-command:2.2.0
+ image: edgexfoundry/core-command:3.0.0
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:59882:59882/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 59882
+ published: "59882"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
+ user: 2002:2001
+ core-common-config-bootstrapper:
+ container_name: edgex-core-common-config-bootstrapper
+ depends_on:
+ consul:
+ condition: service_started
+ environment:
+ ALL_SERVICES_DATABASE_HOST: edgex-redis
+ ALL_SERVICES_MESSAGEBUS_HOST: edgex-redis
+ ALL_SERVICES_REGISTRY_HOST: edgex-core-consul
+ APP_SERVICES_CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
+ DEVICE_SERVICES_CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
+ EDGEX_SECURITY_SECRET_STORE: "false"
+ hostname: edgex-core-common-config-bootstrapper
+ image: edgexfoundry/core-common-config-bootstrapper:3.0.0
+ networks:
+ edgex-network: null
+ read_only: true
+ security_opt:
+ - no-new-privileges:true
user: 2002:2001
mqtt-broker:
- command: /usr/sbin/mosquitto -c /mosquitto-no-auth.conf
+ command:
+ - /usr/sbin/mosquitto
+ - -c
+ - /mosquitto-no-auth.conf
container_name: edgex-mqtt-broker
hostname: edgex-mqtt-broker
- image: eclipse-mosquitto:2.0.14
+ image: eclipse-mosquitto:2.0.15
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:1883:1883/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 1883
+ published: "1883"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: 2002:2001
device-mqtt:
container_name: edgex-device-mqtt
depends_on:
- - consul
- - data
- - metadata
- - mqtt-broker
+ consul:
+ condition: service_started
+ core-data:
+ condition: service_started
+ core-metadata:
+ condition: service_started
+ mqtt-broker:
+ condition: service_started
environment:
- CLIENTS_CORE_COMMAND_HOST: edgex-core-command
- CLIENTS_CORE_DATA_HOST: edgex-core-data
- CLIENTS_CORE_METADATA_HOST: edgex-core-metadata
- CLIENTS_SUPPORT_NOTIFICATIONS_HOST: edgex-support-notifications
- CLIENTS_SUPPORT_SCHEDULER_HOST: edgex-support-scheduler
EDGEX_SECURITY_SECRET_STORE: "false"
- MESSAGEQUEUE_HOST: edgex-mqtt-broker
MQTTBROKERINFO_HOST: edgex-mqtt-broker
- REGISTRY_HOST: edgex-core-consul
SERVICE_HOST: edgex-device-mqtt
- volumes:
- - ./res/device-mqtt:/res
+ MQTTBROKERINFO_INCOMINGTOPIC: Inference/DataTopic/#
+ MQTTBROKERINFO_RESPONSETOPIC: Inference/ResponseTopic/#
hostname: edgex-device-mqtt
- image: edgexfoundry/device-mqtt:2.2.0
+ image: edgexfoundry/device-mqtt:3.0.0
networks:
- edgex-network: {}
+ edgex-network: null
ports:
- - 127.0.0.1:59982:59982/tcp
+ - mode: ingress
+ host_ip: 127.0.0.1
+ target: 59982
+ published: "59982"
+ protocol: tcp
read_only: true
restart: always
security_opt:
- - no-new-privileges:true
+ - no-new-privileges:true
user: 2002:2001
-
-version: '3.7'
+ volumes:
+ - ./res/device-mqtt/devices:/res/devices
+ - ./res/device-mqtt/profiles:/res/profiles
+ ui:
+ container_name: edgex-ui-go
+ environment:
+ EDGEX_SECURITY_SECRET_STORE: "false"
+ SERVICE_HOST: edgex-ui-go
+ hostname: edgex-ui-go
+ image: nexus3.edgexfoundry.org:10004/edgex-ui:3.0.0
+ networks:
+ edgex-network: null
+ ports:
+ - mode: ingress
+ target: 4000
+ published: "4000"
+ protocol: tcp
+ read_only: true
+ restart: always
+ security_opt:
+ - no-new-privileges:true
+ user: 2002:2001
+ volumes:
+ - type: bind
+ source: /etc/localtime
+ target: /etc/localtime
+ read_only: true
+ bind:
+ create_host_path: true
volumes:
- consul-config: {}
- consul-data: {}
- db-data: {}
- kuiper-data: {}
+ consul-config:
+ name: edgex_consul-config
+ consul-data:
+ name: edgex_consul-data
+ db-data:
+ name: edgex_db-data
diff --git a/docker-compose.physical.card-reader.yml b/docker-compose.physical.card-reader.yml
index 0fa84ef..94bf400 100644
--- a/docker-compose.physical.card-reader.yml
+++ b/docker-compose.physical.card-reader.yml
@@ -1,6 +1,6 @@
---
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
version: '3.4'
@@ -8,7 +8,7 @@ version: '3.4'
services:
#################################################################
-# Automated Checkout Microservices
+# Automated Vending Microservices
#################################################################
# this device service must be run as root to mount the device
diff --git a/docker-compose.physical.controller-board.yml b/docker-compose.physical.controller-board.yml
index 779ce1d..abf71f4 100644
--- a/docker-compose.physical.controller-board.yml
+++ b/docker-compose.physical.controller-board.yml
@@ -1,6 +1,6 @@
---
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
version: '3.4'
@@ -8,7 +8,7 @@ version: '3.4'
services:
#################################################################
-# Automated Checkout Microservices
+# Automated Vending Microservices
#################################################################
# this device service must be run as root to mount the device
diff --git a/docker-compose.portainer.yml b/docker-compose.portainer.yml
index 38293d0..9533374 100644
--- a/docker-compose.portainer.yml
+++ b/docker-compose.portainer.yml
@@ -1,13 +1,13 @@
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-version: '3.4'
+version: '3.7'
volumes:
portainer_data:
services:
portainer:
- image: portainer/portainer
+ image: portainer/portainer-ce
container_name: portainer
ports:
- "127.0.0.1:9000:9000"
diff --git a/docs_src/automated-checkout-services/application_services.md b/docs_src/automated-vending-services/application_services.md
similarity index 90%
rename from docs_src/automated-checkout-services/application_services.md
rename to docs_src/automated-vending-services/application_services.md
index b9b6abb..939f885 100644
--- a/docs_src/automated-checkout-services/application_services.md
+++ b/docs_src/automated-vending-services/application_services.md
@@ -1,12 +1,12 @@
# Application Services
-The **Automated Checkout** reference implementation utilizes two application services that are used to consume event data from the EdgeX framework.
+The **Automated Vending** reference implementation utilizes two application services that are used to consume event data from the EdgeX framework.
## List of application services
- Controller Board Status – Handles events coming from the controller board device service.
-- Vending – The main business logic for the Automated Checkout application. This service handles events directly from the card reader device service and inference engine as well as coordinates data between each of the microservices.
+- Vending – The main business logic for the Automated Vending application. This service handles events directly from the card reader device service and inference engine as well as coordinates data between each of the microservices.
## Controller board status application service
@@ -118,7 +118,7 @@ If the `door_closed` property is different than what `as-vending` currently beli
### `POST`: `/resetDoorLock`
-The `POST` call will simply reset the Automated Checkout's internal `vendingState`. This API endpoint has no logic to process any input data - it just responds to a simple `POST`.
+The `POST` call will simply reset the Automated Vending's internal `vendingState`. This API endpoint has no logic to process any input data - it just responds to a simple `POST`.
Simple usage example:
diff --git a/docs_src/automated-checkout-services/device_services.md b/docs_src/automated-vending-services/device_services.md
similarity index 76%
rename from docs_src/automated-checkout-services/device_services.md
rename to docs_src/automated-vending-services/device_services.md
index bf99a48..9ab7877 100644
--- a/docs_src/automated-checkout-services/device_services.md
+++ b/docs_src/automated-vending-services/device_services.md
@@ -1,6 +1,6 @@
# Device Services
-The **Automated Checkout** reference implementation utilizes three device services that are used to communicate hardware event data to underlying EdgeX framework.
+The **Automated Vending** reference implementation utilizes three device services that are used to communicate hardware event data to underlying EdgeX framework.
## List of device services
@@ -12,7 +12,7 @@ The **Automated Checkout** reference implementation utilizes three device servic
### Card reader description
-The `ds-card-reader` device service is an EdgeX device service that allows a USB-based RFID card reader to grant access to the Automated Checkout. At a high level, this device service is responsible for discovering a specific card reader device, watching for input from that device, parsing that input, and then forwarding the input into the EdgeX framework.
+The `ds-card-reader` device service is an EdgeX device service that allows a USB-based RFID card reader to read the user's card and grant access to the Automated Vending system. At a high level, this device service is responsible for discovering a specific card reader device, watching for input from that device, parsing that input, and then forwarding the input through the EdgeX framework to the ms-authentication service which authorizes/denies access to the Automated Vending.
There are two different modes available to this device service:
@@ -29,12 +29,12 @@ The `ds-card-reader` service is much simpler than the `ds-controller-board` serv
---
-#### `PUT`: `http://localhost:48098/api/v2/device/name/card-reader/card-number`
+#### `PUT`: `http://localhost:48098/api/v3/device/name/card-reader/card-number`
The `PUT` API endpoint will push the badge ID (which is sent as part of the API request body) into the card reader device service. Once the card reader device service receives the badge ID, the badge ID will be pushed into the EdgeX bus for other application services to utilize.
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278200"}' http://localhost:48098/api/v2/device/name/card-reader/card-number
+curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278200"}' http://localhost:48098/api/v3/device/name/card-reader/card-number
```
Sample response:
@@ -48,12 +48,12 @@ Sample response:
---
-#### `GET`: `http://localhost:48098/api/v2/device/name/card-reader/status`
+#### `GET`: `http://localhost:48098/api/v3/device/name/card-reader/status`
The `GET` API endpoint returns data that is not meant to be consumed for any particular purpose. When triggering this endpoint, it will execute a function (in the Go source code) called `CardReaderStatus` that is used as an auto-remediation mechanism to attempt to "grab" the physical card reader HID device (via [`evdev`](https://en.wikipedia.org/wiki/Evdev)). If it succeeds in grabbing the underlying device, that means that the `ds-card-reader` device service has lost its hold on the card reader, and we need to restart the service. This endpoint is meant to be hit frequently.
```bash
-curl -X GET http://localhost:48098/api/v2/device/name/card-reader/status
+curl -X GET http://localhost:48098/api/v3/device/name/card-reader/status
```
Sample response:
@@ -95,41 +95,41 @@ Therefore, if you have multiple serial devices plugged into your system, please
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/lock1`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/lock1`
This `PUT` command will operate magnetic `lock1`. Depending on the numeric value of `lock1` (boolean `0/1`), the lock state will either be locked or unlocked.
Simple usage example:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"lock1":"0"}' http://localhost:59882/api/v2/device/name/controller-board/lock1
+curl -X PUT -H "Content-Type: application/json" -d '{"lock1":"0"}' http://localhost:59882/api/v3/device/name/controller-board/lock1
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"lock1":"0"}' http://localhost:48097/api/v2/device/name/controller-board/lock1
+curl -X PUT -H "Content-Type: application/json" -d '{"lock1":"0"}' http://localhost:48097/api/v3/device/name/controller-board/lock1
```
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/lock2`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/lock2`
This `PUT` command will operate magnetic `lock2`. Depending on the numeric value of `lock2` (boolean `0/1`), the lock state will either be locked or unlocked.
!!! note
- Currently `lock2` has no purpose. During the initial architect/design phase of Automated Checkout, there were two locks. This was later reduced to a single mag-lock.
+ Currently `lock2` has no purpose. During the initial architect/design phase of Automated Vending, there were two locks. This was later reduced to a single mag-lock.
Sample usage:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"lock2":"1"}' http://localhost:59882/api/v2/device/name/controller-board/lock2
+curl -X PUT -H "Content-Type: application/json" -d '{"lock2":"1"}' http://localhost:59882/api/v3/device/name/controller-board/lock2
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"lock2":"1"}' http://localhost:48097/api/v2/device/name/controller-board/lock2
+curl -X PUT -H "Content-Type: application/json" -d '{"lock2":"1"}' http://localhost:48097/api/v3/device/name/controller-board/lock2
```
!!! success
@@ -140,20 +140,20 @@ curl -X PUT -H "Content-Type: application/json" -d '{"lock2":"1"}' http://localh
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/displayRow0`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/displayRow0`
This `PUT` command will operate the display (LCD) and control the text to be put on the first line of the display.
Simple usage :
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"displayRow0":"The Earth is round"}' http://localhost:59882/api/v2/device/name/controller-board/displayRow0
+curl -X PUT -H "Content-Type: application/json" -d '{"displayRow0":"The Earth is round"}' http://localhost:59882/api/v3/device/name/controller-board/displayRow0
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"displayRow0":"The Earth is round"}' http://localhost:48097/api/v2/device/name/controller-board/displayRow0
+curl -X PUT -H "Content-Type: application/json" -d '{"displayRow0":"The Earth is round"}' http://localhost:48097/api/v3/device/name/controller-board/displayRow0
```
!!!info
@@ -167,7 +167,7 @@ curl -X PUT -H "Content-Type: application/json" -d '{"displayRow0":"The Earth is
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/setTemperature`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/setTemperature`
This `PUT` command will emulate the temperature sensed by the controller board as a persistent value.
@@ -177,13 +177,13 @@ This `PUT` command will emulate the temperature sensed by the controller board a
Simple usage :
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"12.00"}' http://localhost:59882/api/v2/device/name/controller-board/setTemperature
+curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"12.00"}' http://localhost:59882/api/v3/device/name/controller-board/setTemperature
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"12.00"}' http://localhost:48097/api/v2/device/name/controller-board/setTemperature
+curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"12.00"}' http://localhost:48097/api/v3/device/name/controller-board/setTemperature
```
!!! success
@@ -194,7 +194,7 @@ curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"12.00"}'
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/setHumidity`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/setHumidity`
This `PUT` command will emulate the humidity sensed by the controller board as a persistent value.
@@ -204,13 +204,13 @@ This `PUT` command will emulate the humidity sensed by the controller board as a
Simple usage example:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setHumidity":"12"}' http://localhost:59882/api/v2/device/name/controller-board/setHumidity
+curl -X PUT -H "Content-Type: application/json" -d '{"setHumidity":"12"}' http://localhost:59882/api/v3/device/name/controller-board/setHumidity
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setHumidity":"12"}' http://localhost:48097/api/v2/device/name/controller-board/setHumidity
+curl -X PUT -H "Content-Type: application/json" -d '{"setHumidity":"12"}' http://localhost:48097/api/v3/device/name/controller-board/setHumidity
```
!!! success
@@ -221,7 +221,7 @@ curl -X PUT -H "Content-Type: application/json" -d '{"setHumidity":"12"}' http:/
---
-#### `PUT`: `http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed`
+#### `PUT`: `http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed`
This `PUT` command will emulate the "door-closed" state sensed by the controller board as a persistent value.
@@ -231,13 +231,13 @@ This `PUT` command will emulate the "door-closed" state sensed by the controller
Simple usage example:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:59882/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:59882/api/v3/device/name/controller-board/setDoorClosed
```
This will make the request directly to the device service itself instead of proxying through the EdgeX command API:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed
```
!!! success
@@ -265,34 +265,34 @@ The following picture illustrates the flow to calculate the inventory deltas bet
-The Automated Checkout architecture uses three MQTT topics:
+The Automated Vending architecture uses three MQTT topics:
| Topic | Description |
| ----------------------------- | ------------------------------------------------------------------------------------------------ |
-| Inference/CommandTopic | All events pushed from EdgeX's command API are fed into this topic. The [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) and [`as-controller-board-status`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-controller-board-status) are two services that make requests to this API, typically for making door close/open and heartbeat events. |
-| Inference/ResponseTopic | The Automated Checkout cv inference service will respond to published messages on the `Inference/CommandTopic` topic on the `Inference/ResponseTopic` topic. |
-| Inference/DataTopic | The cv inference service publishes delta SKUs on this topic, then the MQTT device service converts them into EdgeX event readings, and finally the [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) service processes the event readings and pushes them to downstream services. |
+| Inference/CommandTopic | All events pushed from EdgeX's command API are fed into this topic. The [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) and [`as-controller-board-status`](https://github.com/intel-retail/automated-vending/tree/main/as-controller-board-status) are two services that make requests to this API, typically for making door close/open and heartbeat events. |
+| Inference/ResponseTopic | The Automated Vending cv inference service will respond to published messages on the `Inference/CommandTopic` topic on the `Inference/ResponseTopic` topic. |
+| Inference/DataTopic | The cv inference service publishes delta SKUs on this topic, then the MQTT device service converts them into EdgeX event readings, and finally the [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) service processes the event readings and pushes them to downstream services. |
### CV inference APIs
---
-#### `GET`: `http://localhost:59982/api/v2/device/name/Inference-device/inferenceHeartbeat`
+#### `GET`: `http://localhost:59982/api/v3/device/name/Inference-device/inferenceHeartbeat`
-The `GET` call to the EdgeX MQTT device service's `inferenceHearbeat` command will act as a health-check for the Automated Checkout cv inference service. It must return `200 OK` upon swiping an RFID card in order for the vending workflow to begin. If it does not, the [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) service will enter maintenance mode.
+The `GET` call to the EdgeX MQTT device service's `inferenceHearbeat` command will act as a health-check for the Automated Vending cv inference service. It must return `200 OK` upon swiping an RFID card in order for the vending workflow to begin. If it does not, the [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) service will enter maintenance mode.
Simple usage example:
Through EdgeX command API:
```bash
-curl -X GET http://localhost:59882/api/v2/device/name/Inference-device/inferenceHeartbeat
+curl -X GET http://localhost:59882/api/v3/device/name/Inference-device/inferenceHeartbeat
```
To MQTT device service itself:
```bash
-curl -X GET http://localhost:59982/api/v2/device/name/Inference-device/inferenceHeartbeat
+curl -X GET http://localhost:59982/api/v3/device/name/Inference-device/inferenceHeartbeat
```
Sample response, `200 OK`:
@@ -314,7 +314,7 @@ Sample response, `200 OK`:
---
-#### `PUT`: `http://localhost:59982/api/v2/device/name/Inference-device/inferenceDoorStatus`
+#### `PUT`: `http://localhost:59982/api/v3/device/name/Inference-device/inferenceDoorStatus`
The `PUT` call to the EdgeX MQTT device service's `inferenceDoorStatus` command will cause the cv inference service to consume the message, and if the JSON `PUT` key `inferenceDoorStatus` has the string value `"true"`, an inference attempt will begin. The service will subsequently respond with a message containing the inventory delta (aka SKU delta).
@@ -323,13 +323,13 @@ Simple usage example:
Through EdgeX command API:
```bash
-curl -X PUT -d '{"inferenceDoorStatus":"true"}' http://localhost:59882/api/v2/device/name/Inference-device/inferenceDoorStatus
+curl -X PUT -d '{"inferenceDoorStatus":"true"}' http://localhost:59882/api/v3/device/name/Inference-device/inferenceDoorStatus
```
To MQTT device service itself:
```bash
-curl -X PUT -d '{"inferenceDoorStatus":"true"}' http://localhost:59982/api/v2/device/name/Inference-device/inferenceDoorStatus
+curl -X PUT -d '{"inferenceDoorStatus":"true"}' http://localhost:59982/api/v3/device/name/Inference-device/inferenceDoorStatus
```
!!! success
diff --git a/docs_src/automated-checkout-services/micro_services.md b/docs_src/automated-vending-services/micro_services.md
similarity index 89%
rename from docs_src/automated-checkout-services/micro_services.md
rename to docs_src/automated-vending-services/micro_services.md
index a4930cc..0047ad7 100644
--- a/docs_src/automated-checkout-services/micro_services.md
+++ b/docs_src/automated-vending-services/micro_services.md
@@ -1,11 +1,11 @@
# Other Microservices
-The Automated Checkout reference implementation utilizes three services that expose REST API endpoints. These three services handle business logic for the Automated Checkout reference implementation, and are somewhat generic in their design patterns, so for the purposes of the reference implementation, we simply refer to them "microservices".
+The Automated Vending reference implementation utilizes three services that expose REST API endpoints. These three services handle business logic for the Automated Vending reference implementation, and are somewhat generic in their design patterns, so for the purposes of the reference implementation, we simply refer to them "microservices".
## List of microservices
- [Authentication](#authentication-service) - Service that takes a card ID number and returns authentication/authorization status for the card number.
-- [Inventory](#inventory-service) - Service that manages changes to the Automated Checkout's inventory, including storing transactions in an audit log.
+- [Inventory](#inventory-service) - Service that manages changes to the Automated Vending's inventory, including storing transactions in an audit log.
- [Ledger](#ledger-service) - Service that stores customer financial transactions.
## Authentication service
@@ -16,14 +16,14 @@ The `ms-authentication` microservice is a service that works with EdgeX to expos
This repository contains logic for working within the following schemas:
-- _Card/Cards_ - swiping a card is what allows the Automated Checkout automation to proceed with its workflow. A card can be associated with one of 3 roles:
+- _Card/Cards_ - swiping a card is what allows the Automated Vending automation to proceed with its workflow. A card can be associated with one of 3 roles:
- Consumer - a typical customer; is expected to open the vending machine door, remove an item, close the door and be charged accordingly
- Stocker - a person that is authorized to re-stock the vending machine with new products
- Maintainer - a person that is authorized to fix the software/hardware
- _Account/Accounts_ - represents a bank account to charge. Multiple people can be associated with an account, such as a married couple
- _Person/People_ - a person can carry multiple cards but is only associated with one account
-The [`ds-card-reader`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-card-reader) service is responsible for pushing card "swipe" events to the EdgeX framework, which will then feed into the [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) microservice that then performs a REST HTTP API call to this microservice. The response is processed by the [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) microservice and the workflow continues there.
+The [`ds-card-reader`](https://github.com/intel-retail/automated-vending/tree/main/ds-card-reader) service is responsible for pushing card "swipe" events to the EdgeX framework, which will then feed into the [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) microservice that then performs a REST HTTP API call to this microservice. The response is processed by the [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) microservice and the workflow continues there.
### Authentication service APIs
@@ -78,7 +78,7 @@ This repository contains logic for working within the following schemas:
- `minRestockingLevel` - the minimum allowable number of units of this type to be stored in the vending machine
- `createdAt` - the date the inventory item was created and catalogued
- `updatedAt` - the date the inventory item was last updated (either via a transaction or something else)
- - `isActive` - whether or not the inventory item is "active", which is not currently actively used by the Automated Checkout reference implementation for any specific purposes
+ - `isActive` - whether or not the inventory item is "active", which is not currently actively used by the Automated Vending reference implementation for any specific purposes
- _Audit Log_ - an audit log entry contains the following attributes:
- `cardId` - card number
- `accountId` - account number
@@ -88,7 +88,7 @@ This repository contains logic for working within the following schemas:
- `createdAt` - the transaction date
- `auditEntryId` - and a UUID representing the transaction itself uniquely
-The `ms-inventory` microservice receives REST API calls from the upstream [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) application service during a typical vending workflow. Typically, an individual will swipe a card, the workflow will start, and the inventory will be manipulated after an individual has removed or added items to the vending machine and an inference has completed. REST API calls to this service are not locked behind any authentication mechanism.
+The `ms-inventory` microservice receives REST API calls from the upstream [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) application service during a typical vending workflow. Typically, an individual will swipe a card, the workflow will start, and the inventory will be manipulated after an individual has removed or added items to the vending machine and an inference has completed. REST API calls to this service are not locked behind any authentication mechanism.
### Inventory service APIs
@@ -351,7 +351,7 @@ If the `{auditEntryId}` parameter does not correspond to an existing audit log e
The `ms-ledger` microservice updates a ledger with the current transaction information (products purchased, quantity, total price, transaction timestamp). Transactions are added to the consumer's account. Transactions also have an `isPaid` attribute to designate which transactions have been paid/unpaid.
-This microservice returns the current transaction to the [`as-vending`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) microservice, which then calls the [`ds-controller-board`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-controller-board) microservice to display the items purchased and the total price of the transaction on the LCD.
+This microservice returns the current transaction to the [`as-vending`](https://github.com/intel-retail/automated-vending/tree/main/as-vending) microservice, which then calls the [`ds-controller-board`](https://github.com/intel-retail/automated-vending/tree/main/ds-controller-board) microservice to display the items purchased and the total price of the transaction on the LCD.
### Ledger service APIs
diff --git a/docs_src/configuration.md b/docs_src/configuration.md
index d6c191f..c005778 100644
--- a/docs_src/configuration.md
+++ b/docs_src/configuration.md
@@ -1,29 +1,13 @@
# Configuration
-This page lists all of the relevant configuration parameters for each service in the Automated Checkout reference implementation.
+This page lists all of the relevant configuration parameters for each service in the Automated Vending reference implementation.
!!!info
- Note that this document likely does not cover EdgeX-specific configuration parameters. Application and device service SDK documentation can be found in the [EdgeX Foundry GitHub repositories](https://github.com/edgexfoundry) or in the [official EdgeX documentation here](https://docs.edgexfoundry.org/2.2/).
+ Note that this document likely does not cover EdgeX-specific configuration parameters. Application and device service SDK documentation can be found in the [EdgeX Foundry GitHub repositories](https://github.com/edgexfoundry) or in the [official EdgeX documentation here](https://docs.edgexfoundry.org/3.0/).
## Environment overrides
-The simplest way to change one of the configuration values described below is via the use of environment variable overrides in the docker compose file. The value of each configuration item in a service's configuration can be overridden with an environment variable specific to that item. The name of the environment variable is the path to the item in the configuration tree with underscores separating the nodes. The character case of each node in the environment variable name must match that found in the service's configuration. Here are a few examples for the `DriverConfig` section:
-
-```toml
-[DriverConfig]
- VID = "65535" # 0xFFFF
- PID = "53" # 0x0035
-```
-
-```yaml
-Driver_VID: "256" ** Good **
-Driver_PID: "26" ** Good **
-
-DRIVER_VID: "256" ** BAD **
-driver_pid: "26" ** BAD **
-```
-
-These overrides are placed in the target service's environment section of the compose file. Here is an example:
+The simplest way to change one of the service's configuration values described below is via the use of environment variable overrides in the docker compose file. The value of each configuration item in a service's configuration can be overridden with an environment variable specific to that item. The name of the environment variable is the path to the item in the configuration tree with underscores separating the nodes. The enviroment variable name is upper case version of the setting that found in the service's configuration. These overrides are placed in the target service's environment section of the compose file. Here is an example:
```yaml
ds-card-reader:
@@ -39,7 +23,7 @@ These overrides are placed in the target service's environment section of the co
## Card reader device service
-The following items can be configured via the `DriverConfig` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-card-reader/res/configuration.toml) file. All values are strings.
+The following items can be configured via the `DriverConfig` section of the service's [configuration.yaml](https://github.com/intel-retail/automated-vending/blob/Edgex-3.0/ds-card-reader/res/configuration.yaml) file. All values are strings.
- `DeviceSearchPath` - the bash globstar expression to use when searching for the raw input device, default is `/dev/input/event*`
- `VID` - the `uint16` value (as a base-10 string) corresponding to the Vendor ID of the USB device (run `lsusb` to list VID and PID values of connected USB devices). For example, if the VID is `ffff` in the output of `lsusb`, it is `"65535"` in the configuration file
@@ -48,7 +32,7 @@ The following items can be configured via the `DriverConfig` section of the serv
## Controller board device service
-The following items can be configured via the `DriverConfig` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-controller-board/res/configuration.toml) file. All values are strings.
+The following items can be configured via the `DriverConfig` section of the service's [configuration.yaml](https://github.com/intel-retail/automated-vending/blob/Edgex-3.0/ds-controller-board/res/configuration.yaml) file. All values are strings.
- `DisplayTimeout` - The value in seconds corresponding to the display timeout length before resetting the display to the status display.
- `LockTimeout` - The value in seconds corresponding to the lock timeout used to automatically lock the door in case no lock command was sent
@@ -58,19 +42,20 @@ The following items can be configured via the `DriverConfig` section of the serv
## EdgeX MQTT device service
-This reference implementation uses the [MQTT Device Service](https://github.com/edgexfoundry/device-mqtt-go) from EdgeX with custom device profiles. These device profiles YAML files are located [here](https://github.com/intel-iot-devkit/automated-checkout/blob/master/res/device-mqtt/profiles/inference-mqtt-device-profile.yml) and are volume mounted into the device service's running Docker container.
+This reference implementation uses the [MQTT Device Service](https://github.com/edgexfoundry/device-mqtt-go) from EdgeX with custom device profiles. These device profiles YAML files are located [here](https://github.com/intel-retail/automated-vending/tree/main/res/device-mqtt/profiles/inference-mqtt-device-profile.yml) and are volume mounted into the device service's running Docker container.
-The following items can be configured via `MQTTBrokerInfo` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/res/device-mqtt/configuration.toml) file. All values are strings.
+The following `MQTTBrokerInfo` configuration items can be configured via `device-mqtt.environment` section of the service's [docker-compose.edgex.yml](https://github.com/intel-retail/automated-vending/tree/main/docker-compose.edgex.yml) file.
-`MQTTBrokerInfo`
+`MQTTBrokerInfo via device-mqtt.environment`
-- `Schema` - Data schema type, aka protocol
-- `Host` - Host name of the response MQTT Broker
-- `Port` - Port number of the response MQTT Broker
-- `Qos` - Quality of service agreement between sender and receiver
-- `KeepAlive` - Keep alive duration for the response MQTT Broker
-- `ClientId` - Client ID for the response MQTT Broker
-- `ResponseTopic` - Subscribe topic for the response MQTT Broker
+- `MQTTBROKERINFO_SCHEMA` - Data schema type, aka protocol
+- `MQTTBROKERINFO_HOST` - Host name of the response MQTT Broker
+- `MQTTBROKERINFO_PORT` - Port number of the response MQTT Broker
+- `MQTTBROKERINFO_QOS` - Quality of service agreement between sender and receiver
+- `MQTTBROKERINFO_KEEPALIVE` - Keep alive duration for the response MQTT Broker
+- `MQTTBROKERINFO_CLIENTID` - Client ID for the response MQTT Broker
+- `MQTTBROKERINFO_INCOMINGTOPIC` - Subscribe topic for incoming data from MQTT Broker
+- `MQTTBROKERINFO_RESPONSETOPIC` - Subscribe topic for the response MQTT Broker
## CV inference device service
@@ -101,7 +86,7 @@ Example:
## Controller board status application service
-The following items can be configured via the `ControllerBoardStatus` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-controller-board-status/res/configuration.toml) file. All values are strings.
+The following items can be configured via the `ControllerBoardStatus` section of the service's [configuration.yaml](https://github.com/intel-retail/automated-vending/blob/Edgex-3.0/as-controller-board-status/res/configuration.yaml) file. All values are strings.
- `AverageTemperatureMeasurementDuration` - The time-duration string (i.e. `-15s`, `-10m`) value of how long to process temperature measurements for calculating an average temperature. This calculation determines how quickly a "temperature threshold exceeded" notification is sent
- `DeviceName` - The string name of the upstream EdgeX device that will be pushing events & readings to this application service
@@ -112,7 +97,7 @@ The following items can be configured via the `ControllerBoardStatus` section of
- `NotificationEmailAddresses` - A comma-separated values (CSV) string of emails to send notifications to
- `NotificationLabels` - A comma-separated values (CSV) string of labels to apply to notifications, which are handled by EdgeX
- `NotificationReceiver` - The human-readable string name of the person/entity receiving the notification, such as `System Administrator`
-- `NotificationSender` - The human-readable string name of the person/entity sending the notification, such as `Automated Checkout Maintenance Notification`
+- `NotificationSender` - The human-readable string name of the person/entity sending the notification, such as `Automated Vending Maintenance Notification`
- `NotificationSeverity` - A string tag indicating the severity of the notification, such as `CRITICAL`
- `NotificationName` - A string that is a short label that may be used as part of a URL to delineate the notification subscription, such as `sys-admin`. The EdgeX official documentation says, _"Effectively a name or key that labels the notification"_.
- `NotificationSubscriptionMaxRESTRetries` - The integer value that represents the maximum number of times to try creating a subscription in the EdgeX notification service, such as `10`
@@ -124,7 +109,7 @@ The following items can be configured via the `ControllerBoardStatus` section of
## Vending application service
-The following items can be configured via the `ApplicationSettings` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending/res/configuration.toml) file. All values are strings.
+The following items can be configured via the `ApplicationSettings` section of the service's [configuration.yaml](https://github.com/intel-retail/automated-vending/blob/Edgex-3.0/as-vending/res/configuration.yaml) file. All values are strings.
- `AuthenticationEndpoint` - Endpoint for authentication microservice
- `ControllerBoarddisplayResetCmd` - EdgeX Command service command for Resetting the LCD text
@@ -157,6 +142,6 @@ For this particular microservice, there are no specific configuration options. F
## Ledger microservice
-The following items can be configured via the `[ApplicationSettings]` section of the service's [configuration.toml](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-ledger/res/configuration.toml) file. All values are strings.
+The following items can be configured via the `[ApplicationSettings]` section of the service's [configuration.yaml](https://github.com/intel-retail/automated-vending/blob/Edgex-3.0/ms-ledger/res/configuration.yaml) file. All values are strings.
- `InventoryEndpoint` - Endpoint that correlates to the Inventory microservice. This is used to query Inventory data used to generate the ledgers.
diff --git a/docs_src/events.md b/docs_src/events.md
index 9a0c8d3..e56d930 100644
--- a/docs_src/events.md
+++ b/docs_src/events.md
@@ -1,10 +1,10 @@
-# Automated Checkout Events
+# Automated Vending Events
-The following are the different events used in the Automated Checkout reference implementation.
+The following are the different events used in the Automated Vending reference implementation.
## Card reader events
-[`ds-card-reader`](./automated-checkout-services/device_services.md#card-reader) uses the EdgeX events pattern to send the card information into EdgeX Core Data as well as maintain a healthy state.
+[`ds-card-reader`](./automated-vending-services/device_services.md#card-reader) uses the EdgeX events pattern to send the card information into EdgeX Core Data as well as maintain a healthy state.
`card-number` is an asynchronous event sent when a card is scanned by the card reader device. The event reading value is a string containing a 10-digit number and is placed into EdgeX Core Data as an event reading.
@@ -16,7 +16,7 @@ The following are the different events used in the Automated Checkout reference
## Controller board events
-[`ds-controller-board`](./automated-checkout-services/device_services.md#controller-board) uses the EdgeX events pattern to send the card information into EdgeX Core Data.
+[`ds-controller-board`](./automated-vending-services/device_services.md#controller-board) uses the EdgeX events pattern to send the card information into EdgeX Core Data.
`controller-board-status` is an auto-event used to send the current state of the controller board and all of its periferals to EdgeX Core Data. This data is used by the as-controller-board-status application service to determine the state of the system. The information included in the status are the door lock states, door state, temperature, and humidity. The EdgeX Reading value is a string containing the following JSON:
@@ -30,7 +30,7 @@ The following are the different events used in the Automated Checkout reference
}
```
-The following commands are also available to the ds-controller-board. More details can be found [`here`](./automated-checkout-services/device_services.md#controller-board).
+The following commands are also available to the ds-controller-board. More details can be found [`here`](./automated-vending-services/device_services.md#controller-board).
- `lock1`
- `lock2`
@@ -44,7 +44,7 @@ The following commands are also available to the ds-controller-board. More detai
## Computer vision inference events
-The [`ds-cv-inference`](./automated-checkout-services/device_services.md#cv-inference) uses the EdgeX MQTT Device Service to send status updates and inference deltas to the EdgeX Core Data. The MQTT device service profile can be found in the file `./res/device-mqtt/profile/inference-mqtt-device-profile.yml`, in the root of this GitHub repository.
+The [`ds-cv-inference`](./automated-vending-services/device_services.md#cv-inference) uses the EdgeX MQTT Device Service to send status updates and inference deltas to the EdgeX Core Data. The MQTT device service profile can be found in the file `./res/device-mqtt/profile/inference-mqtt-device-profile.yml`, in the root of this GitHub repository.
`inferenceHeartbeat` is an asynchronous event that is pushed to EdgeX Core Data when the inference is pinged by another service to verify it is functioning. If the inference is working properly the `inferencePong` response is sent as the event reading.
@@ -63,4 +63,4 @@ The [`ds-cv-inference`](./automated-checkout-services/device_services.md#cv-infe
]
```
-Finally the `inferenceDoorStatus` command is defined by the custom device profile for the EdgeX MQTT Device Service which sends the ping request to the CV inference service. More details can be found [here](./automated-checkout-services/device_services.md#cv-inference).
+Finally the `inferenceDoorStatus` command is defined by the custom device profile for the EdgeX MQTT Device Service which sends the ping request to the CV inference service. More details can be found [here](./automated-vending-services/device_services.md#cv-inference).
diff --git a/docs_src/images/automated-checkout-reference-implementation.png b/docs_src/images/automated-vending-reference-implementation.png
similarity index 100%
rename from docs_src/images/automated-checkout-reference-implementation.png
rename to docs_src/images/automated-vending-reference-implementation.png
diff --git a/docs_src/images/automated-checkout.png b/docs_src/images/automated-vending.png
similarity index 100%
rename from docs_src/images/automated-checkout.png
rename to docs_src/images/automated-vending.png
diff --git a/docs_src/index.md b/docs_src/index.md
index 6eef4c2..ff88a17 100644
--- a/docs_src/index.md
+++ b/docs_src/index.md
@@ -1,33 +1,33 @@
-# Automated Checkout Reference Implementation
+# Automated Vending Reference Implementation
## Introduction
-This guide helps you build and run the Automated Checkout Reference Implementation.
+This guide helps you build and run the Automated Vending Reference Implementation.
Upon completing the steps in this guide, you will be ready to integrate sensors and services to build your own complete solution.
!!! info
- This guide does not create a complete, ready-to-use solution. Instead, upon completing the steps in this guide, you will be ready to integrate sensors and services to build your own Automated Checkout solution.
+ This guide does not create a complete, ready-to-use solution. Instead, upon completing the steps in this guide, you will be ready to integrate sensors and services to build your own Automated Vending solution.
Certain third-party software or hardware identified in this document only may be used upon securing a license directly from the third-party software or hardware owner. The identification of non-Intel software, tools, or services in this document does not constitute a sponsorship, endorsement, or warranty by Intel.
-
+
### Block diagram
-The high-level diagram below shows the sensors and services used with the Automated Checkout Reference Implementation. The diagram shows the sensors and services, and how they communicate through EdgeX. Intel provides the services outlined in blue, the purple services are provided by EdgeX, and the black services are either simulated or can interface with real hardware.
+The high-level diagram below shows the sensors and services used with the Automated Vending Reference Implementation. The diagram shows the sensors and services, and how they communicate through EdgeX. Intel provides the services outlined in blue, the purple services are provided by EdgeX, and the black services are either simulated or can interface with real hardware.
-![Automated Checkout Reference Implementation Diagram](./images/automated-checkout-reference-implementation.png)
+![Automated Vending Reference Implementation Diagram](./images/automated-vending-reference-implementation.png)
### Prerequisites
-The following items are required to build the Automated Checkout Reference Implementation. You will need additional hardware and software when you are ready to build your own solution.
+The following items are required to build the Automated Vending Reference Implementation. You will need additional hardware and software when you are ready to build your own solution.
-- **A deep learning model for CV inferencing.** Intel provides a reference inference service using openVINO that produces inventory changes based on preloaded images. See [cv inference service](./automated-checkout-services/device_services.md#cv-inference) for information on this process.
-- **A device that allows badging-in to the Automated Checkout.** Intel provides a card reader service that can be simulated or integrated with a physical USB device. See the [Card Reader](./automated-checkout-services/device_services.md#card-reader) device service page for information on this service.
-- **A controller device that locks the door to the Automated Checkout**, as well as providing readouts (such as a small text-based LCD screen) to display authorization state, items purchased, and other sensor readings. This could be an Arduino-powered circuit. Intel provides a display service that can run in a simulated mode or with a physical USB/serial interface. See the [Controller Board](./automated-checkout-services/device_services.md#controller-board) device service page for implementation details.
+- **A deep learning model for CV inferencing.** Intel provides a reference inference service using openVINO that produces inventory changes based on preloaded images. See [cv inference service](./automated-vending-services/device_services.md#cv-inference) for information on this process.
+- **A device that allows badging-in to the Automated Vending.** Intel provides a card reader service that can be simulated or integrated with a physical USB device. See the [Card Reader](./automated-vending-services/device_services.md#card-reader) device service page for information on this service.
+- **A controller device that locks the door to the Automated Vending**, as well as providing readouts (such as a small text-based LCD screen) to display authorization state, items purchased, and other sensor readings. This could be an Arduino-powered circuit. Intel provides a display service that can run in a simulated mode or with a physical USB/serial interface. See the [Controller Board](./automated-vending-services/device_services.md#controller-board) device service page for implementation details.
- Ubuntu 20.04.5
- Docker
@@ -52,21 +52,21 @@ Additionally, frequently throughout this documentation, we will refer to a "cool
### Recommended domain knowledge
-- EdgeX - the Automated Checkout reference implementation utilizes the EdgeX framework
+- EdgeX - the Automated Vending reference implementation utilizes the EdgeX framework
- MQTT
- REST
- evdev , if reading input events from a USB input device, such as a card reader that inputs key strokes upon scanning a card
- Communication over serial on Linux, if using serial devices such as Arduino
- Computer Vision concepts, if using CV inferencing components
- Basic RFID concepts, if using RFID components (i.e. for badge-in card reader)
-- Portainer - included with the Automated Checkout reference implementation. Usage is optional, but this is a highly recommended utility for managing Docker containers, and we provide easy ways to run it.
+- Portainer - included with the Automated Vending reference implementation. Usage is optional, but this is a highly recommended utility for managing Docker containers, and we provide easy ways to run it.
## Getting started
### Step 1: Clone the repository
```bash
-git clone https://github.com/intel-iot-devkit/automated-checkout.git && cd ./automated-checkout
+git clone https://github.com/intel-retail/automated-vending.git && cd ./automated-vending
```
### Step 2: Build the reference implementation
@@ -85,20 +85,20 @@ make docker
Make sure the command was successful. To do so, run:
```bash
-docker images | grep automated-checkout
+docker images | grep automated-vending
```
!!! success
The results are:
- - `automated-checkout/as-controller-board-status`
- - `automated-checkout/as-vending`
- - `automated-checkout/ds-card-reader`
- - `automated-checkout/ds-controller-board`
- - `automated-checkout/ds-cv-inference`
- - `automated-checkout/ms-authentication`
- - `automated-checkout/ms-inventory`
- - `automated-checkout/ms-ledger`
+ - `automated-vending/as-controller-board-status`
+ - `automated-vending/as-vending`
+ - `automated-vending/ds-card-reader`
+ - `automated-vending/ds-controller-board`
+ - `automated-vending/ds-cv-inference`
+ - `automated-vending/ms-authentication`
+ - `automated-vending/ms-inventory`
+ - `automated-vending/ms-ledger`
!!! failure
If you do not see all of the above docker images, look through the console output for errors. Sometimes dependencies fail to resolve and must be run again. Address obvious issues. To try again, repeat step 2.
@@ -111,7 +111,7 @@ Use Docker Compose to start the reference implementation suite. To do so, run:
make run
```
-This command starts the EdgeX Device Services and then starts all the Automated Checkout Reference Implementation Services.
+This command starts the EdgeX Device Services and then starts all the Automated Vending Reference Implementation Services.
#### Check for success
@@ -126,22 +126,22 @@ docker ps --format 'table{{.Image}}\t{{.Status}}'
| IMAGE | STATUS |
|------------------------------------------------------|-------------------|
- | automated-checkout/ms-ledger:dev | Up 53 seconds |
- | eclipse-mosquitto:2.0.14 | Up 52 seconds |
- | automated-checkout/as-vending:dev | Up 52 seconds |
- | automated-checkout/ms-inventory:dev | Up 52 seconds |
- | automated-checkout/ds-controller-board:dev | Up 52 seconds |
- | automated-checkout/ms-authentication:dev | Up 55 seconds |
- | edgexfoundry/device-mqtt:2.2.0 | Up 53 seconds |
- | automated-checkout/ds-card-reader:dev | Up 53 seconds |
- | automated-checkout/as-controller-board-status:dev | Up 52 seconds |
- | edgexfoundry/core-command:2.2.0 | Up About a minute |
- | edgexfoundry/core-data:2.2.0 | Up About a minute |
- | edgexfoundry/core-metadata:2.2.0 | Up About a minute |
- | edgexfoundry/support-notifications:2.2.0 | Up About a minute |
- | edgexfoundry/consul:1.10.10 | Up About a minute |
- | automated-checkout/ds-cv-inference:dev | Up 51 seconds |
- | redis:6.2-alpine | Up About a minute |
+ | automated-vending/ms-ledger:dev | Up 53 seconds |
+ | eclipse-mosquitto:2.0.15 | Up 52 seconds |
+ | automated-vending/as-vending:dev | Up 52 seconds |
+ | automated-vending/ms-inventory:dev | Up 52 seconds |
+ | automated-vending/ds-controller-board:dev | Up 52 seconds |
+ | automated-vending/ms-authentication:dev | Up 55 seconds |
+ | edgexfoundry/device-mqtt:3.0.0 | Up 53 seconds |
+ | automated-vending/ds-card-reader:dev | Up 53 seconds |
+ | automated-vending/as-controller-board-status:dev | Up 52 seconds |
+ | edgexfoundry/core-command:3.0.0 | Up About a minute |
+ | edgexfoundry/core-data:3.0.0 | Up About a minute |
+ | edgexfoundry/core-metadata:3.0.0 | Up About a minute |
+ | edgexfoundry/support-notifications:3.0.0 | Up About a minute |
+ | edgexfoundry/consul:1.15.2 | Up About a minute |
+ | automated-vending/ds-cv-inference:dev | Up 51 seconds |
+ | redis:7.0.11-alpine | Up About a minute |
You can also use Portainer to check the status of the services. You must run Portainer service first:
@@ -155,15 +155,15 @@ Then, navigate to the following Portainer URL and create an admin account:
http://127.0.0.1:9000
-After, navigate to the following URL to list all of the containers running under the `automated-checkout` stack:
+After, navigate to the following URL to list all of the containers running under the `automated-vending` stack:
- http://127.0.0.1:9000/#/stacks/automated-checkout?type=2&external=true
+ http://127.0.0.1:9000/#/stacks/automated-vending?type=2&external=true
### Step 4: Dive in
-All of the core components of Automated Checkout are up and running, and you are ready to begin going through the following phases.
+All of the core components of Automated Vending are up and running, and you are ready to begin going through the following phases.
- [Phase 1](./phases/phase1.md) - Simulate data and inferencing, and simulate events
- [Phase 2](./phases/phase2.md) - Add Card Reader Device
@@ -171,26 +171,26 @@ All of the core components of Automated Checkout are up and running, and you are
## General Guidance
-After completing the steps in the Getting Started section, it may be helpful to read through the remainder of this document for some further guidance on the Automated Checkout reference implementation.
+After completing the steps in the Getting Started section, it may be helpful to read through the remainder of this document for some further guidance on the Automated Vending reference implementation.
### How to use the Compose Files
-The docker-compose files are segmented to allow for fine control of physical and simulated devices, as well as allowing you the choice of running Portainer. Use the [`makefile`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/Makefile) to manage the various compose files:
+The docker-compose files are segmented to allow for fine control of physical and simulated devices, as well as allowing you the choice of running Portainer. Use the [`makefile`](https://github.com/intel-retail/automated-vending/tree/main/Makefile) to manage the various compose files:
| Compose file | Purpose | Makefile Command |
|---------------------------|-------------------------------------------------|--------------------------------------|
| Portainer | Container management | `make run-portainer` |
-| All Services (simulated) | Automated Checkout and EdgeX services | `make run` |
+| All Services (simulated) | Automated Vending and EdgeX services | `make run` |
| Physical Environment | Mounts physical devices | `make run-physical` |
| Physical Card Reader | Allows just the card reader to be physical | `make run-physical-card-reader` |
| Physical Controller Board | Allows just the controller board to be physical | `make run-physical-controller-board` |
### Expanding the Reference Implementation
-The reference implementation you created is not a complete solution. It provides the base components for creating a framework to run a CV-powered Automated Checkout. It is your choice on how many and which sensors and devices to include. This section provides information about components you might want to include or replace.
+The reference implementation you created is not a complete solution. It provides the base components for creating a framework to run a CV-powered Automated Vending. It is your choice on how many and which sensors and devices to include. This section provides information about components you might want to include or replace.
| Component | Description |
|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| RFID card reader | A card reader device service is provided for a USB based RFID card reader. As an alternative, you can also use a regular USB keyboard to enter 10-digit number. See *[Phase 2 - Add Card Reader Device](./phases/phase2.md)* for more information. |
-| Micro-controller board | A controller board device service is provided for an Arduino based micro-controller. This micro-controller is in charge of controlling the locks of the automated checkout door and the LED display. Also, it uses modules such as temperature and humidity. See *[Phase 3 - Bring Your Own Hardware and Software](./phases/phase3.md)* for more information. |
-| Deep learning model | The Automated Checkout reference implementation provides a computer vision inference service using openVINO inference engine and openVINO product detection model for demonstration purposes. See more information [here](./automated-checkout-services/device_services.md#cv-inference). You can create your own service and send events to EdgeX using the [EdgeX MQTT Device Service](https://github.com/edgexfoundry/device-mqtt-go). |
+| Micro-controller board | A controller board device service is provided for an Arduino based micro-controller. This micro-controller is in charge of controlling the locks of the automated vending door and the LED display. Also, it uses modules such as temperature and humidity. See *[Phase 3 - Bring Your Own Hardware and Software](./phases/phase3.md)* for more information. |
+| Deep learning model | The Automated Vending reference implementation provides a computer vision inference service using openVINO inference engine and openVINO product detection model for demonstration purposes. See more information [here](./automated-vending-services/device_services.md#cv-inference). You can create your own service and send events to EdgeX using the [EdgeX MQTT Device Service](https://github.com/edgexfoundry/device-mqtt-go). |
diff --git a/docs_src/modifying_source_code.md b/docs_src/modifying_source_code.md
index 2c9a390..47d0606 100644
--- a/docs_src/modifying_source_code.md
+++ b/docs_src/modifying_source_code.md
@@ -1,10 +1,10 @@
# Modifying source code
-When modifying source code in the Automated Checkout reference implementation, Docker images need to be rebuilt and services need to be updated to run newly built images. This document contains the steps for accomplishing this.
+When modifying source code in the Automated Vending reference implementation, Docker images need to be rebuilt and services need to be updated to run newly built images. This document contains the steps for accomplishing this.
## Assumptions
-This document assumes the Automated Checkout services are already running. Additionally, it assumes you've already made a code change and saved the changes.
+This document assumes the Automated Vending services are already running. Additionally, it assumes you've already made a code change and saved the changes.
## Building the service's new image
@@ -22,11 +22,11 @@ Next, build the specific service's image:
make ds-card-reader
```
-After Docker builds the image (by executing the steps in [`ds-card-reader/Dockerfile`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-card-reader/Dockerfile)), proceed to the next section.
+After Docker builds the image (by executing the steps in [`ds-card-reader/Dockerfile`](https://github.com/intel-retail/automated-vending/tree/main/ds-card-reader/Dockerfile)), proceed to the next section.
## Remove and update the running service
-One of the most effective methods of updating a Docker compose service is to remove the running container, and then re-run the `make` commands to bring up the entire Automated Checkout reference implementation stack.
+One of the most effective methods of updating a Docker compose service is to remove the running container, and then re-run the `make` commands to bring up the entire Automated Vending reference implementation stack.
First, identify the running container for the service (again, `ds-card-reader` in this example):
diff --git a/docs_src/phases/phase1.md b/docs_src/phases/phase1.md
index d8c96cf..a675db0 100644
--- a/docs_src/phases/phase1.md
+++ b/docs_src/phases/phase1.md
@@ -2,9 +2,9 @@
## Overview
-This document aims to help provide a simple introduction to how we interact with the various microservices in the Automated Checkout reference implementation, as well as demonstrating how EdgeX command API's are leveraged.
+This document aims to help provide a simple introduction to how we interact with the various microservices in the Automated Vending reference implementation, as well as demonstrating how EdgeX command API's are leveraged.
-The steps in this guide show how to simulate the automated checkout workflow using [`curl`](https://github.com/curl/curl) REST API calls. It is a step-by-step walkthrough with specific commands to run on the command line.
+The steps in this guide show how to simulate the Automated Vending workflow using [`curl`](https://github.com/curl/curl) REST API calls. It is a step-by-step walkthrough with specific commands to run on the command line.
The documentation in [phase 2](./phase2.md) and [phase 3](./phase3.md) will discuss more advanced methods of adding physical hardware and customized device services.
@@ -49,7 +49,7 @@ If `maintenanceMode` is set to true, run the following command to reset state ma
docker-compose -f docker-compose.ac.yml restart as-vending ds-controller-board as-controller-board-status
```
-1. In a separate terminal window, watch the logs for a few Automated Checkout services, so that incoming events can be seen:
+1. In a separate terminal window, watch the logs for a few Automated Vending services, so that incoming events can be seen:
```bash
docker-compose -f docker-compose.ac.yml logs -f ds-card-reader ds-controller-board ms-authentication as-vending as-controller-board-status
@@ -74,7 +74,7 @@ Each section below contains specific steps and expected output for each of the s
### 1. Stock the cooler with inventory
-In order to fill up the cooler with inventory, someone acting as a "stocker" must swipe their card and proceed to fill the Automated Checkout with products.
+In order to fill up the cooler with inventory, someone acting as a "stocker" must swipe their card and proceed to fill the Automated Vending with products.
However, before we get started, it's important to keep a few things in mind. We will perform a very specific sequence of events:
@@ -99,7 +99,7 @@ For visualization purposes, the CV inference service serves the post-processed i
It's OK to run the commands without critically analyzing them _in the moment_. You may find it most useful to review them in advance.
- If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Checkout data and containers, wait approximately one minute after all services have started, and begin again. This scenario does not have any dependencies on the other scenarios in phase 1.
+ If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Vending data and containers, wait approximately one minute after all services have started, and begin again. This scenario does not have any dependencies on the other scenarios in phase 1.
The following diagram represents the flow for swiping your badge and unlocking the door:
@@ -110,14 +110,14 @@ The following diagram represents the flow for swiping your badge and unlocking t
To simulate this, perform this REST API call to the `ds-card-reader` service ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003293374"}' http://localhost:48098/api/v2/device/name/card-reader/card-number
+curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003293374"}' http://localhost:48098/api/v3/device/name/card-reader/card-number
```
!!! note
There should not be any response message when running this EdgeX command successfully.
!!! info
- By default, the card number `0003293374` corresponds to a card in the [`ms-authentication/cards.json`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication/cards.json) file that has the "stocker" role associated to it.
+ By default, the card number `0003293374` corresponds to a card in the [`ms-authentication/cards.json`](https://github.com/intel-retail/automated-vending/tree/main/ms-authentication/cards.json) file that has the "stocker" role associated to it.
JSON object for `cardId` 0003293374.
@@ -169,7 +169,7 @@ Then open the door, and close it afterwards, while waiting approximately 3-4 sec
The following command makes a REST API call to the `ds-controller-board` service to open the door (no response body expected) ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed
```
Wait 3.75 seconds:
@@ -186,7 +186,7 @@ sleep 3.75
The following command makes a REST API call to the `ds-controller-board` service to close the door (no response body expected) ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"1"}' http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"1"}' http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed
```
Wait about 20-30 seconds for the inventory to be discovered by the CV inference service, and also for background processing of events to occur. **The time-sensitive sequence has been completed.**
@@ -207,7 +207,7 @@ curl -X GET http://localhost:48095/inventory
(Click to Expand) Inventory API Response Example
-The (altered) contents of ms-inventory/inventory.json
are contained in the content
key below.
+The (altered) contents of ms-inventory/inventory.json
are contained in the content
key below.
```json
@@ -235,7 +235,7 @@ curl -X GET http://localhost:48095/auditlog
(Click to Expand) Audit Log API Response Example
-The (altered) contents of ms-inventory/auditlog.json
are contained in the content
key below.
+The (altered) contents of ms-inventory/auditlog.json
are contained in the content
key below.
```json
@@ -261,11 +261,11 @@ Since this a stocking event and not a customer transaction, there is no ledger e
-By default, the ledger service has six registered accounts (accounts 1-6) for consumers. The valid accounts match the account ID's that have authorized access to the cooler through the ms-authentication
service (see the ms-authentication/accounts.json
file).
+By default, the ledger service has six registered accounts (accounts 1-6) for consumers. The valid accounts match the account ID's that have authorized access to the cooler through the ms-authentication
service (see the ms-authentication/accounts.json
file).
-The (unaltered) contents of ms-ledger/ledger.json
are contained in the content
key below.
+The (unaltered) contents of ms-ledger/ledger.json
are contained in the content
key below.
```json
@@ -296,7 +296,7 @@ Now that the cooler's inventory has been stocked, we can simulate a customer swi
!!! warning
If you have not already populated the inventory as described in the [Stock the Cooler with Inventory](#Stock-the-Cooler-with-Inventory) section, do not proceed. The inferencing service follows a specific sequence for changes in inventory. The first transaction in the sequence is always a _gain_ of inventory, corresponding to the stocker adding items to inventory. The following transactions are _removal_ of inventory, corresponding to customers _taking_ items from inventory.
- If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Checkout data and containers, wait approximately one minute after all services have started, and begin again. This scenario relies on the stocking scenario in phase 1 - if the stocking scenario is skipped, it is still OK, but the randomized sequence of transactions will yield inventory/audit log/ledger changes that differ from the expected examples shown throughout this scenario.
+ If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Vending data and containers, wait approximately one minute after all services have started, and begin again. This scenario relies on the stocking scenario in phase 1 - if the stocking scenario is skipped, it is still OK, but the randomized sequence of transactions will yield inventory/audit log/ledger changes that differ from the expected examples shown throughout this scenario.
In a manner similar to the previous section (where we stocked our inventory), the following steps are taken when simulating a customer:
@@ -316,7 +316,7 @@ That's it! Each of the above actions has a corresponding REST API call that we w
To begin, start by performing the following REST command to simulate a customer swiping their badge to open the cooler ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278380"}' http://localhost:48098/api/v2/device/name/card-reader/card-number
+curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278380"}' http://localhost:48098/api/v3/device/name/card-reader/card-number
```
!!! note
@@ -355,7 +355,7 @@ Then open the door, and close it afterwards, while waiting approximately 3-4 sec
The following command makes a REST API call to the `ds-controller-board` service to open the door (no response body expected) ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"0"}' http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed
```
Wait 3.75 seconds:
@@ -367,10 +367,10 @@ sleep 3.75
The following command makes a REST API call to the `ds-controller-board` service to close the door (no response body expected) ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"1"}' http://localhost:48097/api/v2/device/name/controller-board/setDoorClosed
+curl -X PUT -H "Content-Type: application/json" -d '{"setDoorClosed":"1"}' http://localhost:48097/api/v3/device/name/controller-board/setDoorClosed
```
-At this point we are done simulating customer interactions with the Automated Checkout. The next steps are to get the inventory, ledger, and audit logs, and verify that they all show consistent information ***(not time sensitive, but may need to wait 20-30 seconds for background processing)***:
+At this point we are done simulating customer interactions with the Automated Vending. The next steps are to get the inventory, ledger, and audit logs, and verify that they all show consistent information ***(not time sensitive, but may need to wait 20-30 seconds for background processing)***:
```bash
curl -X GET http://localhost:48095/inventory
@@ -384,7 +384,7 @@ A few items have been removed from the inventory in the below API response. Care
-The (altered) contents of ms-inventory/inventory.json
are contained in the content
key below.
+The (altered) contents of ms-inventory/inventory.json
are contained in the content
key below.
```json
@@ -419,7 +419,7 @@ The audit log has a new transaction that corresponds to this customer interactio
-The (altered) contents of ms-inventory/auditlog.json
are contained in the content
key below.
+The (altered) contents of ms-inventory/auditlog.json
are contained in the content
key below.
```json
@@ -447,7 +447,7 @@ Note that this API response now includes a financial transaction indicating what
-The (altered) contents of ms-ledger/ledger.json
are contained in the content
key below.
+The (altered) contents of ms-ledger/ledger.json
are contained in the content
key below.
```json
@@ -486,7 +486,7 @@ From the ledger data, notice the transaction done by accountID 1.
### 3. The cooler requires maintenance
-In this scenario, all Automated Checkout services are operating as usual, except the following conditions are present:
+In this scenario, all Automated Vending services are operating as usual, except the following conditions are present:
- The cooler has exceeded the maximum allowable temperature threshold of 83 degrees Fahrenheit
- It has stayed at or above this temperature threshold for more than 15 seconds
@@ -508,7 +508,7 @@ If the temperature temporarily exceeds the maximum or minimum allowable temperat
-When the Automated Checkout is in an unstable state such as the one presented above, it enters _maintenance mode_. When the Automated Checkout is in this state, it automatically denies access to everyone except individuals that possess badges that are associated with the maintenance worker role.
+When the Automated Vending is in an unstable state such as the one presented above, it enters _maintenance mode_. When the Automated Vending is in this state, it automatically denies access to everyone except individuals that possess badges that are associated with the maintenance worker role.
!!! note
Maintenance mode is triggered in a few conditions:
@@ -533,12 +533,12 @@ This scenario walks through the following steps:
It's OK to run the commands without critically analyzing them _in the moment_. You may find it most useful to review them in advance.
- If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Checkout data and containers, wait approximately one minute after all services have started, and begin again. This scenario does not have any dependencies on the other scenarios in phase 1.
+ If you mess up, you should start fresh. Run the command `make down && make clean-docker && make run` to scrub the Automated Vending data and containers, wait approximately one minute after all services have started, and begin again. This scenario does not have any dependencies on the other scenarios in phase 1.
To begin the scenario, first start by setting the temperature of the cooler to `99.00` degrees Fahrenheit. The following command will make a REST API call to the `ds-controller-board` service ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"99.00"}' http://localhost:48097/api/v2/device/name/controller-board/setTemperature
+curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"99.00"}' http://localhost:48097/api/v3/device/name/controller-board/setTemperature
```
!!! note
@@ -583,7 +583,7 @@ For the sake of simplicity in this walkthrough, we will first fix the temperatur
First, set the temperature to a normal value (45 degrees) a few times over the span of 15 seconds (minimum) ***(time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"45.00"}' http://localhost:48097/api/v2/device/name/controller-board/setTemperature
+curl -X PUT -H "Content-Type: application/json" -d '{"setTemperature":"45.00"}' http://localhost:48097/api/v3/device/name/controller-board/setTemperature
```
!!! note
@@ -594,7 +594,7 @@ Now that a new, proper average temperature value has been set, the maintenance w
To do this, follow a familiar step, only this time use a card that has been assigned to a maintenance worker role ***(not time sensitive)***:
```bash
-curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278385"}' http://localhost:48098/api/v2/device/name/card-reader/card-number
+curl -X PUT -H "Content-Type: application/json" -d '{"card-number":"0003278385"}' http://localhost:48098/api/v3/device/name/card-reader/card-number
```
!!! note
@@ -627,8 +627,8 @@ The value of maintenanceMode
will switch to true
from
-This is the end of the scenario, and should provide an essential understanding of maintenance mode as well as temperature reactions in the Automated Checkout reference implementation.
+This is the end of the scenario, and should provide an essential understanding of maintenance mode as well as temperature reactions in the Automated Vending reference implementation.
## Summary
-You have successfully run through a typical Automated Checkout workflow using simulated interactions and devices. In the other phases of this reference implementation, we ramp up to using physical devices and provide guidance on writing new services for your custom devices and needs.
+You have successfully run through a typical Automated Vending workflow using simulated interactions and devices. In the other phases of this reference implementation, we ramp up to using physical devices and provide guidance on writing new services for your custom devices and needs.
diff --git a/docs_src/phases/phase2.md b/docs_src/phases/phase2.md
index bcf5842..c3be8e9 100644
--- a/docs_src/phases/phase2.md
+++ b/docs_src/phases/phase2.md
@@ -1,12 +1,12 @@
# Phase 2 - Add Card Reader Device
-In [phase 1](./phase1.md), the scenarios presented a breakdown of the various modes, events, and services that are working together within the Automated Checkout reference implementation. Everything in phase 1 was simulated and all interactions were done via REST API calls.
+In [phase 1](./phase1.md), the scenarios presented a breakdown of the various modes, events, and services that are working together within the Automated Vending reference implementation. Everything in phase 1 was simulated and all interactions were done via REST API calls.
Phase 2 will be mostly the same, except there will now be a physical card reader device. This device is actually just a keyboard that types 10 digits and then presses enter, which is what a common RFID card reader also might do.
## Setup
-If the Automated Checkout services are still running from phase 1, the services can stay running. The only service that will be terminated and re-created is `ds-card-reader` (which will be done as part of this guide).
+If the Automated Vending services are still running from phase 1, the services can stay running. The only service that will be terminated and re-created is `ds-card-reader` (which will be done as part of this guide).
Start by removing the `ds-card-reader` service. In order to do this, first identify the container's name using this command:
@@ -21,7 +21,7 @@ docker rm -f container_name_or_id_from_previous_command
```
!!! note
- If you encounter any issues with the `ds-card-reader` later in this guide, consider cleaning up all of the Automated Checkout services. The best way to guarantee a clean run through of this phase is to tear down any existing Automated Checkout environment and start from fresh. This can be accomplished by running the following steps.
+ If you encounter any issues with the `ds-card-reader` later in this guide, consider cleaning up all of the Automated Vending services. The best way to guarantee a clean run through of this phase is to tear down any existing Automated Vending environment and start from fresh. This can be accomplished by running the following steps.
Navigate to the root of this repository - this can vary based on where you chose to clone the repository:
@@ -35,7 +35,7 @@ docker rm -f container_name_or_id_from_previous_command
make down && make clean-docker
```
- This will destroy any existing ledger entries, audit log entries, inventory changes, and EdgeX event readings and data associated with Automated Checkout. However, this will not alter any other non-Automated Checkout Docker images, containers, or volumes. The scope of the above command is limited to only Automated Checkout.
+ This will destroy any existing ledger entries, audit log entries, inventory changes, and EdgeX event readings and data associated with Automated Vending. However, this will not alter any other non-Automated Vending Docker images, containers, or volumes. The scope of the above command is limited to only Automated Vending.
## Plug in the card reader device
@@ -62,7 +62,7 @@ Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
The particular _vendor ID_ and _product ID_ are spelled out clearly for each USB device. The card reader input device itself has been plugged in and has the vendor ID `ffff` and the product ID `0035`.
!!! note
- The VID and PID values are hexadecimal, base 16. A value of `ffff` is equal to `65535` in decimal, base 10, and `0035` in base 16 is equal to `53` in base 10. The configuration files in the Automated Checkout reference implementation device services may require some conversion between the two. If needed, consider searching online for a hexadecimal to decimal conversion calculator to make the process easier.
+ The VID and PID values are hexadecimal, base 16. A value of `ffff` is equal to `65535` in decimal, base 10, and `0035` in base 16 is equal to `53` in base 10. The configuration files in the Automated Vending reference implementation device services may require some conversion between the two. If needed, consider searching online for a hexadecimal to decimal conversion calculator to make the process easier.
Once the VID and PID have been identified, the next step is to configure the `ds-card-reader` device service to grab that device and listen for input events.
@@ -141,9 +141,9 @@ ds-card-reader:
DRIVERCONFIG_PID: 53 # 0x0035
```
-## Run the Automated Checkout reference implementation
+## Run the Automated Vending reference implementation
-Run the Automated Checkout reference implementation with the physical card reader component included:
+Run the Automated Vending reference implementation with the physical card reader component included:
```bash
make run-physical-card-reader
@@ -162,7 +162,7 @@ For example, in [phase 1](./phase1.md#walkthrough-of-scenarios), the card number
## Dive deeper
-Now that the card reader is working with a physical device, it may be time to make some changes to the underlying authentication data to allow your own cards to authenticate. The following sections illustrate the steps needed in order to extend the Automated Checkout reference implementation to work with your cards.
+Now that the card reader is working with a physical device, it may be time to make some changes to the underlying authentication data to allow your own cards to authenticate. The following sections illustrate the steps needed in order to extend the Automated Vending reference implementation to work with your cards.
### Extending the card reader
@@ -189,9 +189,9 @@ The `ms-authentication` microservice contains an index of all cards, accounts, a
First, navigate to the `ms-authentication` directory in the root of the repository. These three `.json` files dictate the `ms-authentication` service's behavior:
-- [`people.json`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication/people.json)
-- [`accounts.json`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication/accounts.json)
-- [`cards.json`](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication/cards.json)
+- [`people.json`](https://github.com/intel-retail/automated-vending/tree/main/ms-authentication/people.json)
+- [`accounts.json`](https://github.com/intel-retail/automated-vending/tree/main/ms-authentication/accounts.json)
+- [`cards.json`](https://github.com/intel-retail/automated-vending/tree/main/ms-authentication/cards.json)
In this case, we're only going to add a new card and associate it with the person with ID 1. A typical card will look like this:
@@ -241,7 +241,7 @@ make ds-card-reader
### Running the updated service
-If the Automated Checkout services are already running, the best way to update the running `ms-authentication` service is to remove the `ms-authentication` container and then re-run the command to bring up the whole stack.
+If the Automated Vending services are already running, the best way to update the running `ms-authentication` service is to remove the `ms-authentication` container and then re-run the command to bring up the whole stack.
First, remove the `ms-authentication` container:
@@ -274,7 +274,7 @@ make run-physical-card-reader
make run-physical-card-reader
```
- If there are still issues, consider completely cleaning the Automated Checkout containers and volumes by running
+ If there are still issues, consider completely cleaning the Automated Vending containers and volumes by running
```
make down && make clean-docker
@@ -293,4 +293,4 @@ The `ds-card-reader` service should be listening for input events. If your card
## Summary
-The usage of a physical card reader device only requires a few changes from the simulated mode. In the `ds-card-reader` device service, the device's VID and PID are configured, the service's image gets rebuilt, and the service itself gets updated to use the new image. The device's interactions are captured by Go routines running in the device service itself, and EdgeX event readings are propagated throughout a handful of services to ensure a smooth Automated Checkout workflow.
+The usage of a physical card reader device only requires a few changes from the simulated mode. In the `ds-card-reader` device service, the device's VID and PID are configured, the service's image gets rebuilt, and the service itself gets updated to use the new image. The device's interactions are captured by Go routines running in the device service itself, and EdgeX event readings are propagated throughout a handful of services to ensure a smooth Automated Vending workflow.
diff --git a/docs_src/phases/phase3.md b/docs_src/phases/phase3.md
index 4c1f817..55171e8 100644
--- a/docs_src/phases/phase3.md
+++ b/docs_src/phases/phase3.md
@@ -2,7 +2,7 @@
## Overview
-After [phase 2](../phases/phase2.md) has been completed, the next step is to integrate physical hardware. This guide will assist you in understanding the pieces of hardware that are needed in the Automated Checkout reference implementation.
+After [phase 2](../phases/phase2.md) has been completed, the next step is to integrate physical hardware. This guide will assist you in understanding the pieces of hardware that are needed in the Automated Vending reference implementation.
## Getting Started
@@ -15,15 +15,15 @@ Specifically, it handles the following integrations:
| Module | Description |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Door Sensor (open/close) | Instrumentation used to understand if the cooler door is open or closed and take appropriate action. |
-| Maglock (lock/unlock) | Instrumentation is used to lock or unlock the automated checkout to allow for vending of a product. |
-| LCD Display | Instrumentation is used for providing feedback to the person that is using the automated checkout. |
+| Maglock (lock/unlock) | Instrumentation is used to lock or unlock the automated vending to allow for vending of a product. |
+| LCD Display | Instrumentation is used for providing feedback to the person that is using the automated vending. |
| LED Panel | Instrumentation is used to provide feedback to the developer as to the state of the board lock and door status. |
-| Temperature/Humidity Sensor | Instrumentation is used to understand the physical environment inside the automated checkout and take appropriate action. |
+| Temperature/Humidity Sensor | Instrumentation is used to understand the physical environment inside the automated vending and take appropriate action. |
-We have created a reference implementation service that will interact with the controller board and EdgeX core services [here](../automated-checkout-services/device_services.md#card-reader).
+We have created a reference implementation service that will interact with the controller board and EdgeX core services [here](../automated-vending-services/device_services.md#card-reader).
### Step 2: Integrate your own computer vision hardware and software
-Next, in order to be able to provide computer vision capabilities in production environment to the Automated Checkout it is necessary to bring your own set of cameras and deep learning model. It is expected by the application services to receive an inventory delta using an MQTT broker. For demonstration and evaluation purposes, we have created a CV inference device service using [Intel openVINO](https://docs.openvinotoolkit.org/) inference engine and [openVINO product detection model](https://docs.openvinotoolkit.org/latest/_models_intel_product_detection_0001_description_product_detection_0001.html) that calculates inventory delta based on preloaded images to simulate stocking and purchasing products.
+Next, in order to be able to provide computer vision capabilities in production environment to the Automated Vending it is necessary to bring your own set of cameras and deep learning model. It is expected by the application services to receive an inventory delta using an MQTT broker. For demonstration and evaluation purposes, we have created a CV inference device service using [Intel openVINO](https://docs.openvinotoolkit.org/) inference engine and [openVINO product detection model](https://docs.openvinotoolkit.org/latest/_models_intel_product_detection_0001_description_product_detection_0001.html) that calculates inventory delta based on preloaded images to simulate stocking and purchasing products.
- Please see more details in the device services section [here](../automated-checkout-services/device_services.md#cv-inference).
+ Please see more details in the device services section [here](../automated-vending-services/device_services.md#cv-inference).
diff --git a/docs_src/references.md b/docs_src/references.md
index 372e638..c9c7572 100644
--- a/docs_src/references.md
+++ b/docs_src/references.md
@@ -4,24 +4,24 @@
| Service Name | Service Abbreviated Name | Link |
|-------------------------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Controller Board Status | `as-controller-board-status` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-controller-board-status](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-controller-board-status) |
-| Vending | `as-vending` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending](https://github.com/intel-iot-devkit/automated-checkout/blob/master/as-vending) |
+| Controller Board Status | `as-controller-board-status` | [https://github.com/intel-retail/automated-vending/tree/main/as-controller-board-status](https://github.com/intel-retail/automated-vending/tree/main/as-controller-board-status) |
+| Vending | `as-vending` | [https://github.com/intel-retail/automated-vending/tree/main/as-vending](https://github.com/intel-retail/automated-vending/tree/main/as-vending) |
## Device services
| Service Name | Service Abbreviated Name | Link |
|------------------|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Card Reader | `ds-card-reader` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-card-reader](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-card-reader) |
-| Controller Board | `ds-controller-board` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-controller-board](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-controller-board) |
-| CV inference | `ds-cv-inference` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-cv-inference](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ds-cv-inference) |
+| Card Reader | `ds-card-reader` | [https://github.com/intel-retail/automated-vending/tree/main/ds-card-reader](https://github.com/intel-retail/automated-vending/tree/main/ds-card-reader) |
+| Controller Board | `ds-controller-board` | [https://github.com/intel-retail/automated-vending/tree/main/ds-controller-board](https://github.com/intel-retail/automated-vending/tree/main/ds-controller-board) |
+| CV inference | `ds-cv-inference` | [https://github.com/intel-retail/automated-vending/tree/main/ds-cv-inference](https://github.com/intel-retail/automated-vending/tree/main/ds-cv-inference) |
## Microservices (business logic services)
| Service Name | Service Abbreviated Name | Link |
|----------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Authentication | `ms-authentication` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-authentication) |
-| Inventory | `ms-inventory` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-inventory](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-inventory) |
-| Ledger | `ms-ledger` | [https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-ledger](https://github.com/intel-iot-devkit/automated-checkout/blob/master/ms-ledger) |
+| Authentication | `ms-authentication` | [https://github.com/intel-retail/automated-vending/tree/main/ms-authentication](https://github.com/intel-retail/automated-vending/tree/main/ms-authentication) |
+| Inventory | `ms-inventory` | [https://github.com/intel-retail/automated-vending/tree/main/ms-inventory](https://github.com/intel-retail/automated-vending/tree/main/ms-inventory) |
+| Ledger | `ms-ledger` | [https://github.com/intel-retail/automated-vending/tree/main/ms-ledger](https://github.com/intel-retail/automated-vending/tree/main/ms-ledger) |
## Other
diff --git a/docs_src/troubleshooting.md b/docs_src/troubleshooting.md
index 5d67efd..9a1e66c 100644
--- a/docs_src/troubleshooting.md
+++ b/docs_src/troubleshooting.md
@@ -4,12 +4,12 @@ The following guide will help walk you through the flow of data to address poten
## Ensuring your device services receive data
-All sensor data that is ingested in Automated Checkout flows through a device service as the first step. These device services are the first place we should check to ensure they are both running and ingesting data. One of the best ways to do to this is to leverage Portainer (included in EdgeX Releases).
+All sensor data that is ingested in Automated Vending flows through a device service as the first step. These device services are the first place we should check to ensure they are both running and ingesting data. One of the best ways to do to this is to leverage Portainer (included in EdgeX Releases).
!!!info
*Portainer is a tool to help manage Docker containers. To learn more visit: [https://www.portainer.io/overview/](https://www.portainer.io/overview/)*
-We have 3 device services of note in Automated Checkout:
+We have 3 device services of note in Automated Vending:
- Controller board – Handles the interface between Arduino firmware and EdgeX.
- Card reader – Handles the interface between an RFID card reader and EdgeX.
@@ -50,13 +50,13 @@ After ensuring that data is flowing properly to the device services, the next pl
*Redis Desktop Manager is another tool to manage Redis databases: [https://redisdesktop.com/](https://redisdesktop.com/)*
-Redis Commander can be run in Docker by simply executing the following shell command (you may need to change the name of the `automated-checkout_default` network):
+Redis Commander can be run in Docker by simply executing the following shell command (you may need to change the name of the `automated-vending_default` network):
```bash
docker run --rm --name redis-commander -d \
-p 8081:8081 \
--env REDIS_HOSTS=edgex-redis \
- --network automated-checkout_default \
+ --network automated-vending_default \
rediscommander/redis-commander:latest
```
@@ -75,7 +75,7 @@ After ensuring data has made it to the database, the next place to check is the
![Portainer as-controller-board-status](./images/as-controller-board-status.png)
-In the unlikely event that no data is flowing at all to the Controller Board status App Service, this would lead us to an issue with the ZMQ connection from the App Service to Core Data. Double checking the TOML file configuration where the hostname, port, and topic are specified would be a good place to start. You should also check that the App Service is on the same docker network and is accessible via the network.
+Double checking the YAML file configuration where the hostname, port, and topic are specified would be a good place to start. You should also check that the App Service is on the same docker network and is accessible via the network.
Once connectivity issues have been resolved, the next step is to ensure that all filters (i.e. device names) are correct and match what is shown in the database from the previous step. If they do not match, then they will be filtered out and not be processed. One easy way to confirm that data is flowing is to remove filters entirely from the pipeline to see that there is data flowing.
diff --git a/ds-card-reader/.golangci.yml b/ds-card-reader/.golangci.yml
index c147474..eedbb4d 100644
--- a/ds-card-reader/.golangci.yml
+++ b/ds-card-reader/.golangci.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
run:
diff --git a/ds-card-reader/Dockerfile b/ds-card-reader/Dockerfile
index 71fcc11..660dfa6 100644
--- a/ds-card-reader/Dockerfile
+++ b/ds-card-reader/Dockerfile
@@ -1,14 +1,15 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-FROM golang:1.18-alpine3.16 AS builder
+FROM golang:1.20-alpine3.17 AS builder
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
# add git for go modules
-RUN apk update && apk add --no-cache make git gcc libc-dev zeromq-dev linux-headers
+# hadolint ignore=DL3018
+RUN apk update && apk add --no-cache make git gcc libc-dev linux-headers
ENV GO111MODULE=on
WORKDIR /usr/local/bin/
@@ -28,16 +29,17 @@ COPY . .
RUN make gobuild
# Next image - Copy built Go binary into new workspace
-FROM alpine
+FROM alpine:3.17
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
-RUN apk add --update --no-cache zeromq dumb-init
+# hadolint ignore=DL3018
+RUN apk add --update --no-cache dumb-init
COPY --from=builder /usr/local/bin/ds-card-reader/res/profiles/ds-card-reader.yaml /res/profiles/ds-card-reader.yaml
-COPY --from=builder /usr/local/bin/ds-card-reader/res/devices/device-list.toml /res/devices/device-list.toml
-COPY --from=builder /usr/local/bin/ds-card-reader/res/configuration.toml /res/configuration.toml
+COPY --from=builder /usr/local/bin/ds-card-reader/res/devices/device-list.yaml /res/devices/device-list.yaml
+COPY --from=builder /usr/local/bin/ds-card-reader/res/configuration.yaml /res/configuration.yaml
COPY --from=builder /usr/local/bin/ds-card-reader/main /ds-card-reader
CMD [ "/ds-card-reader", "-cp=consul.http://edgex-core-consul:8500", "-r"]
diff --git a/ds-card-reader/LICENSE b/ds-card-reader/LICENSE
index 7bad583..4f84e34 100644
--- a/ds-card-reader/LICENSE
+++ b/ds-card-reader/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/ds-card-reader/Makefile b/ds-card-reader/Makefile
index c5e1c70..e84baed 100644
--- a/ds-card-reader/Makefile
+++ b/ds-card-reader/Makefile
@@ -1,9 +1,9 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: build gobuild run gorun stop test lint
-MICROSERVICE=automated-checkout/ds-card-reader
+MICROSERVICE=automated-vending/ds-card-reader
ARCH=$(shell uname -m)
@@ -19,7 +19,7 @@ docker:
.
gobuild: tidy
- CGO_ENABLED=1 GOOS=linux go build -ldflags='-s -w' -a -installsuffix cgo main.go
+ CGO_ENABLED=1 GOOS=linux go build -ldflags='-s -w' -a main.go
run:
docker run \
@@ -34,7 +34,7 @@ stop:
docker rm -f $(MICROSERVICE):dev
test:
- go test -tags no_zmq -test.v \
+ go test -test.v \
-cover \
./...
@@ -46,7 +46,7 @@ testHTML:
go tool cover -html=test_coverage.out
testPhysical:
- sudo -E go test -tags no_zmq -test.v \
+ sudo -E go test -test.v \
-cover \
-tags=physical \
./...
diff --git a/ds-card-reader/common/common.go b/ds-card-reader/common/common.go
index 5b3cb7f..f7362ee 100644
--- a/ds-card-reader/common/common.go
+++ b/ds-card-reader/common/common.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package common
diff --git a/ds-card-reader/device/config.go b/ds-card-reader/device/config.go
index fbd6d93..e11d76b 100644
--- a/ds-card-reader/device/config.go
+++ b/ds-card-reader/device/config.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -8,7 +8,7 @@ type ServiceConfig struct {
DriverConfig Config
}
-// DriverConfig holds the configurable options for a automated checkout
+// DriverConfig holds the configurable options for an automated vending solution
// card reader device
type Config struct {
DeviceName string
diff --git a/ds-card-reader/device/config_test.go b/ds-card-reader/device/config_test.go
index 06a9247..494893a 100644
--- a/ds-card-reader/device/config_test.go
+++ b/ds-card-reader/device/config_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
diff --git a/ds-card-reader/device/device.go b/ds-card-reader/device/device.go
index b11f2b9..7a0a66d 100644
--- a/ds-card-reader/device/device.go
+++ b/ds-card-reader/device/device.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -6,8 +6,8 @@ package device
import (
"fmt"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
// CardReader is an abstraction that allows for operations to be performed on
diff --git a/ds-card-reader/device/device_test.go b/ds-card-reader/device/device_test.go
index 89b0b22..d4e24fe 100644
--- a/ds-card-reader/device/device_test.go
+++ b/ds-card-reader/device/device_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -7,8 +7,8 @@ import (
"reflect"
"testing"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
require "github.com/stretchr/testify/require"
)
diff --git a/ds-card-reader/device/physical.go b/ds-card-reader/device/physical.go
index 5b23674..d4719b5 100644
--- a/ds-card-reader/device/physical.go
+++ b/ds-card-reader/device/physical.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -8,9 +8,9 @@ import (
"fmt"
"time"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- logger "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ logger "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
evdev "github.com/gvalkov/golang-evdev"
)
diff --git a/ds-card-reader/device/physical_test.go b/ds-card-reader/device/physical_test.go
index 9a453ef..f99e749 100644
--- a/ds-card-reader/device/physical_test.go
+++ b/ds-card-reader/device/physical_test.go
@@ -1,7 +1,7 @@
//go:build all || physical
// +build all physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -9,13 +9,11 @@ package device
import (
"bufio"
"fmt"
- "io/ioutil"
"os"
"strings"
"testing"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
evdev "github.com/gvalkov/golang-evdev"
assert "github.com/stretchr/testify/assert"
require "github.com/stretchr/testify/require"
@@ -33,7 +31,7 @@ const (
)
func clearLogs() error {
- return ioutil.WriteFile(physicalLogFile, []byte{}, 0644)
+ return os.WriteFile(physicalLogFile, []byte{}, 0644)
}
func doesLogFileContainString(input string) (bool, error) {
diff --git a/ds-card-reader/device/virtual.go b/ds-card-reader/device/virtual.go
index 6390131..15df7f9 100644
--- a/ds-card-reader/device/virtual.go
+++ b/ds-card-reader/device/virtual.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -7,9 +7,9 @@ import (
"fmt"
"time"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- logger "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ logger "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
)
// CardReaderVirtual allows for the emulation of a physical card reader device
diff --git a/ds-card-reader/device/virtual_test.go b/ds-card-reader/device/virtual_test.go
index b5b9230..094fbd8 100644
--- a/ds-card-reader/device/virtual_test.go
+++ b/ds-card-reader/device/virtual_test.go
@@ -1,7 +1,7 @@
//go:build all || !physical
// +build all !physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -12,18 +12,18 @@ import (
"ds-card-reader/common"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- logger "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ logger "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
assert "github.com/stretchr/testify/assert"
require "github.com/stretchr/testify/require"
)
const (
- virtualDeviceSearchPath = ""
- virtualDeviceName = "ds-card-reader"
- virtualVID = uint16(0x0000)
- virtualPID = uint16(0x0000)
- expectedCardNumberVirtual = "0123456789"
+ virtualDeviceSearchPath = ""
+ virtualDeviceName = "ds-card-reader"
+ virtualVID = uint16(0x0000)
+ virtualPID = uint16(0x0000)
+ expectedCardNumberVirtual = "0123456789"
)
// TestVirtualCardReader validates that the InitializeCardReader
diff --git a/ds-card-reader/driver/driver.go b/ds-card-reader/driver/driver.go
index aa1052a..587d936 100644
--- a/ds-card-reader/driver/driver.go
+++ b/ds-card-reader/driver/driver.go
@@ -1,47 +1,48 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package driver
import (
- "errors"
"fmt"
common "ds-card-reader/common"
device "ds-card-reader/device"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/service"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/models"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/interfaces"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/models"
)
// CardReaderDriver represents the EdgeX driver that interfaces with the
// underlying device
type CardReaderDriver struct {
LoggingClient logger.LoggingClient
+ asyncCh chan<- *dsModels.AsyncValues
CardReader device.CardReader
Config *device.ServiceConfig
- svc *service.DeviceService
+ sdk interfaces.DeviceServiceSDK
+}
+
+func NewCardReaderDriver() interfaces.ProtocolDriver {
+ return &CardReaderDriver{}
}
// Initialize initializes the card reader device within EdgeX. This is the
// main entrypoint of this application
-func (drv *CardReaderDriver) Initialize(lc logger.LoggingClient, asyncCh chan<- *dsModels.AsyncValues, deviceCh chan<- []dsModels.DiscoveredDevice) (err error) {
+func (drv *CardReaderDriver) Initialize(sdk interfaces.DeviceServiceSDK) (err error) {
// propagate the logging client to the driver so it can use it too
- drv.LoggingClient = lc
+ drv.sdk = sdk
+ drv.LoggingClient = sdk.LoggingClient()
+ drv.asyncCh = sdk.AsyncValuesChannel()
// Only setting if nil allows for unit testing with VirtualBoard enabled
if drv.Config == nil {
- drv.svc = service.RunningService()
- if drv.svc == nil {
- return errors.New("custom card reader driver service is nil")
- }
-
drv.Config = &device.ServiceConfig{}
- err := drv.svc.LoadCustomConfig(drv.Config, "DriverConfig")
+ err := sdk.LoadCustomConfig(drv.Config, "DriverConfig")
if err != nil {
return fmt.Errorf("custom card reader configuration failed to load: %v", err)
}
@@ -52,8 +53,8 @@ func (drv *CardReaderDriver) Initialize(lc logger.LoggingClient, asyncCh chan<-
// initialize the card reader device so that it can be controlled by our
// EdgeX driver, and so that it can store configuration values
drv.CardReader, err = device.InitializeCardReader(
- lc,
- asyncCh,
+ drv.LoggingClient,
+ drv.asyncCh,
drv.Config.DriverConfig.DeviceSearchPath,
drv.Config.DriverConfig.DeviceName,
drv.Config.DriverConfig.VID,
@@ -144,12 +145,24 @@ func (drv *CardReaderDriver) RemoveDevice(deviceName string, protocols map[strin
return nil
}
+// DisconnectDevice allows EdgeX to emulate disconnection
+func (drv *CardReaderDriver) DisconnectDevice(deviceName string, protocols map[string]models.ProtocolProperties) error {
+ return nil
+}
+
// Stop allows EdgeX to emulate stopping the device
func (drv *CardReaderDriver) Stop(force bool) error {
return nil
}
-// DisconnectDevice allows EdgeX to emulate disconnection
-func (drv *CardReaderDriver) DisconnectDevice(deviceName string, protocols map[string]models.ProtocolProperties) error {
+func (drv *CardReaderDriver) Start() error {
+ return nil
+}
+
+func (drv *CardReaderDriver) Discover() error {
+ return fmt.Errorf("driver's Discover function isn't implemented")
+}
+
+func (drv *CardReaderDriver) ValidateDevice(device models.Device) error {
return nil
}
diff --git a/ds-card-reader/driver/driver_test.go b/ds-card-reader/driver/driver_test.go
index 5249134..8022d1f 100644
--- a/ds-card-reader/driver/driver_test.go
+++ b/ds-card-reader/driver/driver_test.go
@@ -1,7 +1,7 @@
//go:build all || physical || !physical
// +build all physical !physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
// notes on why physical and !physical build tags are present:
@@ -20,11 +20,13 @@ import (
"fmt"
"testing"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/models"
+ sdkMocks "github.com/edgexfoundry/device-sdk-go/v3/pkg/interfaces/mocks"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/models"
assert "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
require "github.com/stretchr/testify/require"
)
@@ -370,7 +372,11 @@ func TestCardReaderDriver_Initialize(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- if err := tt.drv.Initialize(tt.args.lc, tt.args.asyncCh, tt.args.deviceCh); (err != nil) != tt.wantErr {
+ mockSDK := &sdkMocks.DeviceServiceSDK{}
+ mockSDK.On("LoggingClient").Return(tt.args.lc)
+ mockSDK.On("AsyncValuesChannel").Return(nil)
+ mockSDK.On("LoadCustomConfig", mock.Anything, mock.Anything).Return(nil)
+ if err := tt.drv.Initialize(mockSDK); (err != nil) != tt.wantErr {
t.Errorf("CardReaderDriver.Initialize() error = %v, wantErr %v", err, tt.wantErr)
}
})
diff --git a/ds-card-reader/go.mod b/ds-card-reader/go.mod
index 4394f57..99cb06c 100644
--- a/ds-card-reader/go.mod
+++ b/ds-card-reader/go.mod
@@ -1,72 +1,77 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
module ds-card-reader
-go 1.18
+go 1.20
require (
- github.com/edgexfoundry/device-sdk-go/v2 v2.2.0
- github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0
+ github.com/edgexfoundry/device-sdk-go/v3 v3.0.0
+ github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0
github.com/gvalkov/golang-evdev v0.0.0-20180516222720-b6f418b1fe5a
- github.com/stretchr/testify v1.8.0
+ github.com/stretchr/testify v1.8.4
)
require (
- bitbucket.org/bertimus9/systemstat v0.5.0 // indirect
+ github.com/Microsoft/go-winio v0.6.0 // indirect
github.com/OneOfOne/xxhash v1.2.8 // indirect
- github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
+ github.com/armon/go-metrics v0.3.10 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect
- github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 // indirect
+ github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect
+ github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 // indirect
+ github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
- github.com/go-kit/log v0.2.0 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect
- github.com/go-playground/locales v0.14.0 // indirect
- github.com/go-playground/universal-translator v0.18.0 // indirect
- github.com/go-playground/validator/v10 v10.10.1 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.13.0 // indirect
github.com/go-redis/redis/v7 v7.3.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
- github.com/hashicorp/consul/api v1.9.1 // indirect
+ github.com/hashicorp/consul/api v1.20.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
- github.com/hashicorp/go-hclog v0.12.0 // indirect
- github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
+ github.com/hashicorp/go-hclog v0.14.1 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
- github.com/hashicorp/golang-lru v0.5.0 // indirect
- github.com/hashicorp/serf v0.9.5 // indirect
- github.com/leodido/go-urn v1.2.1 // indirect
- github.com/mattn/go-colorable v0.1.6 // indirect
- github.com/mattn/go-isatty v0.0.12 // indirect
+ github.com/hashicorp/golang-lru v0.5.4 // indirect
+ github.com/hashicorp/serf v0.10.1 // indirect
+ github.com/leodido/go-urn v1.2.3 // indirect
+ github.com/mattn/go-colorable v0.1.12 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 // indirect
- github.com/mitchellh/copystructure v1.0.0 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/mapstructure v1.1.2 // indirect
- github.com/mitchellh/reflectwalk v1.0.0 // indirect
- github.com/pebbe/zmq4 v1.2.7 // indirect
- github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
+ github.com/nats-io/nats.go v1.25.0 // indirect
+ github.com/nats-io/nkeys v0.4.4 // indirect
+ github.com/nats-io/nuid v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
- github.com/spiffe/go-spiffe/v2 v2.0.0 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.1.4 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- github.com/zeebo/errs v1.2.2 // indirect
- golang.org/x/crypto v0.1.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
+ github.com/zeebo/errs v1.3.0 // indirect
+ golang.org/x/crypto v0.14.0 // indirect
+ golang.org/x/mod v0.8.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sync v0.1.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
+ golang.org/x/tools v0.6.0 // indirect
+ google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
google.golang.org/grpc v1.53.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
- gopkg.in/square/go-jose.v2 v2.4.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/ds-card-reader/go.sum b/ds-card-reader/go.sum
index 4135bac..a1497a7 100644
--- a/ds-card-reader/go.sum
+++ b/ds-card-reader/go.sum
@@ -1,90 +1,87 @@
-bitbucket.org/bertimus9/systemstat v0.5.0 h1:n0aLnh2Jo4nBUBym9cE5PJDG8GT6g+4VuS2Ya2jYYpA=
-bitbucket.org/bertimus9/systemstat v0.5.0/go.mod h1:EkUWPp8lKFPMXP8vnbpT5JDI0W/sTiLZAvN8ONWErHY=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
+github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
+github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y=
-github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc=
-github.com/edgexfoundry/device-sdk-go/v2 v2.2.0 h1:wapuEQwSSmJQfdHvVT0maxyyE6Y1QQXOMI4YgsFkOek=
-github.com/edgexfoundry/device-sdk-go/v2 v2.2.0/go.mod h1:QRG3JZxLiuUirj4cvkYPVFu7WIZMJyn/TuT2nXtAqYc=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 h1:4UVNGRaKbkH5aEhQrto26Q65ydmhZYReRw/6ZNQ5J5E=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0/go.mod h1:JKRxVTC5g1IRoQuT6T7pW6O6XnfjQTZgFjEazPHAHng=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 h1:AZeaAPJM5X93ITFgwbwluYDtYEJ7tkCMSlj35GwfLLU=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0/go.mod h1:YP17JhMnXTitowXE13QJwFaKo0oc03iyoKLjWAYl4FE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0 h1:Sfi9jAIgRXZaJQw8Ji6+8//47D+iOyGiXQSNZXhy3HE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0/go.mod h1:jyfVSx7mI3u/o/oo10COxBRBvJ8O/9I3z2xAwPmNt/Q=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 h1:FdnA7hLq0U8PeMAIuJXt4KcXLAyGo7OjckzxTAwaoBc=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0/go.mod h1:+X6C0h8ZTJe+lLU2AGJfiAzCJK3zL+yM6cej9VC+79E=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 h1:dk9ul1t7INAiyZXeu/GrpinFE3qOekdy8uZOqEGgIiE=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0/go.mod h1:DUQRnAd5fVzoROc5SI+PTFUD/vCNeZmZHBMrLElbmwI=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 h1:Rqr1CgBXppAeehCkPAHQ6hjyLlm2KTR4IKiKpExm7gg=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0/go.mod h1:dQiOiga0KMGHXqFs4nI+Rp19hQR3gZ+3lDRgI9x5Q7M=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edgexfoundry/device-sdk-go/v3 v3.0.0 h1:CpHBsVkjxkZo3wtk/+xmic2XC6HU3MLG5/S51lcnd9E=
+github.com/edgexfoundry/device-sdk-go/v3 v3.0.0/go.mod h1:z2C2nbnG7ZDwEyv3eA36olmlRkLUsYXEGgK6YcnpruI=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 h1:gXVxaZPcRJl2MhCIK/GOXZnQL+21xOUpGDTLTcVCxSk=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1/go.mod h1:Or09TpF5HF3FjlqX3kJEFhBCsTvbHY0Nu28UF0MvB3w=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 h1:rdk8KMcU8fA6o9MCb0O68bboxZTdLiXTZByNttEtRwE=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0/go.mod h1:8RlYm5CPzZgUsfXDWVP1TIeUMhsDNIdRdj1HXdomtOI=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0 h1:xjwCI34DLM31cSl1q9XmYgXS3JqXufQJMgohnLLLDx0=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0/go.mod h1:zzzWGWij6wAqm1go9TLs++TFMIsBqBb1eRnIj4mRxGw=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 h1:nU37Uo4/kloTMrdqDN9SJuDoXb3FpHaMdwVbHtn9PPk=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0/go.mod h1:x2CueD9gn/CmtCvDNFgrgBnR+B1iWJMSrC5+gesfDJ0=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 h1:6LXGElSScCCQzNpR3WjcgVz0RUc9GbfxETvif/4++iI=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0/go.mod h1:SGyo4fAHzOhDAd2Usa9RaBT/sOzkbceIqLrDG0+iYy8=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 h1:XyoDjeeVBMNwlJb6ljcTOl1QOp5gabcJc7pYSPYKNPA=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1/go.mod h1:Ts9l+TknRKaqFsXmrTuKyV1Y5qIr+eiexVYkQuXnfxk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
-github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
+github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
-github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
-github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
-github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
-github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
-github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ=
+github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4=
github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
@@ -93,241 +90,242 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gvalkov/golang-evdev v0.0.0-20180516222720-b6f418b1fe5a h1:PpqPstphGuFEdiuje4K8NmWN+Qzvu15NN/oFa1w/lGM=
github.com/gvalkov/golang-evdev v0.0.0-20180516222720-b6f418b1fe5a/go.mod h1:SAzVFKCRezozJTGavF3GX8MBUruETCqzivVLYiywouA=
-github.com/hashicorp/consul/api v1.9.1 h1:SngrdG2L62qqLsUz85qcPhFZ78rPf8tcD5qjMgs6MME=
-github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
+github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=
+github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=
+github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=
-github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
+github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU=
+github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE=
+github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
-github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g=
-github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM=
-github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
+github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
+github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=
+github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
+github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
+github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA=
+github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
+github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 h1:DcITQwl3ymmg7i1XfwpZFs/TPv2PuTwxE8bnuKVtKlk=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54/go.mod h1:dIfpPVUR+ZfkzkDcKnn+oPW1jKeXe4WlNWc7rIXOVxM=
-github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
-github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
-github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4=
+github.com/nats-io/nats-server/v2 v2.9.16 h1:SuNe6AyCcVy0g5326wtyU8TdqYmcPqzTjhkHojAjprc=
+github.com/nats-io/nats.go v1.25.0 h1:t5/wCPGciR7X3Mu8QOi4jiJaXaWM8qtkLu4lzGZvYHE=
+github.com/nats-io/nats.go v1.25.0/go.mod h1:D2WALIhz7V8M0pH8Scx8JZXlg6Oqz5VG+nQkK8nJdvg=
+github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA=
+github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pebbe/zmq4 v1.2.7 h1:6EaX83hdFSRUEhgzSW1E/SPoTS3JeYZgYkBvwdcrA9A=
-github.com/pebbe/zmq4 v1.2.7/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
-github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/spiffe/go-spiffe/v2 v2.0.0 h1:y6N7BZAxgaFZYELyrIdxSMm2e2tWpzgQewUts9h1hfM=
-github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/spiffe/go-spiffe/v2 v2.1.4 h1:Z31Ycaf2Z5DF38sQGmp+iGKjBhBlSzfAq68bfy67Mxw=
+github.com/spiffe/go-spiffe/v2 v2.1.4/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g=
-github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
+github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y=
-gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/ds-card-reader/main.go b/ds-card-reader/main.go
old mode 100644
new mode 100755
index f6c26d5..ae3ae12
--- a/ds-card-reader/main.go
+++ b/ds-card-reader/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package main
@@ -6,7 +6,7 @@ package main
import (
"ds-card-reader/driver"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/startup"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/startup"
)
const (
@@ -15,5 +15,6 @@ const (
)
func main() {
- startup.Bootstrap(serviceName, version, new(driver.CardReaderDriver))
+ drv := driver.NewCardReaderDriver()
+ startup.Bootstrap(serviceName, version, drv)
}
diff --git a/ds-card-reader/res/configuration.toml b/ds-card-reader/res/configuration.toml
deleted file mode 100644
index 1683695..0000000
--- a/ds-card-reader/res/configuration.toml
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-MaxEventSize = 0 # value 0 unlimit the maximum event size that can be sent to message bus or core-data
-
-[Writable]
-LogLevel = "INFO"
- # InsecureSecrets are required for when Redis is used for message bus
- [Writable.InsecureSecrets]
- [Writable.InsecureSecrets.DB]
- path = "redisdb"
- [Writable.InsecureSecrets.DB.Secrets]
- username = ""
- password = ""
- [Writable.Reading]
- ReadingUnits = true
-
-[Service]
-HealthCheckInterval = "10s"
-Host = "localhost"
-ServerBindAddr = "" # blank value defaults to Service.Host value
-Port = 48098
-StartupMsg = "Card Reader device service started"
-# MaxRequestSize limit the request body size in byte of put command
-MaxRequestSize = 0 # value 0 unlimit the request size.
-RequestTimeout = "5s"
- [Service.CORSConfiguration]
- EnableCORS = false
- CORSAllowCredentials = false
- CORSAllowedOrigin = "https://localhost"
- CORSAllowedMethods = "GET, POST, PUT, PATCH, DELETE"
- CORSAllowedHeaders = "Authorization, Accept, Accept-Language, Content-Language, Content-Type, X-Correlation-ID"
- CORSExposeHeaders = "Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma, X-Correlation-ID"
- CORSMaxAge = 3600
-
-[Registry]
-Host = "localhost"
-Port = 8500
-Type = "consul"
-
-[Clients]
- [Clients.core-data]
- Protocol = "http"
- Host = "localhost"
- Port = 59880
-
- [Clients.core-metadata]
- Protocol = "http"
- Host = "localhost"
- Port = 59881
-
-[DriverConfig]
- DeviceName = "card-reader"
- DeviceSearchPath = ""
- VID = 0
- PID = 0
- SimulateDevice = true
-
-[Device]
-DataTransform = true
-MaxCmdOps = 128
-MaxCmdValueLen = 256
-ProfilesDir = "./res/profiles"
-DevicesDir = "./res/devices"
-UpdateLastConnected = false
-EnableAsyncReadings = true
-AsyncBufferSize = 16
-Labels = []
-UseMessageBus = true
- [Device.Discovery]
- Enabled = false
- Interval = "30s"
-
-[MessageQueue]
-Protocol = "tcp"
-Host = "localhost"
-Port = 1883
-Type = "mqtt"
-AuthMode = "none"
-PublishTopicPrefix = "edgex/events/device" # /// will be added to this Publish Topic prefix
- [MessageQueue.Optional]
- ClientId = "ds-card-reader"
- Qos = "0" # Quality of Sevice values are 0 (At most once), 1 (At least once) or 2 (Exactly once)
- KeepAlive = "10" # Seconds (must be 2 or greater)
- Retained = "false"
- AutoReconnect = "true"
- ConnectTimeout = "5" # Seconds
- SkipCertVerify = "false"
\ No newline at end of file
diff --git a/ds-card-reader/res/configuration.yaml b/ds-card-reader/res/configuration.yaml
new file mode 100755
index 0000000..989deb3
--- /dev/null
+++ b/ds-card-reader/res/configuration.yaml
@@ -0,0 +1,21 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+Writable:
+ LogLevel: INFO
+Service:
+ Host: localhost
+ Port: 48098
+ StartupMsg: Card Reader device service started
+DriverConfig:
+ DeviceName: card-reader
+ DeviceSearchPath: ''
+ VID: 0
+ PID: 0
+ SimulateDevice: true
+Device:
+ ProfilesDir: ./res/profiles
+ DevicesDir: ./res/devices
+MessageBus:
+ Optional:
+ ClientId: ds-card-reader
diff --git a/ds-card-reader/res/devices/device-list.toml b/ds-card-reader/res/devices/device-list.toml
deleted file mode 100644
index c59d7ca..0000000
--- a/ds-card-reader/res/devices/device-list.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-[[DeviceList]]
- Name = 'card-reader'
- ProfileName = 'rfid-card-reader'
- [DeviceList.Protocols]
- [DeviceList.Protocols.other]
- #TODO: move protocol properties from configuration.toml to here
- [[DeviceList.AutoEvents]]
- Interval = '3s'
- OnChange = true
- SourceName = 'status'
\ No newline at end of file
diff --git a/ds-card-reader/res/devices/device-list.yaml b/ds-card-reader/res/devices/device-list.yaml
new file mode 100755
index 0000000..61c7539
--- /dev/null
+++ b/ds-card-reader/res/devices/device-list.yaml
@@ -0,0 +1,14 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+deviceList:
+ - name: card-reader
+ profileName: rfid-card-reader
+ protocols:
+ other:
+ Address: simple01
+ Port: 300
+ autoEvents:
+ - interval: 3s
+ onChange: true
+ sourceName: status
diff --git a/ds-card-reader/res/profiles/ds-card-reader.yaml b/ds-card-reader/res/profiles/ds-card-reader.yaml
index bcbbb98..487bfd9 100644
--- a/ds-card-reader/res/profiles/ds-card-reader.yaml
+++ b/ds-card-reader/res/profiles/ds-card-reader.yaml
@@ -1,6 +1,4 @@
----
-
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
name: "rfid-card-reader"
diff --git a/ds-controller-board/.golangci.yml b/ds-controller-board/.golangci.yml
index 540137f..6e4135b 100644
--- a/ds-controller-board/.golangci.yml
+++ b/ds-controller-board/.golangci.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
run:
# timeout for analysis, e.g. 30s, 5m, default is 1m
diff --git a/ds-controller-board/Dockerfile b/ds-controller-board/Dockerfile
index 394a14a..b97abc9 100644
--- a/ds-controller-board/Dockerfile
+++ b/ds-controller-board/Dockerfile
@@ -1,14 +1,15 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-FROM golang:1.18-alpine3.16 AS builder
+FROM golang:1.20-alpine3.17 AS builder
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
# add git for go modules
-RUN apk update && apk add --no-cache make git gcc libc-dev zeromq-dev linux-headers
+# hadolint ignore=DL3018
+RUN apk update && apk add --no-cache make git
ENV GO111MODULE=on
WORKDIR /usr/local/bin/
@@ -27,16 +28,17 @@ COPY . .
RUN make gobuild
# Next image - Copy built Go binary into new workspace
-FROM alpine
+FROM alpine:3.17
LABEL license='SPDX-License-Identifier: BSD-3-Clause' \
- copyright='Copyright (c) 2022: Intel'
+ copyright='Copyright (c) 2023: Intel'
-RUN apk add --update --no-cache zeromq dumb-init
+# hadolint ignore=DL3018
+RUN apk add --update --no-cache dumb-init
COPY --from=builder /app/res/profiles/ds-controller-board.yaml /res/profiles/ds-controller-board.yaml
-COPY --from=builder /app/res/devices/device-list.toml /res/devices/device-list.toml
-COPY --from=builder /app/res/configuration.toml /res/configuration.toml
+COPY --from=builder /app/res/devices/device-list.yaml /res/devices/device-list.yaml
+COPY --from=builder /app/res/configuration.yaml /res/configuration.yaml
COPY --from=builder /app/ds-controller-board /ds-controller-board
CMD [ "/ds-controller-board", "-cp=consul.http://edgex-core-consul:8500", "-r" ]
diff --git a/ds-controller-board/LICENSE b/ds-controller-board/LICENSE
index 7c1aef1..df5d5be 100644
--- a/ds-controller-board/LICENSE
+++ b/ds-controller-board/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/ds-controller-board/Makefile b/ds-controller-board/Makefile
index 6e4e802..c6b3614 100644
--- a/ds-controller-board/Makefile
+++ b/ds-controller-board/Makefile
@@ -1,10 +1,10 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: build gobuild run gorun stop test lint
-MICROSERVICE=automated-checkout/ds-controller-board
+MICROSERVICE=automated-vending/ds-controller-board
ARCH=$(shell uname -m)
@@ -20,7 +20,7 @@ docker:
.
gobuild: tidy
- CGO_ENABLED=1 GOOS=linux go build -ldflags='-s -w' -a -installsuffix cgo -o ds-controller-board
+ CGO_ENABLED=0 GOOS=linux go build -ldflags='-s -w' -a -o ds-controller-board
run:
docker run \
@@ -35,7 +35,7 @@ stop:
docker rm -f $(MICROSERVICE):dev
test:
- go test -tags no_zmq -test.v \
+ go test -test.v \
-cover \
./...
@@ -47,7 +47,7 @@ testHTML:
go tool cover -html=test_coverage.out
testPhysical:
- sudo -E go test -tags no_zmq -test.v \
+ sudo -E go test -test.v \
-cover \
-tags=physical \
./...
diff --git a/ds-controller-board/device/common.go b/ds-controller-board/device/common.go
index 7419d31..6c7ba7c 100644
--- a/ds-controller-board/device/common.go
+++ b/ds-controller-board/device/common.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
diff --git a/ds-controller-board/device/common_test.go b/ds-controller-board/device/common_test.go
index 4c7e763..552bad4 100644
--- a/ds-controller-board/device/common_test.go
+++ b/ds-controller-board/device/common_test.go
@@ -1,7 +1,7 @@
//go:build all
// +build all
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
diff --git a/ds-controller-board/device/config.go b/ds-controller-board/device/config.go
index 78e6671..b58ea64 100644
--- a/ds-controller-board/device/config.go
+++ b/ds-controller-board/device/config.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
diff --git a/ds-controller-board/device/config_test.go b/ds-controller-board/device/config_test.go
index 7ccfb12..7f906fd 100644
--- a/ds-controller-board/device/config_test.go
+++ b/ds-controller-board/device/config_test.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
diff --git a/ds-controller-board/device/device.go b/ds-controller-board/device/device.go
index 7393c90..a8f13c5 100644
--- a/ds-controller-board/device/device.go
+++ b/ds-controller-board/device/device.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -6,8 +6,8 @@ package device
import (
"fmt"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
)
// ControllerBoard is a common interface for controller boards to implement
diff --git a/ds-controller-board/device/device_test.go b/ds-controller-board/device/device_test.go
index 4a69473..7210973 100644
--- a/ds-controller-board/device/device_test.go
+++ b/ds-controller-board/device/device_test.go
@@ -1,7 +1,7 @@
//go:build all || physical
// +build all physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -10,8 +10,8 @@ import (
"fmt"
"testing"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
diff --git a/ds-controller-board/device/mocks/ControllerBoard.go b/ds-controller-board/device/mocks/ControllerBoard.go
index bdb04a7..af05010 100644
--- a/ds-controller-board/device/mocks/ControllerBoard.go
+++ b/ds-controller-board/device/mocks/ControllerBoard.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by mockery v1.0.0. DO NOT EDIT.
diff --git a/ds-controller-board/device/physical.go b/ds-controller-board/device/physical.go
index 9798455..fbb3a89 100644
--- a/ds-controller-board/device/physical.go
+++ b/ds-controller-board/device/physical.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -9,9 +9,9 @@ import (
"strings"
"time"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
"go.bug.st/serial.v1"
"go.bug.st/serial.v1/enumerator"
@@ -21,7 +21,7 @@ const (
deviceResource = "controller-board-status"
)
-//ControllerBoardPhysical : A physical ControllerBoard that leverages an Arduino Micro-Controller for reading/writing sensor and input values.
+// ControllerBoardPhysical : A physical ControllerBoard that leverages an Arduino Micro-Controller for reading/writing sensor and input values.
type ControllerBoardPhysical struct {
AsyncCh chan<- *dsModels.AsyncValues
DevStatus string // uC -> Host : STATUS,L1,0,L2,0,D,0,T,78.58,H,19.54
@@ -112,12 +112,12 @@ func (board *ControllerBoardPhysical) Read() {
}
}
-//GetStatus : Returns the ControllerBoard's JSON 'DevStatus' field as a String.
+// GetStatus : Returns the ControllerBoard's JSON 'DevStatus' field as a String.
func (board *ControllerBoardPhysical) GetStatus() string {
return board.DevStatus
}
-//FindControllerBoard : Finds the ControllerBoards TTY URI (e.g. /dev/ttyACM0) based off of its PID and VID values.
+// FindControllerBoard : Finds the ControllerBoards TTY URI (e.g. /dev/ttyACM0) based off of its PID and VID values.
func FindControllerBoard(vid string, pid string) (string, error) {
ports, err := enumerator.GetDetailedPortsList()
if err != nil {
@@ -135,7 +135,7 @@ func FindControllerBoard(vid string, pid string) (string, error) {
return "", fmt.Errorf("no USB port found matching VID=%s & PID=%s", vid, pid)
}
-//OpenAndConfigureSerialPort : Opens the TTY URI (e.g. /dev/ttyACM0) as a Serial connection with the appropriate configuration (e.g. baud-rate, parity, data-bits, stop-bits, etc.).
+// OpenAndConfigureSerialPort : Opens the TTY URI (e.g. /dev/ttyACM0) as a Serial connection with the appropriate configuration (e.g. baud-rate, parity, data-bits, stop-bits, etc.).
func OpenAndConfigureSerialPort(ttyPort string) (serial.Port, error) {
port, err := serial.Open(ttyPort, &serial.Mode{})
diff --git a/ds-controller-board/device/physical_test.go b/ds-controller-board/device/physical_test.go
index 6208403..0b2d7a0 100644
--- a/ds-controller-board/device/physical_test.go
+++ b/ds-controller-board/device/physical_test.go
@@ -1,7 +1,7 @@
//go:build all || physical
// +build all physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -11,8 +11,8 @@ import (
"os"
"testing"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
diff --git a/ds-controller-board/device/virtual.go b/ds-controller-board/device/virtual.go
index 2eb66dc..6941ad7 100644
--- a/ds-controller-board/device/virtual.go
+++ b/ds-controller-board/device/virtual.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -8,9 +8,9 @@ import (
"fmt"
"time"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
)
// ControllerBoardVirtual is a virtualized controller board that locally handles
diff --git a/ds-controller-board/device/virtual_test.go b/ds-controller-board/device/virtual_test.go
index d06a3fd..774770f 100644
--- a/ds-controller-board/device/virtual_test.go
+++ b/ds-controller-board/device/virtual_test.go
@@ -1,7 +1,7 @@
//go:build all || !physical
// +build all !physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package device
@@ -9,8 +9,8 @@ package device
import (
"testing"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
diff --git a/ds-controller-board/driver/driver.go b/ds-controller-board/driver/driver.go
index 481a407..6f73aac 100644
--- a/ds-controller-board/driver/driver.go
+++ b/ds-controller-board/driver/driver.go
@@ -1,21 +1,21 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package driver
import (
+ "errors"
"fmt"
"strconv"
"time"
"ds-controller-board/device"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/service"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/models"
- "github.com/pkg/errors"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/interfaces"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/models"
)
const (
@@ -42,30 +42,28 @@ type ControllerBoardDriver struct {
displayTimeout time.Duration
lockTimeout time.Duration
- svc *service.DeviceService
+ svc interfaces.DeviceServiceSDK
}
// NewControllerBoardDeviceDriver allows EdgeX to initialize the
// ControllerBoardDriver instance
-func NewControllerBoardDeviceDriver() dsModels.ProtocolDriver {
+func NewControllerBoardDeviceDriver() interfaces.ProtocolDriver {
+
return new(ControllerBoardDriver)
}
// Initialize is an EdgeX function that initializes the device
-func (drv *ControllerBoardDriver) Initialize(lc logger.LoggingClient, asyncCh chan<- *dsModels.AsyncValues, deviceCh chan<- []dsModels.DiscoveredDevice) (err error) {
- drv.lc = lc
+func (drv *ControllerBoardDriver) Initialize(sdk interfaces.DeviceServiceSDK) (err error) {
+ drv.svc = sdk
+ drv.lc = sdk.LoggingClient()
// Only setting if nil allows for unit testing with VirtualBoard enabled
if drv.config == nil {
- drv.svc = service.RunningService()
- if drv.svc == nil {
- return errors.New("custom controller board driver service is null")
- }
drv.config = &device.ServiceConfig{}
err := drv.svc.LoadCustomConfig(drv.config, "DriverConfig")
if err != nil {
- return errors.Wrap(err, "custom driver configuration failed to load")
+ return fmt.Errorf("custom driver configuration failed to load: %w", err)
}
drv.displayTimeout, drv.lockTimeout, err = drv.config.Validate()
if err != nil {
@@ -78,7 +76,7 @@ func (drv *ControllerBoardDriver) Initialize(lc logger.LoggingClient, asyncCh ch
drv.StopChannel = make(chan int)
- drv.controllerBoard, err = device.NewControllerBoard(lc, asyncCh, &drv.config.DriverConfig)
+ drv.controllerBoard, err = device.NewControllerBoard(drv.lc, sdk.AsyncValuesChannel(), &drv.config.DriverConfig)
if err != nil {
return err
}
@@ -274,7 +272,22 @@ func (drv *ControllerBoardDriver) RemoveDevice(deviceName string, protocols map[
return nil
}
-// Stop stops a device
+// Stops the device driver
func (drv *ControllerBoardDriver) Stop(force bool) error {
return nil
}
+
+// Discover new devices
+func (drv *ControllerBoardDriver) Discover() error {
+ return errors.New("driver's Discover function isn't implemented")
+}
+
+// Starts the device driver
+func (drv *ControllerBoardDriver) Start() error {
+ return nil
+}
+
+// Validates new devices before adding it
+func (drv *ControllerBoardDriver) ValidateDevice(device models.Device) error {
+ return nil
+}
diff --git a/ds-controller-board/driver/driver_test.go b/ds-controller-board/driver/driver_test.go
index be755d8..5104372 100644
--- a/ds-controller-board/driver/driver_test.go
+++ b/ds-controller-board/driver/driver_test.go
@@ -1,7 +1,7 @@
//go:build all || !physical
// +build all !physical
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package driver
@@ -14,10 +14,11 @@ import (
"reflect"
"testing"
- dsModels "github.com/edgexfoundry/device-sdk-go/v2/pkg/models"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/clients/logger"
- edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
- "github.com/edgexfoundry/go-mod-core-contracts/v2/models"
+ sdkMocks "github.com/edgexfoundry/device-sdk-go/v3/pkg/interfaces/mocks"
+ dsModels "github.com/edgexfoundry/device-sdk-go/v3/pkg/models"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/clients/logger"
+ edgexcommon "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
+ "github.com/edgexfoundry/go-mod-core-contracts/v3/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -150,7 +151,11 @@ func CreateControllerBoardDriver(t *testing.T, virtual bool, initialize bool, ex
}
if initialize {
- err = target.Initialize(lc, make(chan *dsModels.AsyncValues), make(chan<- []dsModels.DiscoveredDevice))
+ mockSDK := &sdkMocks.DeviceServiceSDK{}
+ mockSDK.On("LoggingClient").Return(lc)
+ mockSDK.On("AsyncValuesChannel").Return(nil)
+ mockSDK.On("LoadCustomConfig", mock.Anything, mock.Anything).Return(nil)
+ err = target.Initialize(mockSDK)
require.NoError(err)
virtual, ok := target.controllerBoard.(*device.ControllerBoardVirtual)
@@ -206,7 +211,11 @@ func TestControllerBoardDriver_Initialize(t *testing.T) {
config: tt.config,
}
- err := drv.Initialize(tt.lc, make(chan *dsModels.AsyncValues), make(chan<- []dsModels.DiscoveredDevice))
+ mockSDK := &sdkMocks.DeviceServiceSDK{}
+ mockSDK.On("LoggingClient").Return(mocklc)
+ mockSDK.On("AsyncValuesChannel").Return(nil)
+ mockSDK.On("LoadCustomConfig", mock.Anything, mock.Anything).Return(nil)
+ err := drv.Initialize(mockSDK)
if tt.wantErr {
require.Error(t, err)
return
diff --git a/ds-controller-board/go.mod b/ds-controller-board/go.mod
index cb021b5..3556fd7 100644
--- a/ds-controller-board/go.mod
+++ b/ds-controller-board/go.mod
@@ -1,75 +1,78 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
module ds-controller-board
-go 1.18
+go 1.20
require (
- github.com/edgexfoundry/device-sdk-go/v2 v2.2.0
- github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0
- github.com/pkg/errors v0.9.1
- github.com/stretchr/testify v1.8.0
+ github.com/edgexfoundry/device-sdk-go/v3 v3.0.0
+ github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0
+ github.com/stretchr/testify v1.8.2
go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45
)
require (
- bitbucket.org/bertimus9/systemstat v0.5.0 // indirect
+ github.com/Microsoft/go-winio v0.6.0 // indirect
github.com/OneOfOne/xxhash v1.2.8 // indirect
- github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
+ github.com/armon/go-metrics v0.3.10 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/creack/goselect v0.1.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect
- github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 // indirect
- github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 // indirect
+ github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect
+ github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 // indirect
+ github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 // indirect
+ github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 // indirect
github.com/fatih/color v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
- github.com/go-kit/log v0.2.0 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.0 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect
- github.com/go-playground/locales v0.14.0 // indirect
- github.com/go-playground/universal-translator v0.18.0 // indirect
- github.com/go-playground/validator/v10 v10.10.1 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.13.0 // indirect
github.com/go-redis/redis/v7 v7.3.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
- github.com/hashicorp/consul/api v1.9.1 // indirect
+ github.com/hashicorp/consul/api v1.20.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
- github.com/hashicorp/go-hclog v0.12.0 // indirect
- github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
+ github.com/hashicorp/go-hclog v0.14.1 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
- github.com/hashicorp/golang-lru v0.5.0 // indirect
- github.com/hashicorp/serf v0.9.5 // indirect
- github.com/leodido/go-urn v1.2.1 // indirect
- github.com/mattn/go-colorable v0.1.6 // indirect
- github.com/mattn/go-isatty v0.0.12 // indirect
+ github.com/hashicorp/golang-lru v0.5.4 // indirect
+ github.com/hashicorp/serf v0.10.1 // indirect
+ github.com/leodido/go-urn v1.2.3 // indirect
+ github.com/mattn/go-colorable v0.1.12 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 // indirect
- github.com/mitchellh/copystructure v1.0.0 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
- github.com/mitchellh/mapstructure v1.1.2 // indirect
- github.com/mitchellh/reflectwalk v1.0.0 // indirect
- github.com/pebbe/zmq4 v1.2.7 // indirect
- github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
+ github.com/nats-io/nats.go v1.25.0 // indirect
+ github.com/nats-io/nkeys v0.4.4 // indirect
+ github.com/nats-io/nuid v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
- github.com/spiffe/go-spiffe/v2 v2.0.0 // indirect
- github.com/stretchr/objx v0.4.0 // indirect
+ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.1.4 // indirect
+ github.com/stretchr/objx v0.5.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- github.com/zeebo/errs v1.2.2 // indirect
- golang.org/x/crypto v0.1.0 // indirect
- golang.org/x/net v0.7.0 // indirect
- golang.org/x/sys v0.5.0 // indirect
- golang.org/x/text v0.7.0 // indirect
- google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
+ github.com/zeebo/errs v1.3.0 // indirect
+ golang.org/x/crypto v0.14.0 // indirect
+ golang.org/x/mod v0.8.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
+ golang.org/x/sync v0.1.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
+ golang.org/x/tools v0.6.0 // indirect
+ google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
google.golang.org/grpc v1.53.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
- gopkg.in/square/go-jose.v2 v2.4.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/ds-controller-board/go.sum b/ds-controller-board/go.sum
index e414cce..ea0290f 100644
--- a/ds-controller-board/go.sum
+++ b/ds-controller-board/go.sum
@@ -1,336 +1,332 @@
-bitbucket.org/bertimus9/systemstat v0.5.0 h1:n0aLnh2Jo4nBUBym9cE5PJDG8GT6g+4VuS2Ya2jYYpA=
-bitbucket.org/bertimus9/systemstat v0.5.0/go.mod h1:EkUWPp8lKFPMXP8vnbpT5JDI0W/sTiLZAvN8ONWErHY=
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
+github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
+github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
+github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/creack/goselect v0.1.0 h1:4QiXIhcpSQF50XGaBsFzesjwX/1qOY5bOveQPmN9CXY=
github.com/creack/goselect v0.1.0/go.mod h1:gHrIcH/9UZDn2qgeTUeW5K9eZsVYCH6/60J/FHysWyE=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y=
-github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc=
-github.com/edgexfoundry/device-sdk-go/v2 v2.2.0 h1:wapuEQwSSmJQfdHvVT0maxyyE6Y1QQXOMI4YgsFkOek=
-github.com/edgexfoundry/device-sdk-go/v2 v2.2.0/go.mod h1:QRG3JZxLiuUirj4cvkYPVFu7WIZMJyn/TuT2nXtAqYc=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0 h1:4UVNGRaKbkH5aEhQrto26Q65ydmhZYReRw/6ZNQ5J5E=
-github.com/edgexfoundry/go-mod-bootstrap/v2 v2.2.0/go.mod h1:JKRxVTC5g1IRoQuT6T7pW6O6XnfjQTZgFjEazPHAHng=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0 h1:AZeaAPJM5X93ITFgwbwluYDtYEJ7tkCMSlj35GwfLLU=
-github.com/edgexfoundry/go-mod-configuration/v2 v2.2.0/go.mod h1:YP17JhMnXTitowXE13QJwFaKo0oc03iyoKLjWAYl4FE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0 h1:Sfi9jAIgRXZaJQw8Ji6+8//47D+iOyGiXQSNZXhy3HE=
-github.com/edgexfoundry/go-mod-core-contracts/v2 v2.2.0/go.mod h1:jyfVSx7mI3u/o/oo10COxBRBvJ8O/9I3z2xAwPmNt/Q=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0 h1:FdnA7hLq0U8PeMAIuJXt4KcXLAyGo7OjckzxTAwaoBc=
-github.com/edgexfoundry/go-mod-messaging/v2 v2.2.0/go.mod h1:+X6C0h8ZTJe+lLU2AGJfiAzCJK3zL+yM6cej9VC+79E=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0 h1:dk9ul1t7INAiyZXeu/GrpinFE3qOekdy8uZOqEGgIiE=
-github.com/edgexfoundry/go-mod-registry/v2 v2.2.0/go.mod h1:DUQRnAd5fVzoROc5SI+PTFUD/vCNeZmZHBMrLElbmwI=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0 h1:Rqr1CgBXppAeehCkPAHQ6hjyLlm2KTR4IKiKpExm7gg=
-github.com/edgexfoundry/go-mod-secrets/v2 v2.2.0/go.mod h1:dQiOiga0KMGHXqFs4nI+Rp19hQR3gZ+3lDRgI9x5Q7M=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edgexfoundry/device-sdk-go/v3 v3.0.0 h1:CpHBsVkjxkZo3wtk/+xmic2XC6HU3MLG5/S51lcnd9E=
+github.com/edgexfoundry/device-sdk-go/v3 v3.0.0/go.mod h1:z2C2nbnG7ZDwEyv3eA36olmlRkLUsYXEGgK6YcnpruI=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1 h1:gXVxaZPcRJl2MhCIK/GOXZnQL+21xOUpGDTLTcVCxSk=
+github.com/edgexfoundry/go-mod-bootstrap/v3 v3.0.1/go.mod h1:Or09TpF5HF3FjlqX3kJEFhBCsTvbHY0Nu28UF0MvB3w=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0 h1:rdk8KMcU8fA6o9MCb0O68bboxZTdLiXTZByNttEtRwE=
+github.com/edgexfoundry/go-mod-configuration/v3 v3.0.0/go.mod h1:8RlYm5CPzZgUsfXDWVP1TIeUMhsDNIdRdj1HXdomtOI=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0 h1:xjwCI34DLM31cSl1q9XmYgXS3JqXufQJMgohnLLLDx0=
+github.com/edgexfoundry/go-mod-core-contracts/v3 v3.0.0/go.mod h1:zzzWGWij6wAqm1go9TLs++TFMIsBqBb1eRnIj4mRxGw=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0 h1:nU37Uo4/kloTMrdqDN9SJuDoXb3FpHaMdwVbHtn9PPk=
+github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0/go.mod h1:x2CueD9gn/CmtCvDNFgrgBnR+B1iWJMSrC5+gesfDJ0=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0 h1:6LXGElSScCCQzNpR3WjcgVz0RUc9GbfxETvif/4++iI=
+github.com/edgexfoundry/go-mod-registry/v3 v3.0.0/go.mod h1:SGyo4fAHzOhDAd2Usa9RaBT/sOzkbceIqLrDG0+iYy8=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1 h1:XyoDjeeVBMNwlJb6ljcTOl1QOp5gabcJc7pYSPYKNPA=
+github.com/edgexfoundry/go-mod-secrets/v3 v3.0.1/go.mod h1:Ts9l+TknRKaqFsXmrTuKyV1Y5qIr+eiexVYkQuXnfxk=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
-github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
-github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo=
+github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
-github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
-github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
-github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
-github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
-github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
-github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ=
+github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4=
github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/hashicorp/consul/api v1.9.1 h1:SngrdG2L62qqLsUz85qcPhFZ78rPf8tcD5qjMgs6MME=
-github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
-github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
-github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
+github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc=
+github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo=
+github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=
-github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
+github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU=
+github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE=
+github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
-github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
-github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g=
-github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
-github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM=
-github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
+github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
+github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM=
+github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
+github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
+github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
-github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA=
+github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
+github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54 h1:DcITQwl3ymmg7i1XfwpZFs/TPv2PuTwxE8bnuKVtKlk=
github.com/mitchellh/consulstructure v0.0.0-20190329231841-56fdc4d2da54/go.mod h1:dIfpPVUR+ZfkzkDcKnn+oPW1jKeXe4WlNWc7rIXOVxM=
-github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
-github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
-github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4=
+github.com/nats-io/nats-server/v2 v2.9.16 h1:SuNe6AyCcVy0g5326wtyU8TdqYmcPqzTjhkHojAjprc=
+github.com/nats-io/nats.go v1.25.0 h1:t5/wCPGciR7X3Mu8QOi4jiJaXaWM8qtkLu4lzGZvYHE=
+github.com/nats-io/nats.go v1.25.0/go.mod h1:D2WALIhz7V8M0pH8Scx8JZXlg6Oqz5VG+nQkK8nJdvg=
+github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA=
+github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pebbe/zmq4 v1.2.7 h1:6EaX83hdFSRUEhgzSW1E/SPoTS3JeYZgYkBvwdcrA9A=
-github.com/pebbe/zmq4 v1.2.7/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
-github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
+github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/spiffe/go-spiffe/v2 v2.0.0 h1:y6N7BZAxgaFZYELyrIdxSMm2e2tWpzgQewUts9h1hfM=
-github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/spiffe/go-spiffe/v2 v2.1.4 h1:Z31Ycaf2Z5DF38sQGmp+iGKjBhBlSzfAq68bfy67Mxw=
+github.com/spiffe/go-spiffe/v2 v2.1.4/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g=
-github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
+github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
+github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45 h1:mACY1anK6HNCZtm/DK2Rf2ZPHggVqeB0+7rY9Gl6wyI=
go.bug.st/serial.v1 v0.0.0-20180827123349-5f7892a7bb45/go.mod h1:dRSl/CVCTf56CkXgJMDOdSwNfo2g1orOGE/gBGdvjZw=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 h1:znp6mq/drrY+6khTAlJUDNFFcDGV2ENLYKpMq8SyCds=
+google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/square/go-jose.v2 v2.4.1 h1:H0TmLt7/KmzlrDOpa1F+zr0Tk90PbJYBfsVUmRLrf9Y=
-gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/ds-controller-board/main.go b/ds-controller-board/main.go
index 75b9f87..5e4574e 100644
--- a/ds-controller-board/main.go
+++ b/ds-controller-board/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package main
@@ -6,7 +6,7 @@ package main
import (
"ds-controller-board/driver"
- "github.com/edgexfoundry/device-sdk-go/v2/pkg/startup"
+ "github.com/edgexfoundry/device-sdk-go/v3/pkg/startup"
)
const (
diff --git a/ds-controller-board/res/configuration.toml b/ds-controller-board/res/configuration.toml
deleted file mode 100644
index 137f4e7..0000000
--- a/ds-controller-board/res/configuration.toml
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-MaxEventSize = 0 # value 0 unlimit the maximum event size that can be sent to message bus or core-data
-
-[Writable]
-LogLevel = "INFO"
- # InsecureSecrets are required for when Redis is used for message bus
- [Writable.InsecureSecrets]
- [Writable.InsecureSecrets.DB]
- path = "redisdb"
- [Writable.InsecureSecrets.DB.Secrets]
- username = ""
- password = ""
- [Writable.Reading]
- ReadingUnits = true
-
-[Service]
-HealthCheckInterval = "10s"
-Host = "localhost"
-ServerBindAddr = "" # blank value defaults to Service.Host value
-Port = 48097
-StartupMsg = "Device controller board started"
-# MaxRequestSize limit the request body size in byte of put command
-MaxRequestSize = 0 # value 0 unlimit the request size.
-RequestTimeout = "5s"
- [Service.CORSConfiguration]
- EnableCORS = false
- CORSAllowCredentials = false
- CORSAllowedOrigin = "https://localhost"
- CORSAllowedMethods = "GET, POST, PUT, PATCH, DELETE"
- CORSAllowedHeaders = "Authorization, Accept, Accept-Language, Content-Language, Content-Type, X-Correlation-ID"
- CORSExposeHeaders = "Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma, X-Correlation-ID"
- CORSMaxAge = 3600
-
-[Registry]
-Host = "localhost"
-Port = 8500
-Type = "consul"
-
-[Clients]
- [Clients.core-data]
- Protocol = "http"
- Host = "localhost"
- Port = 59880
-
- [Clients.core-metadata]
- Protocol = "http"
- Host = "localhost"
- Port = 59881
-
-[Device]
-DataTransform = true
-MaxCmdOps = 128
-MaxCmdValueLen = 256
-ProfilesDir = "./res/profiles"
-DevicesDir = "./res/devices"
-UpdateLastConnected = false
-EnableAsyncReadings = true
-AsyncBufferSize = 16
-Labels = []
-UseMessageBus = true
- [Device.Discovery]
- Enabled = false
- Interval = "30s"
-
-[MessageQueue]
-Protocol = "tcp"
-Host = "localhost"
-Port = 1883
-Type = "mqtt"
-AuthMode = "none"
-PublishTopicPrefix = "edgex/events/device" # /// will be added to this Publish Topic prefix
- [MessageQueue.Optional]
- ClientId = "ds-controller-board"
- Qos = "0" # Quality of Sevice values are 0 (At most once), 1 (At least once) or 2 (Exactly once)
- KeepAlive = "10" # Seconds (must be 2 or greater)
- Retained = "false"
- AutoReconnect = "true"
- ConnectTimeout = "5" # Seconds
- SkipCertVerify = "false"
-
-[DriverConfig]
- DeviceName = "controller-board"
- VID = "0000"
- PID = "0000"
- DisplayTimeout = "10s"
- LockTimeout = "30s"
- VirtualControllerBoard = true
\ No newline at end of file
diff --git a/ds-controller-board/res/configuration.yaml b/ds-controller-board/res/configuration.yaml
new file mode 100644
index 0000000..8293d2e
--- /dev/null
+++ b/ds-controller-board/res/configuration.yaml
@@ -0,0 +1,26 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+Writable:
+ LogLevel: INFO
+
+Service:
+ Host: localhost
+ Port: 48097
+ StartupMsg: Device controller board started
+
+Device:
+ ProfilesDir: ./res/profiles
+ DevicesDir: ./res/devices
+
+MessageBus:
+ Optional:
+ ClientId: ds-controller-board
+
+DriverConfig:
+ DeviceName: controller-board
+ VID: 0000
+ PID: 0000
+ DisplayTimeout: 10s
+ LockTimeout: 30s
+ VirtualControllerBoard: true
\ No newline at end of file
diff --git a/ds-controller-board/res/devices/device-list.toml b/ds-controller-board/res/devices/device-list.toml
deleted file mode 100644
index 31211b5..0000000
--- a/ds-controller-board/res/devices/device-list.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
-# SPDX-License-Identifier: BSD-3-Clause
-
-# Pre-define Devices
-[[DeviceList]]
- Name = 'controller-board'
- ProfileName = 'ds-controller-board'
- [DeviceList.Protocols]
- [DeviceList.Protocols.other]
- #TODO: move protocol properties from configuration.toml to here
- [[DeviceList.AutoEvents]]
- Interval = '3s'
- OnChange = true
- SourceName = 'controller-board-status'
\ No newline at end of file
diff --git a/ds-controller-board/res/devices/device-list.yaml b/ds-controller-board/res/devices/device-list.yaml
new file mode 100644
index 0000000..05f93de
--- /dev/null
+++ b/ds-controller-board/res/devices/device-list.yaml
@@ -0,0 +1,15 @@
+# Copyright © 2023 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Pre-define Devices
+deviceList:
+ - name: controller-board
+ profileName: ds-controller-board
+ protocols:
+ other:
+ Address: ds-controller-board
+ Port: 48097
+ autoEvents:
+ - interval: 3s
+ onChange: true
+ sourceName: controller-board-status
diff --git a/ds-controller-board/res/profiles/ds-controller-board.yaml b/ds-controller-board/res/profiles/ds-controller-board.yaml
index 83de1f5..9e089fb 100644
--- a/ds-controller-board/res/profiles/ds-controller-board.yaml
+++ b/ds-controller-board/res/profiles/ds-controller-board.yaml
@@ -1,5 +1,5 @@
---
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
name: "ds-controller-board"
diff --git a/ds-cv-inference/.golangci.yml b/ds-cv-inference/.golangci.yml
index 0de07d8..3c39ddb 100644
--- a/ds-cv-inference/.golangci.yml
+++ b/ds-cv-inference/.golangci.yml
@@ -1,4 +1,4 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2022-2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
run:
diff --git a/ds-cv-inference/Dockerfile b/ds-cv-inference/Dockerfile
index b490147..1c23cc7 100644
--- a/ds-cv-inference/Dockerfile
+++ b/ds-cv-inference/Dockerfile
@@ -1,34 +1,26 @@
-# Copyright © 2022 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
-ARG OPENVINO_BASE=ubuntu20_dev
-ARG OPENVINO_VERSION=2022.2.0
-ARG OPENCV_VERSION=4.5.2
-
-FROM gocv/opencv:${OPENCV_VERSION} AS gocv
-
-FROM openvino/${OPENVINO_BASE}:${OPENVINO_VERSION}
-
-# required for installing dependencies
-USER root
-
-COPY --from=gocv /usr/local /usr/local
-
-RUN cd /opt/intel/openvino && \
- install_dependencies/install_openvino_dependencies.sh -c=opencv_req -c=opencv_opt -y
+FROM gocv/opencv:4.5.2
ENV GOPATH /go
-ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
-RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
+RUN go get -u -d gocv.io/x/gocv
+
+WORKDIR /tmp
+RUN wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
+RUN apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB && apt-key list
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
+RUN echo "deb https://apt.repos.intel.com/openvino/2021 all main" | tee /etc/apt/sources.list.d/intel-openvino-2021.list
+RUN apt update
+RUN apt install intel-openvino-dev-ubuntu18-2021.3.394 -y
-RUN apt-get update && apt-get install libgtk2.0-dev libgtk-3-dev libjpeg62 -y
+RUN apt install libgtk-3-dev -y
WORKDIR /go/src/ds-cv-inference
COPY . /go/src/ds-cv-inference
RUN go mod tidy
-RUN go mod download
-RUN /bin/bash -c "source /opt/intel/openvino/setupvars.sh && echo building ds-cv-inference... && go build -o ds-cv-inference" && \
- chmod +x entrypoint.sh
+RUN /bin/bash -c "source /opt/intel/openvino_2021/bin/setupvars.sh && go build -o ds-cv-inference"
+RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
diff --git a/ds-cv-inference/LICENSE b/ds-cv-inference/LICENSE
index 7c1aef1..df5d5be 100644
--- a/ds-cv-inference/LICENSE
+++ b/ds-cv-inference/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright © 2020-2022, Intel Corporation
+Copyright © 2020-2023, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/ds-cv-inference/Makefile b/ds-cv-inference/Makefile
index 58e9d19..ee0bbc9 100644
--- a/ds-cv-inference/Makefile
+++ b/ds-cv-inference/Makefile
@@ -1,9 +1,9 @@
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
.PHONY: build run down
-MICROSERVICE=automated-checkout/ds-cv-inference
+MICROSERVICE=automated-vending/ds-cv-inference
tidy:
go mod tidy
diff --git a/ds-cv-inference/docker-compose.yml b/ds-cv-inference/docker-compose.yml
index 0fb84ca..eb91173 100644
--- a/ds-cv-inference/docker-compose.yml
+++ b/ds-cv-inference/docker-compose.yml
@@ -1,6 +1,6 @@
---
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
version: '3.4'
@@ -8,7 +8,7 @@ version: '3.4'
services:
ds-cv-inference:
- image: automated-checkout/ds-cv-inference:dev
+ image: automated-vending/ds-cv-inference:dev
command: ["/go/src/ds-cv-inference/images","127.0.0.1:1883","0.85","/go/src/ds-cv-inference/skumapping.json"]
ports:
- "127.0.0.1:9005:9005"
diff --git a/ds-cv-inference/entrypoint.sh b/ds-cv-inference/entrypoint.sh
index 41b0450..57d10a2 100755
--- a/ds-cv-inference/entrypoint.sh
+++ b/ds-cv-inference/entrypoint.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-# Copyright © 2020 Intel Corporation. All rights reserved.
+# Copyright © 2023 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-3-Clause
set -e
@@ -10,9 +10,6 @@ CONFIDENCE=$3
SKUS=$4
-source /opt/intel/openvino/setupvars.sh
+source /opt/intel/openvino_2021/bin/setupvars.sh
-/go/src/ds-cv-inference/ds-cv-inference -dir $DIR -mqtt $MQTT -skuMapping $SKUS \
- -model /go/src/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin \
- -config /go/src/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml \
- -confidence $CONFIDENCE
+/go/src/ds-cv-inference/ds-cv-inference -dir $DIR -mqtt $MQTT -skuMapping $SKUS -model /go/src/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin -config /go/src/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml -confidence $CONFIDENCE
diff --git a/ds-cv-inference/go.mod b/ds-cv-inference/go.mod
index 8b115a3..af22086 100644
--- a/ds-cv-inference/go.mod
+++ b/ds-cv-inference/go.mod
@@ -1,19 +1,19 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
module ds-cv-inference
-go 1.18
+go 1.20
require (
github.com/eclipse/paho.mqtt.golang v1.2.0
github.com/stretchr/testify v1.8.0
- gocv.io/x/gocv v0.31.0
+ gocv.io/x/gocv v0.27.0
)
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- golang.org/x/net v0.7.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff --git a/ds-cv-inference/go.sum b/ds-cv-inference/go.sum
index 288a09e..427a4fe 100644
--- a/ds-cv-inference/go.sum
+++ b/ds-cv-inference/go.sum
@@ -3,7 +3,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
-github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -12,10 +11,10 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-gocv.io/x/gocv v0.31.0 h1:BHDtK8v+YPvoSPQTTiZB2fM/7BLg6511JqkruY2z6LQ=
-gocv.io/x/gocv v0.31.0/go.mod h1:oc6FvfYqfBp99p+yOEzs9tbYF9gOrAQSeL/dyIPefJU=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+gocv.io/x/gocv v0.27.0 h1:3X8I74ULsWHd4m7DQRv2Nqx5VkKscfUFnKgLNodiboI=
+gocv.io/x/gocv v0.27.0/go.mod h1:n4LnYjykU6y9gn48yZf4eLCdtuSb77XxSkW6g0wGf/A=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/ds-cv-inference/inference/inference.go b/ds-cv-inference/inference/inference.go
index 6a6a92c..9b499b8 100644
--- a/ds-cv-inference/inference/inference.go
+++ b/ds-cv-inference/inference/inference.go
@@ -1,4 +1,4 @@
-// Copyright © 2020 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package inference
@@ -10,7 +10,7 @@ import (
"fmt"
"image"
"image/color"
- "io/ioutil"
+ "os"
"gocv.io/x/gocv"
)
@@ -95,8 +95,6 @@ func StartInference(inferenceDeltasChannel chan []byte, InferenceDoorOpenChannel
}
defer net.Close()
- fmt.Println("gocv ReadNet successfully")
-
// OpenVINO backend
if err := net.SetPreferableBackend(gocv.NetBackendOpenVINO); err != nil {
fmt.Printf("Unable to set Net backend: %v\n", gocv.NetBackendOpenVINO)
@@ -108,7 +106,7 @@ func StartInference(inferenceDeltasChannel chan []byte, InferenceDoorOpenChannel
return
}
- fmt.Printf("Start reading...")
+ fmt.Println("Start reading...")
fromImages(imageSequence, net, inferenceDeltasChannel, InferenceDoorOpenChannel, confidenceThreshold, skuMap)
}
@@ -267,7 +265,7 @@ func calculateDelta(originalCount map[string]int, afterCount map[string]int, sku
}
func countImages(directory string) (int, error) {
- files, err := ioutil.ReadDir(directory)
+ files, err := os.ReadDir(directory)
if err != nil {
fmt.Printf("Error opening directory: %v\n", directory)
return 0, err
diff --git a/ds-cv-inference/main.go b/ds-cv-inference/main.go
index 6bf8d2d..b547628 100644
--- a/ds-cv-inference/main.go
+++ b/ds-cv-inference/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package main
@@ -10,7 +10,6 @@ import (
"encoding/json"
"flag"
"fmt"
- "io/ioutil"
"log"
"net/http"
"os"
@@ -31,19 +30,16 @@ func main() {
flag.Parse()
//Read skuMappingJSON
- skuMappingJSONFile, err := os.Open(*skuMapping)
+ skuMappingJSONByte, err := os.ReadFile(*skuMapping)
if err != nil {
fmt.Printf("Error reading from SKU Mapping file: %v\n", *skuMapping)
os.Exit(1)
}
- defer skuMappingJSONFile.Close()
-
- skuMappingJSONByte, _ := ioutil.ReadAll(skuMappingJSONFile)
inferenceInit(*directory, *model, *configFile, *confidence, skuMappingJSONByte)
mqttConnection := mqtt.NewMqttConnection(*mqttAddress)
- mqttConnection.SubscribeToAutomatedCheckout()
+ mqttConnection.SubscribeToAutomatedVending()
defer mqttConnection.Disconnect()
inference.Stream = mjpeg.NewStream()
@@ -56,17 +52,13 @@ func main() {
}
func updateMjpegServer() {
-
for img := range inference.StreamChannel {
buf, err := gocv.IMEncode(".jpg", img)
if err != nil {
fmt.Println("error on IMEncode JPG with image: ", err.Error())
os.Exit(1)
}
- defer buf.Close()
-
- inference.Stream.UpdateJPEG(buf.GetBytes())
-
+ inference.Stream.UpdateJPEG(buf)
}
}
diff --git a/ds-cv-inference/mjpeg/mjpeg.go b/ds-cv-inference/mjpeg/mjpeg.go
index 21f17f3..fcae3c9 100644
--- a/ds-cv-inference/mjpeg/mjpeg.go
+++ b/ds-cv-inference/mjpeg/mjpeg.go
@@ -1,4 +1,4 @@
-// Copyright © 2022 Intel Corporation. All rights reserved.
+// Copyright © 2022-2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package mjpeg
diff --git a/ds-cv-inference/mqtt/mqtt.go b/ds-cv-inference/mqtt/mqtt.go
index 3ba6bcc..ab07342 100644
--- a/ds-cv-inference/mqtt/mqtt.go
+++ b/ds-cv-inference/mqtt/mqtt.go
@@ -1,4 +1,4 @@
-// Copyright © 2020 Intel Corporation. All rights reserved.
+// Copyright © 2023 Intel Corporation. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
package mqtt
@@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"os"
+ "strings"
"sync"
"time"
@@ -16,7 +17,7 @@ import (
)
const (
- commandTopic = "Inference/CommandTopic"
+ commandTopic = "Inference/CommandTopic/#"
responseTopic = "Inference/ResponseTopic"
dataTopic = "Inference/DataTopic"
retryCount = 5
@@ -56,42 +57,64 @@ func NewMqttConnection(connectionString string) Connection {
return mc
}
-//define a function for the default message handler
+// define a function for the default message handler
var commandTopicFunction MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
-
var edgeXMessage map[string]string
if err := json.Unmarshal(msg.Payload(), &edgeXMessage); err != nil {
fmt.Println(http.StatusBadRequest, "Failed to unmarshal body")
return
}
- fmt.Printf("received message: %v+", edgeXMessage)
+ fmt.Printf("received message on topic %s: %v+\n", msg.Topic(), edgeXMessage)
+
+ words := strings.Split(msg.Topic(), "/")
+ numWords := len(words)
+ if numWords > 5 {
+ fmt.Println(http.StatusBadRequest, fmt.Sprintf("mqtt command topic not formatted for EdgeX 3.0: %s", msg.Topic()))
+ return
+ }
+
+ cmd := words[numWords-3]
+ method := words[numWords-2]
+ uuid := words[numWords-1]
+ publishTopic := fmt.Sprintf("%s/%s", responseTopic, uuid)
- switch edgeXMessage["cmd"] {
+ responseMessage := make(map[string]string)
+
+ switch cmd {
case "inferenceHeartbeat":
{
- pingMessage := edgeXMessage
- pingMessage["inferenceHeartbeat"] = "inferencePong"
- pongMessage, err := json.Marshal(pingMessage)
+ if !strings.EqualFold(method, "get") {
+ fmt.Println(http.StatusBadRequest, fmt.Sprintf("expected mqtt to have the method GET, got %s in the topic, %s", method, msg.Topic()))
+ return
+ }
+ responseMessage["inferenceHeartbeat"] = "inferencePong"
+
+ data, err := json.Marshal(responseMessage)
if err != nil {
fmt.Println("Failed to marshal mqtt message")
}
- token := client.Publish(responseTopic, 0, false, pongMessage)
+ token := client.Publish(publishTopic, 0, false, data)
token.Wait()
+ fmt.Printf("Published pong message to %s\n", publishTopic)
}
case "inferenceDoorStatus":
{
- pingMessage := edgeXMessage
- isDoorClosed := pingMessage["inferenceDoorStatus"]
- pingMessage["inferenceDoorStatus"] = "Got it!"
+ if !strings.EqualFold(method, "set") {
+ fmt.Println(http.StatusBadRequest, fmt.Sprintf("expected mqtt to have the method SET, got %s in the topic, %s", method, msg.Topic()))
+ return
+ }
+ isDoorClosed := edgeXMessage["inferenceDoorStatus"]
+ responseMessage["inferenceDoorStatus"] = "Got it!"
- pongMessage, err := json.Marshal(pingMessage)
+ data, err := json.Marshal(responseMessage)
if err != nil {
fmt.Println("Failed to marshal mqtt message")
}
- token := client.Publish(responseTopic, 0, false, pongMessage)
+ token := client.Publish(publishTopic, 0, false, data)
token.Wait()
+ fmt.Printf("Published inference door status message to %s\n", publishTopic)
checkDoorStatus(isDoorClosed, client)
}
default:
@@ -141,17 +164,14 @@ func checkDoorStatus(isDoorClosed string, client MQTT.Client) {
func SendDeltaData(client MQTT.Client, delta []byte) {
cmdSKUDelta := "inferenceSkuDelta"
-
+ publishTopic := fmt.Sprintf("%s/%s/%s", dataTopic, "Inference-device", cmdSKUDelta)
edgeXMessage := make(map[string]string)
- edgeXMessage["name"] = "Inference-device"
- edgeXMessage["cmd"] = cmdSKUDelta
- edgeXMessage["method"] = "get"
edgeXMessage[cmdSKUDelta] = string(delta)
deltaMessage, _ := json.Marshal(edgeXMessage)
- fmt.Println("Final deltaMessage is ", string(deltaMessage))
- token := client.Publish(dataTopic, 0, false, deltaMessage)
+ token := client.Publish(publishTopic, 0, false, deltaMessage)
token.Wait()
+ fmt.Println("published deltaMessage ", string(deltaMessage), " to topic ", publishTopic)
}
func (mqttCon *Connection) Connect(connectionString string) {
@@ -173,7 +193,7 @@ func (mqttCon *Connection) Connect(connectionString string) {
}
}
-func (mqttCon *Connection) SubscribeToAutomatedCheckout() {
+func (mqttCon *Connection) SubscribeToAutomatedVending() {
//subscribe to the topic inference/CommandTopic and handle messages in the commandTopicFunction
attempts := 0
for attempts < retryCount {
diff --git a/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin b/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin
index 092ee2c..5dcbb48 100644
Binary files a/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin and b/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.bin differ
diff --git a/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml b/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml
index 772b590..03855c1 100644
--- a/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml
+++ b/ds-cv-inference/product-detection-0001/FP32/product-detection-0001.xml
@@ -1,25 +1,19 @@
-
+
-
-
-
-
+
-
+
1
3
512
512
-
-
-
-
-
+
+
1
@@ -29,20 +23,16 @@
-
+
-
-
-
-
-
+
1
3
512
512
-
+
1
1
1
@@ -58,8 +48,8 @@
-
-
+
+
1
@@ -69,19 +59,16 @@
-
+
-
-
-
-
+
1
3
512
512
-
+
1
3
1
@@ -97,8 +84,8 @@
-
-
+
+
1
@@ -108,19 +95,16 @@
-
+
-
-
-
-
+
1
3
512
512
-
+
1
3
1
@@ -128,7 +112,7 @@
-
+
1
3
512
@@ -136,10 +120,10 @@
-
-
+
+
-
+
32
3
3
@@ -147,19 +131,16 @@
-
-
-
-
-
+
+
-
+
1
3
512
512
-
+
32
3
3
@@ -175,8 +156,8 @@
-
-
+
+
1
@@ -186,19 +167,16 @@
-
+
-
-
-
-
+
1
32
256
256
-
+
1
32
1
@@ -206,7 +184,7 @@
-
+
1
32
256
@@ -215,11 +193,8 @@
-
-
-
-
+
1
32
256
@@ -227,7 +202,7 @@
-
+
1
32
256
@@ -235,10 +210,10 @@
-
-
+
+
-
+
32
1
1
@@ -247,19 +222,16 @@
-
-
-
-
-
+
+
-
+
1
32
256
256
-
+
32
1
1
@@ -268,7 +240,7 @@
-
+
1
32
256
@@ -276,8 +248,8 @@
-
-
+
+
1
@@ -287,19 +259,16 @@
-
+
-
-
-
-
+
1
32
256
256
-
+
1
32
1
@@ -307,7 +276,7 @@
-
+
1
32
256
@@ -316,12 +285,9 @@
-
-
-
-
+
-
+
1
32
256
@@ -329,7 +295,7 @@
-
+
1
32
256
@@ -337,10 +303,10 @@
-
-
+
+
-
+
16
32
1
@@ -348,19 +314,16 @@
-
-
-
-
-
+
+
-
+
1
32
256
256
-
+
16
32
1
@@ -376,8 +339,8 @@
-
-
+
+
1
@@ -387,19 +350,16 @@
-
+
-
-
-
-
+
1
16
256
256
-
+
1
16
1
@@ -407,7 +367,7 @@
-
+
1
16
256
@@ -415,10 +375,10 @@
-
-
+
+
-
+
96
16
1
@@ -426,19 +386,16 @@
-
-
-
-
-
+
+
-
+
1
16
256
256
-
+
96
16
1
@@ -454,8 +411,8 @@
-
-
+
+
1
@@ -465,19 +422,16 @@
-
+
-
-
-
-
+
1
96
256
256
-
+
1
96
1
@@ -485,7 +439,7 @@
-
+
1
96
256
@@ -494,12 +448,9 @@
-
-
-
-
+
-
+
1
96
256
@@ -507,7 +458,7 @@
-
+
1
96
256
@@ -515,10 +466,10 @@
-
-
+
+
-
+
96
1
1
@@ -527,19 +478,16 @@
-
-
-
-
-
+
+
-
+
1
96
256
256
-
+
96
1
1
@@ -548,7 +496,7 @@
-
+
1
96
128
@@ -556,8 +504,8 @@
-
-
+
+
1
@@ -567,19 +515,16 @@
-
+
-
-
-
-
+
1
96
128
128
-
+
1
96
1
@@ -587,7 +532,7 @@
-
+
1
96
128
@@ -596,12 +541,9 @@
-
-
-
-
+
-
+
1
96
128
@@ -609,7 +551,7 @@
-
+
1
96
128
@@ -617,10 +559,10 @@
-
-
+
+
-
+
24
96
1
@@ -628,19 +570,16 @@
-
-
-
-
-
+
+
-
+
1
96
128
128
-
+
24
96
1
@@ -656,8 +595,8 @@
-
-
+
+
1
@@ -667,19 +606,16 @@
-
+
-
-
-
-
+
1
24
128
128
-
+
1
24
1
@@ -687,7 +623,7 @@
-
+
1
24
128
@@ -695,10 +631,10 @@
-
-
+
+
-
+
144
24
1
@@ -706,19 +642,16 @@
-
-
-
-
-
+
+
-
+
1
24
128
128
-
+
144
24
1
@@ -734,8 +667,8 @@
-
-
+
+
1
@@ -745,19 +678,16 @@
-
+
-
-
-
-
+
1
144
128
128
-
+
1
144
1
@@ -765,7 +695,7 @@
-
+
1
144
128
@@ -774,12 +704,9 @@
-
-
-
-
+
-
+
1
144
128
@@ -787,7 +714,7 @@
-
+
1
144
128
@@ -795,10 +722,10 @@
-
-
+
+
-
+
144
1
1
@@ -807,19 +734,16 @@
-
-
-
-
-
+
+
-
+
1
144
128
128
-
+
144
1
1
@@ -828,7 +752,7 @@
-
+
1
144
128
@@ -836,8 +760,8 @@
-
-
+
+
1
@@ -847,19 +771,16 @@
-
+
-
-
-
-
+
1
144
128
128
-
+
1
144
1
@@ -867,7 +788,7 @@
-
+
1
144
128
@@ -876,12 +797,9 @@
-
-
-
-
+
-
+
1
144
128
@@ -889,7 +807,7 @@
-
+
1
144
128
@@ -897,10 +815,10 @@
-
-
+
+
-
+
24
144
1
@@ -908,19 +826,16 @@
-
-
-
-
-
+
+
-
+
1
144
128
128
-
+
24
144
1
@@ -936,8 +851,8 @@
-
-
+
+
1
@@ -947,19 +862,16 @@
-
+
-
-
-
-
+
1
24
128
128
-
+
1
24
1
@@ -967,7 +879,7 @@
-
+
1
24
128
@@ -977,17 +889,14 @@
-
-
-
-
+
1
24
128
128
-
+
1
24
128
@@ -995,7 +904,7 @@
-
+
1
24
128
@@ -1003,10 +912,10 @@
-
-
+
+
-
+
144
24
1
@@ -1014,19 +923,16 @@
-
-
-
-
-
+
+
-
+
1
24
128
128
-
+
144
24
1
@@ -1042,8 +948,8 @@
-
-
+
+
1
@@ -1053,19 +959,16 @@
-
+
-
-
-
-
+
1
144
128
128
-
+
1
144
1
@@ -1073,7 +976,7 @@
-
+
1
144
128
@@ -1082,12 +985,9 @@
-
-
-
-
+
-
+
1
144
128
@@ -1095,7 +995,7 @@
-
+
1
144
128
@@ -1103,10 +1003,10 @@
-
-
+
+
-
+
144
1
1
@@ -1115,19 +1015,16 @@
-
-
-
-
-
+
+
-
+
1
144
128
128
-
+
144
1
1
@@ -1136,7 +1033,7 @@
-
+
1
144
64
@@ -1144,8 +1041,8 @@
-
-
+
+
1
@@ -1155,19 +1052,16 @@
-
+
-
-
-
-
+
1
144
64
64
-
+
1
144
1
@@ -1175,7 +1069,7 @@
-
+
1
144
64
@@ -1184,12 +1078,9 @@
-
-
-
-
+
-
+
1
144
64
@@ -1197,7 +1088,7 @@
-
+
1
144
64
@@ -1205,10 +1096,10 @@
-
-
+
+
-
+
32
144
1
@@ -1216,19 +1107,16 @@
-
-
-
-
-
+
+
-
+
1
144
64
64
-
+
32
144
1
@@ -1244,8 +1132,8 @@
-
-
+
+
1
@@ -1255,19 +1143,16 @@
-
+
-
-
-
-
+
1
32
64
64
-
+
1
32
1
@@ -1275,7 +1160,7 @@
-
+
1
32
64
@@ -1283,10 +1168,10 @@
-
-
+
+
-
+
192
32
1
@@ -1294,19 +1179,16 @@
-
-
-
-
-
+
+
-
+
1
32
64
64
-
+
192
32
1
@@ -1322,8 +1204,8 @@
-
-
+
+
1
@@ -1333,19 +1215,16 @@
-
+
-
-
-
-
+
1
192
64
64
-
+
1
192
1
@@ -1353,7 +1232,7 @@
-
+
1
192
64
@@ -1362,12 +1241,9 @@
-
-
-
-
+
-
+
1
192
64
@@ -1375,7 +1251,7 @@
-
+
1
192
64
@@ -1383,10 +1259,10 @@
-
-
+
+
-
+
192
1
1
@@ -1395,19 +1271,16 @@
-
-
-
-
-
+
+
-
+
1
192
64
64
-
+
192
1
1
@@ -1416,7 +1289,7 @@
-
+
1
192
64
@@ -1424,8 +1297,8 @@
-
-
+
+
1
@@ -1435,19 +1308,16 @@
-
+
-
-
-
-
+
1
192
64
64
-
+
1
192
1
@@ -1455,7 +1325,7 @@
-
+
1
192
64
@@ -1464,12 +1334,9 @@
-
-
-
-
+
-
+
1
192
64
@@ -1477,7 +1344,7 @@
-
+
1
192
64
@@ -1485,10 +1352,10 @@
-
-
+
+
-
+
32
192
1
@@ -1496,19 +1363,16 @@
-
-
-
-
-
+
+
-
+
1
192
64
64
-
+
32
192
1
@@ -1524,8 +1388,8 @@
-
-
+
+
1
@@ -1535,19 +1399,16 @@
-
+
-
-
-
-
+
1
32
64
64
-
+
1
32
1
@@ -1555,7 +1416,7 @@
-
+
1
32
64
@@ -1565,17 +1426,14 @@
-
-
-
-
+
1
32
64
64
-
+
1
32
64
@@ -1583,7 +1441,7 @@
-
+
1
32
64
@@ -1591,10 +1449,10 @@
-
-
+
+
-
+
192
32
1
@@ -1602,19 +1460,16 @@
-
-
-
-
-
+
+
-
+
1
32
64
64
-
+
192
32
1
@@ -1630,8 +1485,8 @@
-
-
+
+
1
@@ -1641,19 +1496,16 @@
-
+
-
-
-
-
+
1
192
64
64
-
+
1
192
1
@@ -1661,7 +1513,7 @@
-
+
1
192
64
@@ -1670,12 +1522,9 @@
-
-
-
-
+
-
+
1
192
64
@@ -1683,7 +1532,7 @@
-
+
1
192
64
@@ -1691,10 +1540,10 @@
-
-
+
+
-
+
192
1
1
@@ -1703,19 +1552,16 @@
-
-
-
-
-
+
+
-
+
1
192
64
64
-
+
192
1
1
@@ -1724,7 +1570,7 @@
-
+
1
192
64
@@ -1732,8 +1578,8 @@
-
-
+
+
1
@@ -1743,19 +1589,16 @@
-
+
-
-
-
-
+
1
192
64
64
-
+
1
192
1
@@ -1763,7 +1606,7 @@
-
+
1
192
64
@@ -1772,12 +1615,9 @@
-
-
-
-
+
-
+
1
192
64
@@ -1785,7 +1625,7 @@
-
+
1
192
64
@@ -1793,10 +1633,10 @@
-
-
+
+
-
+
32
192
1
@@ -1804,19 +1644,16 @@
-
-
-
-
-
+
+
-
+
1
192
64
64
-
+
32
192
1
@@ -1832,8 +1669,8 @@
-
-
+
+
1
@@ -1843,19 +1680,16 @@
-
+
-
-
-
-
+
1
32
64
64
-
+
1
32
1
@@ -1863,7 +1697,7 @@
-
+
1
32
64
@@ -1873,17 +1707,14 @@
-
-
-
-
+
1
32
64
64
-
+
1
32
64
@@ -1891,7 +1722,7 @@
-
+
1
32
64
@@ -1899,10 +1730,10 @@
-
-
+
+
-
+
192
32
1
@@ -1910,19 +1741,16 @@
-
-
-
-
-
+
+
-
+
1
32
64
64
-
+
192
32
1
@@ -1938,8 +1766,8 @@
-
-
+
+
1
@@ -1949,19 +1777,16 @@
-
+
-
-
-
-
+
1
192
64
64
-
+
1
192
1
@@ -1969,7 +1794,7 @@
-
+
1
192
64
@@ -1978,12 +1803,9 @@
-
-
-
-
+
-
+
1
192
64
@@ -1991,7 +1813,7 @@
-
+
1
192
64
@@ -1999,10 +1821,10 @@
-
-
+
+
-
+
192
1
1
@@ -2011,19 +1833,16 @@
-
-
-
-
-
+
+
-
+
1
192
64
64
-
+
192
1
1
@@ -2032,7 +1851,7 @@
-
+
1
192
32
@@ -2040,8 +1859,8 @@
-
-
+
+
1
@@ -2051,19 +1870,16 @@
-
+
-
-
-
-
+
1
192
32
32
-
+
1
192
1
@@ -2071,7 +1887,7 @@
-
+
1
192
32
@@ -2080,12 +1896,9 @@
-
-
-
-
+
-
+
1
192
32
@@ -2093,7 +1906,7 @@
-
+
1
192
32
@@ -2101,10 +1914,10 @@
-
-
+
+
-
+
64
192
1
@@ -2112,19 +1925,16 @@
-
-
-
-
-
+
+
-
+
1
192
32
32
-
+
64
192
1
@@ -2140,8 +1950,8 @@
-
-
+
+
1
@@ -2151,19 +1961,16 @@
-
+
-
-
-
-
+
1
64
32
32
-
+
1
64
1
@@ -2171,7 +1978,7 @@
-
+
1
64
32
@@ -2179,10 +1986,10 @@
-
-
+
+
-
+
384
64
1
@@ -2190,19 +1997,16 @@
-
-
-
-
-
+
+
-
+
1
64
32
32
-
+
384
64
1
@@ -2218,8 +2022,8 @@
-
-
+
+
1
@@ -2229,19 +2033,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2249,7 +2050,7 @@
-
+
1
384
32
@@ -2258,12 +2059,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2271,7 +2069,7 @@
-
+
1
384
32
@@ -2279,10 +2077,10 @@
-
-
+
+
-
+
384
1
1
@@ -2291,19 +2089,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
384
1
1
@@ -2312,7 +2107,7 @@
-
+
1
384
32
@@ -2320,8 +2115,8 @@
-
-
+
+
1
@@ -2331,19 +2126,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2351,7 +2143,7 @@
-
+
1
384
32
@@ -2360,12 +2152,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2373,7 +2162,7 @@
-
+
1
384
32
@@ -2381,10 +2170,10 @@
-
-
+
+
-
+
64
384
1
@@ -2392,19 +2181,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
64
384
1
@@ -2420,8 +2206,8 @@
-
-
+
+
1
@@ -2431,19 +2217,16 @@
-
+
-
-
-
-
+
1
64
32
32
-
+
1
64
1
@@ -2451,7 +2234,7 @@
-
+
1
64
32
@@ -2461,17 +2244,14 @@
-
-
-
-
+
1
64
32
32
-
+
1
64
32
@@ -2479,7 +2259,7 @@
-
+
1
64
32
@@ -2487,10 +2267,10 @@
-
-
+
+
-
+
384
64
1
@@ -2498,19 +2278,16 @@
-
-
-
-
-
+
+
-
+
1
64
32
32
-
+
384
64
1
@@ -2526,8 +2303,8 @@
-
-
+
+
1
@@ -2537,19 +2314,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2557,7 +2331,7 @@
-
+
1
384
32
@@ -2566,12 +2340,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2579,7 +2350,7 @@
-
+
1
384
32
@@ -2587,10 +2358,10 @@
-
-
+
+
-
+
384
1
1
@@ -2599,19 +2370,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
384
1
1
@@ -2620,7 +2388,7 @@
-
+
1
384
32
@@ -2628,8 +2396,8 @@
-
-
+
+
1
@@ -2639,19 +2407,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2659,7 +2424,7 @@
-
+
1
384
32
@@ -2668,12 +2433,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2681,7 +2443,7 @@
-
+
1
384
32
@@ -2689,10 +2451,10 @@
-
-
+
+
-
+
64
384
1
@@ -2700,19 +2462,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
64
384
1
@@ -2728,8 +2487,8 @@
-
-
+
+
1
@@ -2739,19 +2498,16 @@
-
+
-
-
-
-
+
1
64
32
32
-
+
1
64
1
@@ -2759,7 +2515,7 @@
-
+
1
64
32
@@ -2769,17 +2525,14 @@
-
-
-
-
+
1
64
32
32
-
+
1
64
32
@@ -2787,7 +2540,7 @@
-
+
1
64
32
@@ -2795,10 +2548,10 @@
-
-
+
+
-
+
384
64
1
@@ -2806,19 +2559,16 @@
-
-
-
-
-
+
+
-
+
1
64
32
32
-
+
384
64
1
@@ -2834,8 +2584,8 @@
-
-
+
+
1
@@ -2845,19 +2595,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2865,7 +2612,7 @@
-
+
1
384
32
@@ -2874,12 +2621,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2887,7 +2631,7 @@
-
+
1
384
32
@@ -2895,10 +2639,10 @@
-
-
+
+
-
+
384
1
1
@@ -2907,19 +2651,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
384
1
1
@@ -2928,7 +2669,7 @@
-
+
1
384
32
@@ -2936,8 +2677,8 @@
-
-
+
+
1
@@ -2947,19 +2688,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -2967,7 +2705,7 @@
-
+
1
384
32
@@ -2976,12 +2714,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -2989,7 +2724,7 @@
-
+
1
384
32
@@ -2997,10 +2732,10 @@
-
-
+
+
-
+
64
384
1
@@ -3008,19 +2743,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
64
384
1
@@ -3036,8 +2768,8 @@
-
-
+
+
1
@@ -3047,19 +2779,16 @@
-
+
-
-
-
-
+
1
64
32
32
-
+
1
64
1
@@ -3067,7 +2796,7 @@
-
+
1
64
32
@@ -3077,17 +2806,14 @@
-
-
-
-
+
1
64
32
32
-
+
1
64
32
@@ -3095,7 +2821,7 @@
-
+
1
64
32
@@ -3103,10 +2829,10 @@
-
-
+
+
-
+
384
64
1
@@ -3114,19 +2840,16 @@
-
-
-
-
-
+
+
-
+
1
64
32
32
-
+
384
64
1
@@ -3142,8 +2865,8 @@
-
-
+
+
1
@@ -3153,19 +2876,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -3173,7 +2893,7 @@
-
+
1
384
32
@@ -3182,12 +2902,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -3195,7 +2912,7 @@
-
+
1
384
32
@@ -3203,10 +2920,10 @@
-
-
+
+
-
+
384
1
1
@@ -3215,19 +2932,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
384
1
1
@@ -3236,7 +2950,7 @@
-
+
1
384
32
@@ -3244,8 +2958,8 @@
-
-
+
+
1
@@ -3255,19 +2969,16 @@
-
+
-
-
-
-
+
1
384
32
32
-
+
1
384
1
@@ -3275,7 +2986,7 @@
-
+
1
384
32
@@ -3284,12 +2995,9 @@
-
-
-
-
+
-
+
1
384
32
@@ -3297,7 +3005,7 @@
-
+
1
384
32
@@ -3305,10 +3013,10 @@
-
-
+
+
-
+
96
384
1
@@ -3316,19 +3024,16 @@
-
-
-
-
-
+
+
-
+
1
384
32
32
-
+
96
384
1
@@ -3344,8 +3049,8 @@
-
-
+
+
1
@@ -3355,19 +3060,16 @@
-
+
-
-
-
-
+
1
96
32
32
-
+
1
96
1
@@ -3375,7 +3077,7 @@
-
+
1
96
32
@@ -3383,10 +3085,10 @@
-
-
+
+
-
+
576
96
1
@@ -3394,19 +3096,16 @@
-
-
-
-
-
+
+
-
+
1
96
32
32
-
+
576
96
1
@@ -3422,8 +3121,8 @@
-
-
+
+
1
@@ -3433,19 +3132,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -3453,7 +3149,7 @@
-
+
1
576
32
@@ -3462,12 +3158,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -3475,7 +3168,7 @@
-
+
1
576
32
@@ -3483,10 +3176,10 @@
-
-
+
+
-
+
576
1
1
@@ -3495,19 +3188,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
576
1
1
@@ -3516,7 +3206,7 @@
-
+
1
576
32
@@ -3524,8 +3214,8 @@
-
-
+
+
1
@@ -3535,19 +3225,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -3555,7 +3242,7 @@
-
+
1
576
32
@@ -3564,12 +3251,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -3577,7 +3261,7 @@
-
+
1
576
32
@@ -3585,10 +3269,10 @@
-
-
+
+
-
+
96
576
1
@@ -3596,19 +3280,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
96
576
1
@@ -3624,8 +3305,8 @@
-
-
+
+
1
@@ -3635,19 +3316,16 @@
-
+
-
-
-
-
+
1
96
32
32
-
+
1
96
1
@@ -3655,7 +3333,7 @@
-
+
1
96
32
@@ -3665,17 +3343,14 @@
-
-
-
-
+
1
96
32
32
-
+
1
96
32
@@ -3683,7 +3358,7 @@
-
+
1
96
32
@@ -3691,10 +3366,10 @@
-
-
+
+
-
+
576
96
1
@@ -3702,19 +3377,16 @@
-
-
-
-
-
+
+
-
+
1
96
32
32
-
+
576
96
1
@@ -3730,8 +3402,8 @@
-
-
+
+
1
@@ -3741,19 +3413,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -3761,7 +3430,7 @@
-
+
1
576
32
@@ -3770,12 +3439,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -3783,7 +3449,7 @@
-
+
1
576
32
@@ -3791,10 +3457,10 @@
-
-
+
+
-
+
576
1
1
@@ -3803,19 +3469,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
576
1
1
@@ -3824,7 +3487,7 @@
-
+
1
576
32
@@ -3832,8 +3495,8 @@
-
-
+
+
1
@@ -3843,19 +3506,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -3863,7 +3523,7 @@
-
+
1
576
32
@@ -3872,12 +3532,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -3885,7 +3542,7 @@
-
+
1
576
32
@@ -3893,10 +3550,10 @@
-
-
+
+
-
+
96
576
1
@@ -3904,19 +3561,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
96
576
1
@@ -3932,8 +3586,8 @@
-
-
+
+
1
@@ -3943,19 +3597,16 @@
-
+
-
-
-
-
+
1
96
32
32
-
+
1
96
1
@@ -3963,7 +3614,7 @@
-
+
1
96
32
@@ -3973,17 +3624,14 @@
-
-
-
-
+
1
96
32
32
-
+
1
96
32
@@ -3991,7 +3639,7 @@
-
+
1
96
32
@@ -3999,10 +3647,10 @@
-
-
+
+
-
+
576
96
1
@@ -4010,19 +3658,16 @@
-
-
-
-
-
+
+
-
+
1
96
32
32
-
+
576
96
1
@@ -4038,8 +3683,8 @@
-
-
+
+
1
@@ -4049,19 +3694,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -4069,7 +3711,7 @@
-
+
1
576
32
@@ -4078,12 +3720,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -4091,7 +3730,7 @@
-
+
1
576
32
@@ -4099,10 +3738,10 @@
-
-
+
+
-
+
576
1
1
@@ -4111,19 +3750,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
576
1
1
@@ -4140,8 +3776,8 @@
-
-
+
+
1
@@ -4151,19 +3787,16 @@
-
+
-
-
-
-
+
1
576
32
32
-
+
1
576
1
@@ -4171,7 +3804,7 @@
-
+
1
576
32
@@ -4180,12 +3813,9 @@
-
-
-
-
+
-
+
1
576
32
@@ -4193,7 +3823,7 @@
-
+
1
576
32
@@ -4201,13 +3831,10 @@
-
-
-
-
-
+
+
-
+
16
576
1
@@ -4215,19 +3842,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
16
576
1
@@ -4243,8 +3867,8 @@
-
-
+
+
1
@@ -4256,17 +3880,14 @@
-
-
-
-
+
1
16
32
32
-
+
1
16
1
@@ -4274,7 +3895,7 @@
-
+
1
16
32
@@ -4282,11 +3903,8 @@
-
-
-
-
-
+
+
4
@@ -4294,22 +3912,19 @@
-
-
-
-
+
1
16
32
32
-
+
4
-
+
1
32
32
@@ -4319,11 +3934,8 @@
-
-
-
-
+
1
16
32
@@ -4331,105 +3943,104 @@
-
+
4
-
-
-
-
-
+
+
-
- 1
-
+
-
-
-
-
-
+
+
-
-
-
-
-
+
-
+
4
-
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
1
-
-
+
1
-
-
+
+
-
+
1
-
+
-
-
-
-
+
1
-
+
1
-
+
2
-
+
-
-
-
-
+
1
32
32
16
-
+
2
-
+
1
16384
-
-
+
+
-
+
576
1
1
@@ -4438,19 +4049,16 @@
-
-
-
-
-
+
+
-
+
1
576
32
32
-
+
576
1
1
@@ -4459,7 +4067,7 @@
-
+
1
576
16
@@ -4467,8 +4075,8 @@
-
-
+
+
1
@@ -4478,19 +4086,16 @@
-
+
-
-
-
-
+
1
576
16
16
-
+
1
576
1
@@ -4498,7 +4103,7 @@
-
+
1
576
16
@@ -4506,13 +4111,10 @@
-
-
-
-
-
+
+
-
+
1
576
16
@@ -4520,7 +4122,7 @@
-
+
1
576
16
@@ -4528,10 +4130,10 @@
-
-
+
+
-
+
160
576
1
@@ -4539,19 +4141,16 @@
-
-
-
-
-
+
+
-
+
1
576
16
16
-
+
160
576
1
@@ -4567,8 +4166,8 @@
-
-
+
+
1
@@ -4578,19 +4177,16 @@
-
+
-
-
-
-
+
1
160
16
16
-
+
1
160
1
@@ -4598,7 +4194,7 @@
-
+
1
160
16
@@ -4606,10 +4202,10 @@
-
-
+
+
-
+
960
160
1
@@ -4617,19 +4213,16 @@
-
-
-
-
-
+
+
-
+
1
160
16
16
-
+
960
160
1
@@ -4645,8 +4238,8 @@
-
-
+
+
1
@@ -4656,19 +4249,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -4676,7 +4266,7 @@
-
+
1
960
16
@@ -4684,13 +4274,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -4698,7 +4285,7 @@
-
+
1
960
16
@@ -4706,10 +4293,10 @@
-
-
+
+
-
+
960
1
1
@@ -4718,19 +4305,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
960
1
1
@@ -4739,7 +4323,7 @@
-
+
1
960
16
@@ -4747,8 +4331,8 @@
-
-
+
+
1
@@ -4758,19 +4342,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -4778,7 +4359,7 @@
-
+
1
960
16
@@ -4786,13 +4367,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -4800,7 +4378,7 @@
-
+
1
960
16
@@ -4808,10 +4386,10 @@
-
-
+
+
-
+
160
960
1
@@ -4819,19 +4397,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
160
960
1
@@ -4847,8 +4422,8 @@
-
-
+
+
1
@@ -4858,19 +4433,16 @@
-
+
-
-
-
-
+
1
160
16
16
-
+
1
160
1
@@ -4878,7 +4450,7 @@
-
+
1
160
16
@@ -4886,19 +4458,16 @@
-
+
-
-
-
-
+
1
160
16
16
-
+
1
160
16
@@ -4906,7 +4475,7 @@
-
+
1
160
16
@@ -4914,10 +4483,10 @@
-
-
+
+
-
+
960
160
1
@@ -4925,19 +4494,16 @@
-
-
-
-
-
+
+
-
+
1
160
16
16
-
+
960
160
1
@@ -4953,8 +4519,8 @@
-
-
+
+
1
@@ -4964,19 +4530,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -4984,7 +4547,7 @@
-
+
1
960
16
@@ -4992,13 +4555,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -5006,7 +4566,7 @@
-
+
1
960
16
@@ -5014,10 +4574,10 @@
-
-
+
+
-
+
960
1
1
@@ -5026,19 +4586,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
960
1
1
@@ -5047,7 +4604,7 @@
-
+
1
960
16
@@ -5055,8 +4612,8 @@
-
-
+
+
1
@@ -5066,19 +4623,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -5086,7 +4640,7 @@
-
+
1
960
16
@@ -5094,13 +4648,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -5108,7 +4659,7 @@
-
+
1
960
16
@@ -5116,10 +4667,10 @@
-
-
+
+
-
+
160
960
1
@@ -5127,19 +4678,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
160
960
1
@@ -5155,8 +4703,8 @@
-
-
+
+
1
@@ -5166,19 +4714,16 @@
-
+
-
-
-
-
+
1
160
16
16
-
+
1
160
1
@@ -5186,7 +4731,7 @@
-
+
1
160
16
@@ -5194,19 +4739,16 @@
-
+
-
-
-
-
+
1
160
16
16
-
+
1
160
16
@@ -5214,7 +4756,7 @@
-
+
1
160
16
@@ -5222,10 +4764,10 @@
-
-
+
+
-
+
960
160
1
@@ -5233,19 +4775,16 @@
-
-
-
-
-
+
+
-
+
1
160
16
16
-
+
960
160
1
@@ -5261,8 +4800,8 @@
-
-
+
+
1
@@ -5272,19 +4811,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -5292,7 +4828,7 @@
-
+
1
960
16
@@ -5300,13 +4836,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -5314,7 +4847,7 @@
-
+
1
960
16
@@ -5322,10 +4855,10 @@
-
-
+
+
-
+
960
1
1
@@ -5334,19 +4867,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
960
1
1
@@ -5355,7 +4885,7 @@
-
+
1
960
16
@@ -5363,8 +4893,8 @@
-
-
+
+
1
@@ -5374,19 +4904,16 @@
-
+
-
-
-
-
+
1
960
16
16
-
+
1
960
1
@@ -5394,7 +4921,7 @@
-
+
1
960
16
@@ -5402,13 +4929,10 @@
-
-
-
-
-
+
+
-
+
1
960
16
@@ -5416,7 +4940,7 @@
-
+
1
960
16
@@ -5424,10 +4948,10 @@
-
-
+
+
-
+
320
960
1
@@ -5435,19 +4959,16 @@
-
-
-
-
-
+
+
-
+
1
960
16
16
-
+
320
960
1
@@ -5463,8 +4984,8 @@
-
-
+
+
1
@@ -5474,19 +4995,16 @@
-
+
-
-
-
-
+
1
320
16
16
-
+
1
320
1
@@ -5494,7 +5012,7 @@
-
+
1
320
16
@@ -5502,10 +5020,10 @@
-
-
+
+
-
+
1280
320
1
@@ -5513,19 +5031,16 @@
-
-
-
-
-
+
+
-
+
1
320
16
16
-
+
1280
320
1
@@ -5541,8 +5056,8 @@
-
-
+
+
1
@@ -5552,19 +5067,16 @@
-
+
-
-
-
-
+
1
1280
16
16
-
+
1
1280
1
@@ -5572,7 +5084,7 @@
-
+
1
1280
16
@@ -5580,13 +5092,10 @@
-
-
-
-
-
+
+
-
+
1
1280
16
@@ -5594,7 +5103,7 @@
-
+
1
1280
16
@@ -5602,10 +5111,10 @@
-
-
+
+
-
+
1280
1
1
@@ -5614,19 +5123,16 @@
-
-
-
-
-
+
+
-
+
1
1280
16
16
-
+