diff --git a/applications/venv-manager/venv-manager/venv-manager.go b/applications/venv-manager/venv-manager/venv-manager.go index 107ead5b3d5a08a85d3ebd3277da2011ba6722d2..8d9743e22052df5b0a8d7a1cfda76b154228747f 100644 --- a/applications/venv-manager/venv-manager/venv-manager.go +++ b/applications/venv-manager/venv-manager/venv-manager.go @@ -11,8 +11,7 @@ import ( configMgmtPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/configurationmanagement" corePb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" - networkelementPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" - pndPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" topologyPb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/containerlab" link "code.fbi.h-da.de/danet/gosdn/applications/venv-manager/links" @@ -296,12 +295,12 @@ func (v *VenvManager) parseTopologyDataIntoStructs(topologyData *topologyPb.GetT } func (v *VenvManager) loadNetworkElementModelPathsIntoGosdn(ctx context.Context, conn *grpc.ClientConn, nodes *[]node.Node) error { - pndService := pndPb.NewPndServiceClient(conn) + networkElementService := mnepb.NewNetworkElementServiceClient(conn) paths := [2]string{"/lldp/config/system-description", "/system/state/"} for _, path := range paths { for _, node := range *nodes { - _, err := pndService.GetPath(ctx, &pndPb.GetPathRequest{Mneid: node.ID, Pid: v.pndID, Path: path}) + _, err := networkElementService.GetPath(ctx, &mnepb.GetPathRequest{Mneid: node.ID, Pid: v.pndID, Path: path}) if err != nil { return err } @@ -335,10 +334,10 @@ func (v *VenvManager) getAndAddMoreData(topologyData *topology.GoSdnTopology) (* return nil, err } - networkElementService := networkelementPb.NewNetworkElementServiceClient(conn) + networkElementService := mnepb.NewNetworkElementServiceClient(conn) for iterator, node := range topologyData.Nodes { - getNetworkElementResponse, _ := networkElementService.Get(ctx, &networkelementPb.GetNetworkElementRequest{NetworkElementId: node.ID}) + getNetworkElementResponse, _ := networkElementService.Get(ctx, &mnepb.GetNetworkElementRequest{NetworkElementId: node.ID}) if err != nil { return nil, err } diff --git a/controller/controller.go b/controller/controller.go index b8034063332d77db43fc8c6d57a430f932ca39d2..7120383243706eecc6a6e80c00c84520d517757b 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -299,18 +299,18 @@ func ensureDefaultRoleExists() error { "/gosdn.rbac.RoleService/UpdateRoles", "/gosdn.rbac.RoleService/DeletePermissionsForRole", "/gosdn.rbac.RoleService/DeleteRoles", - "/gosdn.pnd.PndService/GetMne", - "/gosdn.pnd.PndService/GetFlattenedMne", - "/gosdn.pnd.PndService/GetFlattenedMneList", - "/gosdn.pnd.PndService/GetPath", - "/gosdn.pnd.PndService/GetChange", - "/gosdn.pnd.PndService/GetChangeList", - "/gosdn.pnd.PndService/SetMneList", - "/gosdn.pnd.PndService/SetChangeList", - "/gosdn.pnd.PndService/SetPathList", - "/gosdn.pnd.PndService/DeviceSchema", - "/gosdn.pnd.PndService/DeleteMne", - "/gosdn.pnd.PndService/SubscribePath", + "/gosdn.networkelement.NetworkElementService/GetMne", + "/gosdn.networkelement.NetworkElementService/GetFlattenedMne", + "/gosdn.networkelement.NetworkElementService/GetFlattenedMneList", + "/gosdn.networkelement.NetworkElementService/GetPath", + "/gosdn.networkelement.NetworkElementService/GetChange", + "/gosdn.networkelement.NetworkElementService/GetChangeList", + "/gosdn.networkelement.NetworkElementService/SetMneList", + "/gosdn.networkelement.NetworkElementService/SetChangeList", + "/gosdn.networkelement.NetworkElementService/SetPathList", + "/gosdn.networkelement.NetworkElementService/DeviceSchema", + "/gosdn.networkelement.NetworkElementService/DeleteMne", + "/gosdn.networkelement.NetworkElementService/SubscribePath", "/gosdn.plugin_internal.PluginInternalService/AvailablePlugins", "/gosdn.plugin_internal.PluginInternalService/GetPluginSchema", })) diff --git a/controller/interfaces/networkelement/networkElement.go b/controller/interfaces/networkelement/networkElement.go index 2cf22d67756bf24804e6c04e01e52daabe86f5c0..54d1b6b65856e85e955442a16e57126f6fbc7e28 100644 --- a/controller/interfaces/networkelement/networkElement.go +++ b/controller/interfaces/networkelement/networkElement.go @@ -1,10 +1,15 @@ package networkelement import ( + "context" + "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" @@ -59,3 +64,34 @@ type LoadedNetworkElement struct { 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 + } + + req := &gpb.SetRequest{} + path, err := ygot.StringToStructuredPath("/") + if err != nil { + return err + } + + req.Update = []*gpb.Update{{ + Path: path, + Val: &gpb.TypedValue{ + Value: &gpb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(model)}, + }, + }} + + 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 + } + + return nil +} diff --git a/controller/northbound/server/configurationmanagement.go b/controller/northbound/server/configurationmanagement.go index 5ca7b5a2baa05fd9ef78b6209cf8e358677ee0e9..7ada43b6cfca8a789771eea6e9ae77135746f766 100644 --- a/controller/northbound/server/configurationmanagement.go +++ b/controller/northbound/server/configurationmanagement.go @@ -119,7 +119,7 @@ func (c ConfigurationManagementServer) ImportSDNConfig(ctx context.Context, requ return nil, err } - err = c.deleteAllElementsFromDatabase(pndUUID) + err = c.deleteAllElementsFromDatabase() if err != nil { return nil, err } @@ -134,8 +134,8 @@ func (c ConfigurationManagementServer) ImportSDNConfig(ctx context.Context, requ Status: cmpb.Status_STATUS_OK}, nil } -func (c ConfigurationManagementServer) deleteAllElementsFromDatabase(pndUUID uuid.UUID) error { - if err := c.deleteNetworkElements(pndUUID); err != nil { +func (c ConfigurationManagementServer) deleteAllElementsFromDatabase() error { + if err := c.deleteNetworkElements(); err != nil { return err } @@ -187,7 +187,7 @@ func (c ConfigurationManagementServer) deleteTopology() error { return nil } -func (c ConfigurationManagementServer) deleteNetworkElements(pndUUID uuid.UUID) error { +func (c ConfigurationManagementServer) deleteNetworkElements() error { networkElements, err := c.mneService.GetAll() if err != nil { return err @@ -307,7 +307,7 @@ func (c ConfigurationManagementServer) createNetworkElements(sdnConfig *loadedSD return err } - _, err = nucleus.NewNetworkElement( + createdNetworkElement, err := nucleus.NewNetworkElement( inputNetworkElement.Name, uuid.MustParse(inputNetworkElement.ID), &transportOption, @@ -319,15 +319,24 @@ func (c ConfigurationManagementServer) createNetworkElements(sdnConfig *loadedSD return err } - networkelement, err := c.mneService.Get(store.Query{ID: uuid.MustParse(inputNetworkElement.ID)}) + if err := c.mneService.Add(createdNetworkElement); err != nil { + return err + } + + err = c.mneService.UpdateModel(createdNetworkElement.ID(), inputNetworkElement.Model) if err != nil { return err } - err = c.mneService.UpdateModel(networkelement.ID(), inputNetworkElement.Model) + networkElement, err := c.mneService.Get(store.Query{ID: uuid.MustParse(inputNetworkElement.ID)}) if err != nil { return err } + + if err := networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement); err != nil { + return err + } + } return nil } diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 0bdc68832fbaee2032273057e5291bfb46d7be3f..edb6e7cbadbca7988ceff497f0c0b4fe5c5e23a7 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -192,7 +192,12 @@ func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.Update return nil, err } - err = n.ensureIntendedConfigurationIsAppliedOnNetworkElement(mneID) + networkElement, err := n.mneService.Get(store.Query{ID: mneID}) + if err != nil { + return nil, err + } + + err = networkelement.EnsureIntendedConfigurationIsAppliedOnNetworkElement(networkElement) if err != nil { return &mnepb.UpdateNetworkElementResponse{ Timestamp: time.Now().UnixNano(), @@ -206,41 +211,6 @@ func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.Update }, nil } -func (n *NetworkElementServer) ensureIntendedConfigurationIsAppliedOnNetworkElement(mneID uuid.UUID) error { - mne, err := n.mneService.Get(store.Query{ - ID: mneID, - }) - if err != nil { - return err - } - - model, err := mne.GetModelAsString() - if err != nil { - return err - } - - req := &gpb.SetRequest{} - path, err := ygot.StringToStructuredPath("/") - if err != nil { - return err - } - - req.Update = []*gpb.Update{{ - Path: path, - Val: &gpb.TypedValue{ - Value: &gpb.TypedValue_JsonIetfVal{JsonIetfVal: []byte(model)}, - }, - }} - - 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 - } - - return nil -} - // GetMne gets a specific mne. func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMneRequest) (*mnepb.GetMneResponse, error) { labels := prometheus.Labels{"service": "mne", "rpc": "get"}