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

Add GetModelAsFilteredCopy and changed NewChange creation in ChangeMNE

parent 522ac92f
No related branches found
No related tags found
1 merge request!404Enable export and import of SDN configuration
......@@ -16,6 +16,7 @@ import (
type NetworkElement interface {
ID() uuid.UUID
GetModel() ygot.GoStruct
GetModelAsFilteredCopy() (ygot.GoStruct, error)
CreateModelCopy() (ygot.ValidatedGoStruct, error)
Transport() transport.Transport
Name() string
......
......@@ -122,22 +122,22 @@ func (g *Gnmi) applyDiff(ctx context.Context, payload change.Payload, path *gpb.
return customerrs.NoNewChangesError{Original: payload.Original, Modified: payload.Modified}
}
if op := ctx.Value(types.CtxKeyOperation); op == ppb.ApiOperation_API_OPERATION_UPDATE || op == ppb.ApiOperation_API_OPERATION_REPLACE {
filteredUpdates := make([]*gpb.Update, 0)
for _, u := range diff.Update {
rootSchema := schema.RootSchema()
pathString, err := ygot.PathToString(u.GetPath())
if err != nil {
return err
}
entry := rootSchema.Find(pathString)
if !entry.ReadOnly() {
filteredUpdates = append(filteredUpdates, u)
}
}
diff.Update = filteredUpdates
}
//if op := ctx.Value(types.CtxKeyOperation); op == ppb.ApiOperation_API_OPERATION_UPDATE || op == ppb.ApiOperation_API_OPERATION_REPLACE {
// filteredUpdates := make([]*gpb.Update, 0)
// for _, u := range diff.Update {
// rootSchema := schema.RootSchema()
// pathString, err := ygot.PathToString(u.GetPath())
// if err != nil {
// return err
// }
// entry := rootSchema.Find(pathString)
// if !entry.ReadOnly() {
// filteredUpdates = append(filteredUpdates, u)
// }
// }
// diff.Update = filteredUpdates
//}
req, err := createSetRequest(ctx, diff)
if err != nil {
......
......@@ -13,6 +13,7 @@ import (
"github.com/docker/docker/pkg/namesgenerator"
"github.com/google/uuid"
"github.com/openconfig/ygot/ygot"
"github.com/openconfig/ygot/ytypes"
"go.mongodb.org/mongo-driver/bson"
"google.golang.org/protobuf/proto"
)
......@@ -112,6 +113,16 @@ func (n *CommonNetworkElement) GetModel() ygot.GoStruct {
return n.Model
}
// GetModelAsFilteredCopy returns the ygot representation of the Network
// Element, but as copy with read-only fields removed.
func (n *CommonNetworkElement) GetModelAsFilteredCopy() (ygot.GoStruct, error) {
filteredModelCopy, err := createFilteredCopy(n)
if err != nil {
return nil, err
}
return filteredModelCopy, nil
}
// CreateModelCopy returns a copy of the ygot representation of the Network Element.
func (n *CommonNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) {
return createValidatedCopy(n)
......@@ -186,6 +197,16 @@ func (n *CsbiNetworkElement) GetModel() ygot.GoStruct {
return n.Model
}
// GetModelAsFilteredCopy returns the ygot representation of the Network
// Element, but as copy with read-only fields removed.
func (n *CsbiNetworkElement) GetModelAsFilteredCopy() (ygot.GoStruct, error) {
filteredModelCopy, err := createFilteredCopy(n)
if err != nil {
return nil, err
}
return filteredModelCopy, nil
}
// CreateModelCopy returns a copy of the ygot representation of the Network Element.
func (n *CsbiNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) {
return createValidatedCopy(n)
......@@ -235,6 +256,38 @@ func createValidatedCopy(n networkelement.NetworkElement) (ygot.ValidatedGoStruc
return validatedCpy, nil
}
func createFilteredCopy(n networkelement.NetworkElement) (ygot.GoStruct, error) {
root, err := ygot.DeepCopy(n.SBI().Schema().Root)
if err != nil {
return nil, err
}
ygotDeepCopy, ok := root.(ygot.GoStruct)
if !ok {
return nil, &customerrs.InvalidTypeAssertionError{
Value: root,
Type: (*ygot.ValidatedGoStruct)(nil),
}
}
modelAsString, err := n.GetModelAsString()
if err != nil {
}
path, err := ygot.StringToPath("/", ygot.StructuredPath)
if err != nil {
return nil, err
}
// Use unmarshall from the network elements SBI to unmarshall ygot json in go struct.
opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreReadOnlyFields{}, &ytypes.IgnoreExtraFields{}}
err = n.SBI().Unmarshal([]byte(modelAsString), path, ygotDeepCopy, opts...)
if err != nil {
return nil, err
}
return ygotDeepCopy, nil
}
// IsTransportValid returns a boolean if the transport of a network element is valid.
func (n *CsbiNetworkElement) IsTransportValid() bool {
if n.transportOptions != nil && n.transportOptions.Address != "" {
......
......@@ -544,7 +544,7 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati
}
if entry.IsDir() {
opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}}
opts := []ytypes.UnmarshalOpt{&ytypes.IgnoreExtraFields{}, &ytypes.IgnoreReadOnlyFields{}}
if err := mne.SBI().Unmarshal([]byte(value[0]), p, validatedCpy, opts...); err != nil {
return uuid.Nil, err
}
......@@ -575,7 +575,12 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati
return mne.Transport().Set(ctx, payload, pathToSet, schema)
}
ch := NewChange(duid, mne.GetModel(), validatedCpy, callback)
filteredCurrentModel, err := mne.GetModelAsFilteredCopy()
if err != nil {
return uuid.Nil, err
}
ch := NewChange(duid, filteredCurrentModel, validatedCpy, callback)
if err := pnd.changes.Add(ch); err != nil {
return uuid.Nil, err
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment