VOL-4019: Initial commit with grpc nbi, sbi, etcd, kafka and hw management rpcs.
Change-Id: I78feaf7da284028fc61f42c5e0c5f56e72fe9e78
diff --git a/pkg/nbi/util.go b/pkg/nbi/util.go
new file mode 100644
index 0000000..d8af7cc
--- /dev/null
+++ b/pkg/nbi/util.go
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Package nbi holds rpc server apis implemented
+package nbi
+
+import (
+ "context"
+ "errors"
+ "net"
+ "strconv"
+ "strings"
+
+ "github.com/opencord/device-management-interface/go/dmi"
+ dev "github.com/opencord/opendevice-manager/pkg/models/device"
+
+ "github.com/opencord/voltha-lib-go/v4/pkg/log"
+)
+
+/* validateUri() verifies if the ip and port are valid and already registered then return the truth value of the desired state specified by the following 2 switches,
+ wantRegistered: 'true' if the fact of an ip is registered is the desired state
+ includePort: 'true' further checks if <ip>:<port#> does exist in the devicemap in case an ip is found registered
+*/
+func validateUri(ctx context.Context, uri string) (ok bool, err error) {
+ ok = false
+ if !strings.Contains(uri, ":") {
+ logger.Errorw(ctx, "Invalid-uri", log.Fields{"uri-received": uri, "expected-uri": "ip:port"})
+ err = errors.New("incorrect IP address format (<ip>:<port #>)")
+ return
+ }
+ splits := strings.Split(uri, ":")
+ ip, port := splits[0], splits[1]
+ if net.ParseIP(ip) == nil {
+ // also check to see if it's a valid hostname
+ if _, err2 := net.LookupIP(ip); err2 != nil {
+ logger.Errorw(ctx, "Invalid-ip", log.Fields{"uri-received": uri, "ip": ip})
+ err = errors.New("invalid IP address " + ip)
+ return
+ }
+ }
+ if _, err2 := strconv.Atoi(port); err2 != nil {
+ logger.Errorw(ctx, "Invalid-port", log.Fields{"uri-received": uri, "port": port})
+ err = errors.New("Port number " + port + " needs to be an integer")
+ return
+ }
+ ok = true
+ return
+}
+
+// validateStartManagingDeviceReq validates the 'StartManagingDevice' request is proper or not
+func validateStartManagingDeviceReq(ctx context.Context, req *dmi.ModifiableComponent) (resp *dmi.StartManagingDeviceResponse, ok bool) {
+ resp = new(dmi.StartManagingDeviceResponse)
+ resp.DeviceUuid = new(dmi.Uuid)
+ resp.Status = dmi.Status_ERROR_STATUS
+ if ok1, err := validateUri(ctx, req.Uri.Uri); !ok1 {
+ logger.Errorw(ctx, "validation-failed-for-StartManagingDevice-request", log.Fields{"error": err, "req": req})
+ resp.Reason = dmi.StartManagingDeviceResponse_INVALID_PARAMS
+ resp.ReasonDetail = err.Error()
+ return
+ }
+
+ if rec, _ := dev.DBGetByName(ctx, req.Name); rec != nil {
+ logger.Errorw(ctx, "validation-failed-for-StartManagingDevice-request-record-already-exists", log.Fields{"req": req, "rec": rec})
+ resp.Reason = dmi.StartManagingDeviceResponse_DEVICE_ALREADY_MANAGED
+ resp.ReasonDetail = "device already exists and managed with uuid " + rec.Uuid + " and uri " + rec.Uri
+ return
+ }
+
+ ok = true
+
+ return
+}
+
+// isValidSetLogLevel check is valid set loglevel request
+func isValidSetLogLevel(ctx context.Context, listEntities []*dmi.EntitiesLogLevel) (bool, error) {
+
+ if len(listEntities) == 0 {
+ // atleast one entities is required for set loglevel
+ logger.Errorw(ctx, "found-empty-entities", log.Fields{"entities": listEntities})
+ return false, errors.New("found empty entities")
+ }
+
+ if len(listEntities) > 1 {
+ // if set Entities more than 1, atleast 1 entity in nested struct
+ for _, entities := range listEntities {
+ if len(entities.Entities) == 0 {
+ logger.Errorw(ctx, "entities-has-empty-entries", log.Fields{"entities": entities})
+ return false, errors.New("set-empty-entries-not-allowed")
+ }
+ }
+ }
+
+ logger.Debug(ctx, "valid-set-log-request")
+ return true, nil
+}