diff --git a/nucleus/principalNetworkDomain.go b/nucleus/principalNetworkDomain.go index 409c51fee5330e118c241158aec1d81b651573f4..2060689f9ebd858e4b0abea8ec37100e050a2d73 100644 --- a/nucleus/principalNetworkDomain.go +++ b/nucleus/principalNetworkDomain.go @@ -3,41 +3,34 @@ package nucleus import ( "context" "encoding/json" - "fmt" "io" "os" "plugin" - "strconv" "time" + "code.fbi.h-da.de/danet/gosdn/interfaces/change" + "code.fbi.h-da.de/danet/gosdn/interfaces/device" + "code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/interfaces/southbound" "code.fbi.h-da.de/danet/gosdn/metrics" + "code.fbi.h-da.de/danet/gosdn/nucleus/errors" "code.fbi.h-da.de/danet/gosdn/nucleus/types" + "code.fbi.h-da.de/danet/gosdn/nucleus/util" + "code.fbi.h-da.de/danet/gosdn/store" "code.fbi.h-da.de/danet/yang-models/generated/openconfig" cpb "code.fbi.h-da.de/danet/api/go/gosdn/csbi" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound" tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport" - "google.golang.org/protobuf/proto" - - "code.fbi.h-da.de/danet/gosdn/interfaces/change" - "code.fbi.h-da.de/danet/gosdn/interfaces/device" - "code.fbi.h-da.de/danet/gosdn/interfaces/networkdomain" - "code.fbi.h-da.de/danet/gosdn/interfaces/southbound" si "code.fbi.h-da.de/danet/gosdn/interfaces/store" - "code.fbi.h-da.de/danet/gosdn/nucleus/errors" - - "code.fbi.h-da.de/danet/gosdn/store" - - gpb "github.com/openconfig/gnmi/proto/gnmi" - gnmiv "github.com/openconfig/gnmi/value" - "github.com/openconfig/goyang/pkg/yang" "github.com/google/uuid" "github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ytypes" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" ) // NewPND creates a Principle Network Domain @@ -364,7 +357,10 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati return uuid.Nil, err } } else if entry.IsLeaf() { - typedValue, _ := convertStringToTypedValue(value[0], entry.Type) + typedValue, err := util.ConvertStringToTypedValue(value[0], entry.Type) + if err != nil { + return uuid.Nil, err + } if err := ytypes.SetNode(d.SBI().Schema().RootSchema(), cpy, p, typedValue); err != nil { return uuid.Nil, err } @@ -389,90 +385,6 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati return ch.cuid, nil } -func convertStringToTypedValue(s string, t *yang.YangType) (*gpb.TypedValue, error) { - // TODO: add more types - switch t.Kind { - case yang.Yint8: - parsedInt, err := strconv.ParseInt(s, 10, 8) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int8(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Yint16: - parsedInt, err := strconv.ParseInt(s, 10, 16) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int16(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Yint32: - parsedInt, err := strconv.ParseInt(s, 10, 32) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(int32(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Yuint8: - parsedInt, err := strconv.ParseUint(s, 10, 8) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint8(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Yuint16: - parsedInt, err := strconv.ParseUint(s, 10, 16) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint16(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Yuint32: - parsedInt, err := strconv.ParseUint(s, 10, 32) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(uint32(parsedInt)) - if err != nil { - return nil, err - } - return tv, nil - case yang.Ybool: - parsedBool, err := strconv.ParseBool(s) - if err != nil { - return nil, err - } - tv, err := gnmiv.FromScalar(parsedBool) - if err != nil { - return nil, err - } - return tv, nil - case yang.Ystring: - tv, err := gnmiv.FromScalar(s) - if err != nil { - return nil, err - } - return tv, nil - default: - return nil, fmt.Errorf("unsupported type to convert to TypedValue") - } -} - // nolint will be implemented in the near future func handleRollbackError(id uuid.UUID, err error) { log.Error(err) diff --git a/nucleus/util/convert.go b/nucleus/util/convert.go new file mode 100644 index 0000000000000000000000000000000000000000..1c98020ed65dd3d16603e4b788668f5ab11982fd --- /dev/null +++ b/nucleus/util/convert.go @@ -0,0 +1,96 @@ +package util + +import ( + "fmt" + gpb "github.com/openconfig/gnmi/proto/gnmi" + gnmiv "github.com/openconfig/gnmi/value" + "github.com/openconfig/goyang/pkg/yang" + "strconv" +) + +// ConvertStringToTypedValue takes a value as string and a YangType. The +// returned value is the converted TypedValue of the given string based on the +// given YangType. +func ConvertStringToTypedValue(s string, t *yang.YangType) (*gpb.TypedValue, error) { + // TODO: add more types + switch t.Kind { + case yang.Yint8: + parsedInt, err := strconv.ParseInt(s, 10, 8) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(int8(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Yint16: + parsedInt, err := strconv.ParseInt(s, 10, 16) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(int16(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Yint32: + parsedInt, err := strconv.ParseInt(s, 10, 32) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(int32(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Yuint8: + parsedInt, err := strconv.ParseUint(s, 10, 8) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(uint8(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Yuint16: + parsedInt, err := strconv.ParseUint(s, 10, 16) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(uint16(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Yuint32: + parsedInt, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(uint32(parsedInt)) + if err != nil { + return nil, err + } + return tv, nil + case yang.Ybool: + parsedBool, err := strconv.ParseBool(s) + if err != nil { + return nil, err + } + tv, err := gnmiv.FromScalar(parsedBool) + if err != nil { + return nil, err + } + return tv, nil + case yang.Ystring: + tv, err := gnmiv.FromScalar(s) + if err != nil { + return nil, err + } + return tv, nil + default: + return nil, fmt.Errorf("unsupported type to convert to TypedValue") + } +}