-
S.H. authored
Finalize new mechanism for twin creation, now the basis is a .json configuration file that can be used to restore the exact state of a gosdn network, also many other changes: clab-config deep copy function, switch to using local gnmi-target, add Transpose() function for generating a modified sdnconfig struct, remove UploadClabConig() (was based on wrong understanding of configurationmanagement service)
S.H. authoredFinalize new mechanism for twin creation, now the basis is a .json configuration file that can be used to restore the exact state of a gosdn network, also many other changes: clab-config deep copy function, switch to using local gnmi-target, add Transpose() function for generating a modified sdnconfig struct, remove UploadClabConig() (was based on wrong understanding of configurationmanagement service)
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
networkElement.go 3.93 KiB
package networkelement
import (
"context"
"fmt"
"code.fbi.h-da.de/danet/gosdn/controller/conflict"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/plugin"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport"
"github.com/google/uuid"
gpb "github.com/openconfig/gnmi/proto/gnmi"
"github.com/openconfig/ygot/ygot"
log "github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto"
tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport"
)
// NetworkElement represents an Managed Network Element (MNE) which is managed by
// nucleus.
type NetworkElement interface {
ID() uuid.UUID
GetModel() ([]byte, error)
GetPlugin() plugin.Plugin
GetModelAsFilteredCopy() ([]byte, error)
Transport() transport.Transport
Name() string
ProcessResponse(proto.Message) error
IsTransportValid() bool
GetModelAsString() (string, error)
TransportAddress() string
GetMetadata() conflict.Metadata
PndID() uuid.UUID
GetGnmiSubscriptionPaths() [][]string
}
// Details contains details of a network element used by the cSBI mechanism.
type Details struct {
ID string
Address string
TransportOption *tpb.TransportOption
}
// LoadedNetworkElement represents a Managed Network Element that was loaeded
// by using the Load() method of the NetworkElementStore.
type LoadedNetworkElement struct {
// ID represents the UUID of the LoadedNetworkElement.
ID string `json:"id" bson:"_id"`
// Name represents the name of the LoadedNetworkElement.
Name string `json:"name,omitempty"`
// TransportType represent the type of the transport in use of the LoadedNetworkElement.
TransportType string `json:"transport_type,omitempty" bson:"transport_type,omitempty"`
// TransportAddress represents the address from which the network element can be reached via the transport method.
TransportAddress string `json:"transport_address,omitempty" bson:"transport_address,omitempty"`
// TransportUsername is used for authentication via the transport method in use.
TransportUsername string `json:"transport_username,omitempty" bson:"transport_username,omitempty"`
// TransportPassword is used for authentication via the transport method in use.
TransportPassword string `json:"transport_password,omitempty" bson:"transport_password,omitempty"`
// Note: deprecated, should be removed.
TransportOptionCsbi bool `json:"transport_option_csbi,omitempty" bson:"transport_option_csbi,omitempty"`
// TransportTLS uses TLS from the client side when if true.
TransportTLS bool `json:"transport_tls,omitempty" bson:"transport_tls,omitempty"`
// GnmiSubscriptionPaths are the gnmi paths that the controller should subscribe to on startup.
GnmiSubscriptionPaths [][]string `json:"gnmi_transcription_paths,omitempty" bson:"gnmi_transcription_paths,omitempty"`
// SBI indicates the southbound interface, which is used by this network element as UUID.
Plugin string `json:"plugin"`
Model string `json:"model,omitempty" bson:"model,omitempty"`
Metadata conflict.Metadata `json:"metadata" bson:"metadata"`
PndID string `json:"pnd_id" bson:"pnd_id"`
}
// EnsureIntendedConfigurationIsAppliedOnNetworkElement pushes the stored
// configuration to a network element.
// TODO: find a better place for this function.
func EnsureIntendedConfigurationIsAppliedOnNetworkElement(mne NetworkElement) error {
model, err := mne.GetModelAsFilteredCopy()
if err != nil {
return err
}
fmt.Println("Made it here 0")
req := &gpb.SetRequest{}
path, err := ygot.StringToStructuredPath("/")
if err != nil {
return err
}
fmt.Println("Made it here 1")
req.Replace = []*gpb.Update{{
Path: path,
Val: &gpb.TypedValue{
Value: &gpb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(model)},
},
}}
// This is where ApplyConfig fails for some reason..
response, err := mne.Transport().CustomSet(context.Background(), req)
if err != nil {
log.Errorf("Failed to apply model of network element err=%+v, response=%+v", err, response)
return err
}
fmt.Println("Made it here 2")
return nil
}