Skip to content
Snippets Groups Projects
Commit 37f1b2c6 authored by Malte Bauch's avatar Malte Bauch
Browse files

commenting and moved ConvertStringToTypedValue into util

parent 630906db
Branches
No related tags found
1 merge request!225Draft: Resolve "A SetRequest to change a specific path of an OND only works for paths with string values"
Pipeline #90727 passed
...@@ -3,41 +3,34 @@ package nucleus ...@@ -3,41 +3,34 @@ package nucleus
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"os" "os"
"plugin" "plugin"
"strconv"
"time" "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/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/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" "code.fbi.h-da.de/danet/yang-models/generated/openconfig"
cpb "code.fbi.h-da.de/danet/api/go/gosdn/csbi" cpb "code.fbi.h-da.de/danet/api/go/gosdn/csbi"
ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd" ppb "code.fbi.h-da.de/danet/api/go/gosdn/pnd"
spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound" spb "code.fbi.h-da.de/danet/api/go/gosdn/southbound"
tpb "code.fbi.h-da.de/danet/api/go/gosdn/transport" 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" 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/google/uuid"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
"github.com/openconfig/ygot/ytypes" "github.com/openconfig/ygot/ytypes"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto"
) )
// NewPND creates a Principle Network Domain // NewPND creates a Principle Network Domain
...@@ -364,7 +357,10 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati ...@@ -364,7 +357,10 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati
return uuid.Nil, err return uuid.Nil, err
} }
} else if entry.IsLeaf() { } 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 { if err := ytypes.SetNode(d.SBI().Schema().RootSchema(), cpy, p, typedValue); err != nil {
return uuid.Nil, err return uuid.Nil, err
} }
...@@ -389,90 +385,6 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati ...@@ -389,90 +385,6 @@ func (pnd *pndImplementation) ChangeOND(duid uuid.UUID, operation ppb.ApiOperati
return ch.cuid, nil 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 // nolint will be implemented in the near future
func handleRollbackError(id uuid.UUID, err error) { func handleRollbackError(id uuid.UUID, err error) {
log.Error(err) log.Error(err)
......
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")
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment