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
Branches
Tags
1 merge request!404Enable export and import of SDN configuration
...@@ -16,6 +16,7 @@ import ( ...@@ -16,6 +16,7 @@ import (
type NetworkElement interface { type NetworkElement interface {
ID() uuid.UUID ID() uuid.UUID
GetModel() ygot.GoStruct GetModel() ygot.GoStruct
GetModelAsFilteredCopy() (ygot.GoStruct, error)
CreateModelCopy() (ygot.ValidatedGoStruct, error) CreateModelCopy() (ygot.ValidatedGoStruct, error)
Transport() transport.Transport Transport() transport.Transport
Name() string Name() string
......
...@@ -122,22 +122,22 @@ func (g *Gnmi) applyDiff(ctx context.Context, payload change.Payload, path *gpb. ...@@ -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} 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 { //if op := ctx.Value(types.CtxKeyOperation); op == ppb.ApiOperation_API_OPERATION_UPDATE || op == ppb.ApiOperation_API_OPERATION_REPLACE {
filteredUpdates := make([]*gpb.Update, 0) // filteredUpdates := make([]*gpb.Update, 0)
for _, u := range diff.Update { // for _, u := range diff.Update {
rootSchema := schema.RootSchema() // rootSchema := schema.RootSchema()
pathString, err := ygot.PathToString(u.GetPath()) // pathString, err := ygot.PathToString(u.GetPath())
if err != nil { // if err != nil {
return err // return err
} // }
entry := rootSchema.Find(pathString) // entry := rootSchema.Find(pathString)
if !entry.ReadOnly() { // if !entry.ReadOnly() {
filteredUpdates = append(filteredUpdates, u) // filteredUpdates = append(filteredUpdates, u)
} // }
} // }
diff.Update = filteredUpdates // diff.Update = filteredUpdates
} //}
req, err := createSetRequest(ctx, diff) req, err := createSetRequest(ctx, diff)
if err != nil { if err != nil {
......
...@@ -13,6 +13,7 @@ import ( ...@@ -13,6 +13,7 @@ import (
"github.com/docker/docker/pkg/namesgenerator" "github.com/docker/docker/pkg/namesgenerator"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/openconfig/ygot/ygot" "github.com/openconfig/ygot/ygot"
"github.com/openconfig/ygot/ytypes"
"go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
...@@ -112,6 +113,16 @@ func (n *CommonNetworkElement) GetModel() ygot.GoStruct { ...@@ -112,6 +113,16 @@ func (n *CommonNetworkElement) GetModel() ygot.GoStruct {
return n.Model 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. // CreateModelCopy returns a copy of the ygot representation of the Network Element.
func (n *CommonNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) { func (n *CommonNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) {
return createValidatedCopy(n) return createValidatedCopy(n)
...@@ -186,6 +197,16 @@ func (n *CsbiNetworkElement) GetModel() ygot.GoStruct { ...@@ -186,6 +197,16 @@ func (n *CsbiNetworkElement) GetModel() ygot.GoStruct {
return n.Model 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. // CreateModelCopy returns a copy of the ygot representation of the Network Element.
func (n *CsbiNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) { func (n *CsbiNetworkElement) CreateModelCopy() (ygot.ValidatedGoStruct, error) {
return createValidatedCopy(n) return createValidatedCopy(n)
...@@ -235,6 +256,38 @@ func createValidatedCopy(n networkelement.NetworkElement) (ygot.ValidatedGoStruc ...@@ -235,6 +256,38 @@ func createValidatedCopy(n networkelement.NetworkElement) (ygot.ValidatedGoStruc
return validatedCpy, nil 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. // IsTransportValid returns a boolean if the transport of a network element is valid.
func (n *CsbiNetworkElement) IsTransportValid() bool { func (n *CsbiNetworkElement) IsTransportValid() bool {
if n.transportOptions != nil && n.transportOptions.Address != "" { if n.transportOptions != nil && n.transportOptions.Address != "" {
......
...@@ -544,7 +544,7 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati ...@@ -544,7 +544,7 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati
} }
if entry.IsDir() { 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 { if err := mne.SBI().Unmarshal([]byte(value[0]), p, validatedCpy, opts...); err != nil {
return uuid.Nil, err return uuid.Nil, err
} }
...@@ -575,7 +575,12 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati ...@@ -575,7 +575,12 @@ func (pnd *pndImplementation) ChangeMNE(duid uuid.UUID, operation ppb.ApiOperati
return mne.Transport().Set(ctx, payload, pathToSet, schema) 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 { if err := pnd.changes.Add(ch); err != nil {
return uuid.Nil, err 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