diff options
author | Eric Multanen <eric.w.multanen@intel.com> | 2020-05-28 17:25:30 -0700 |
---|---|---|
committer | Eric Multanen <eric.w.multanen@intel.com> | 2020-06-02 14:00:07 -0700 |
commit | a6e2a3a65a6e4f3f1d964578ae4e60c6f9dd1184 (patch) | |
tree | ab7fa1157f9b98840b0482592c886da61e62cc6d /src/ncm/pkg/module | |
parent | ad7782cbf83c11f152a6457f3808a4da99a1ae56 (diff) |
Reorganize ncm packages to align with architecture
Reorginize the ncm packges to delineate
- cluster provider and cluster management
- virtual and provider netowrk intent management
- intent scheduler
- internal ovn4k8s network controller
Overall, no code changes, just moving things around.
Issue-ID: MULTICLOUD-1029
Signed-off-by: Eric Multanen <eric.w.multanen@intel.com>
Change-Id: I3d43c7e4eb6f285b51c0385ba18626d3511a14f5
Diffstat (limited to 'src/ncm/pkg/module')
-rw-r--r-- | src/ncm/pkg/module/cluster.go | 848 | ||||
-rw-r--r-- | src/ncm/pkg/module/module.go | 20 | ||||
-rw-r--r-- | src/ncm/pkg/module/network.go | 180 | ||||
-rw-r--r-- | src/ncm/pkg/module/providernet.go | 182 | ||||
-rw-r--r-- | src/ncm/pkg/module/types/module_definitions.go | 24 |
5 files changed, 38 insertions, 1216 deletions
diff --git a/src/ncm/pkg/module/cluster.go b/src/ncm/pkg/module/cluster.go deleted file mode 100644 index 5d1f577f..00000000 --- a/src/ncm/pkg/module/cluster.go +++ /dev/null @@ -1,848 +0,0 @@ -/* - * Copyright 2020 Intel Corporation, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package module - -import ( - "context" - "encoding/json" - "time" - - "github.com/onap/multicloud-k8s/src/ncm/pkg/grpc" - appcontext "github.com/onap/multicloud-k8s/src/orchestrator/pkg/appcontext" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db" - log "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/logutils" - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/rpc" - installpb "github.com/onap/multicloud-k8s/src/rsync/pkg/grpc/installapp" - "gopkg.in/yaml.v2" - - pkgerrors "github.com/pkg/errors" -) - -// ClusterProvider contains the parameters needed for ClusterProviders -type ClusterProvider struct { - Metadata Metadata `json:"metadata"` -} - -type Cluster struct { - Metadata Metadata `json:"metadata"` -} - -type ClusterContent struct { - Kubeconfig string `json:"kubeconfig"` -} - -type ClusterLabel struct { - LabelName string `json:"label-name"` -} - -type ClusterKvPairs struct { - Metadata Metadata `json:"metadata"` - Spec ClusterKvSpec `json:"spec"` -} - -type ClusterKvSpec struct { - Kv []map[string]interface{} `json:"kv"` -} - -// ClusterProviderKey is the key structure that is used in the database -type ClusterProviderKey struct { - ClusterProviderName string `json:"provider"` -} - -// ClusterKey is the key structure that is used in the database -type ClusterKey struct { - ClusterProviderName string `json:"provider"` - ClusterName string `json:"cluster"` -} - -// ClusterLabelKey is the key structure that is used in the database -type ClusterLabelKey struct { - ClusterProviderName string `json:"provider"` - ClusterName string `json:"cluster"` - ClusterLabelName string `json:"label"` -} - -// LabelKey is the key structure that is used in the database -type LabelKey struct { - ClusterProviderName string `json:"provider"` - ClusterLabelName string `json:"label"` -} - -// ClusterKvPairsKey is the key structure that is used in the database -type ClusterKvPairsKey struct { - ClusterProviderName string `json:"provider"` - ClusterName string `json:"cluster"` - ClusterKvPairsName string `json:"kvname"` -} - -const SEPARATOR = "+" -const CONTEXT_CLUSTER_APP = "network-intents" -const CONTEXT_CLUSTER_RESOURCE = "network-intents" - -// ClusterManager is an interface exposes the Cluster functionality -type ClusterManager interface { - CreateClusterProvider(pr ClusterProvider) (ClusterProvider, error) - GetClusterProvider(name string) (ClusterProvider, error) - GetClusterProviders() ([]ClusterProvider, error) - DeleteClusterProvider(name string) error - CreateCluster(provider string, pr Cluster, qr ClusterContent) (Cluster, error) - GetCluster(provider, name string) (Cluster, error) - GetClusterContent(provider, name string) (ClusterContent, error) - GetClusterContext(provider, name string) (appcontext.AppContext, error) - GetClusters(provider string) ([]Cluster, error) - GetClustersWithLabel(provider, label string) ([]string, error) - DeleteCluster(provider, name string) error - ApplyNetworkIntents(provider, name string) error - TerminateNetworkIntents(provider, name string) error - CreateClusterLabel(provider, cluster string, pr ClusterLabel) (ClusterLabel, error) - GetClusterLabel(provider, cluster, label string) (ClusterLabel, error) - GetClusterLabels(provider, cluster string) ([]ClusterLabel, error) - DeleteClusterLabel(provider, cluster, label string) error - CreateClusterKvPairs(provider, cluster string, pr ClusterKvPairs) (ClusterKvPairs, error) - GetClusterKvPairs(provider, cluster, kvpair string) (ClusterKvPairs, error) - GetAllClusterKvPairs(provider, cluster string) ([]ClusterKvPairs, error) - DeleteClusterKvPairs(provider, cluster, kvpair string) error -} - -// ClusterClient implements the Manager -// It will also be used to maintain some localized state -type ClusterClient struct { - db ClientDbInfo -} - -// NewClusterClient returns an instance of the ClusterClient -// which implements the Manager -func NewClusterClient() *ClusterClient { - return &ClusterClient{ - db: ClientDbInfo{ - storeName: "cluster", - tagMeta: "clustermetadata", - tagContent: "clustercontent", - tagContext: "clustercontext", - }, - } -} - -// CreateClusterProvider - create a new Cluster Provider -func (v *ClusterClient) CreateClusterProvider(p ClusterProvider) (ClusterProvider, error) { - - //Construct key and tag to select the entry - key := ClusterProviderKey{ - ClusterProviderName: p.Metadata.Name, - } - - //Check if this ClusterProvider already exists - _, err := v.GetClusterProvider(p.Metadata.Name) - if err == nil { - return ClusterProvider{}, pkgerrors.New("ClusterProvider already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return ClusterProvider{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetClusterProvider returns the ClusterProvider for corresponding name -func (v *ClusterClient) GetClusterProvider(name string) (ClusterProvider, error) { - - //Construct key and tag to select the entry - key := ClusterProviderKey{ - ClusterProviderName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return ClusterProvider{}, pkgerrors.Wrap(err, "Get ClusterProvider") - } - - //value is a byte array - if value != nil { - cp := ClusterProvider{} - err = db.DBconn.Unmarshal(value[0], &cp) - if err != nil { - return ClusterProvider{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cp, nil - } - - return ClusterProvider{}, pkgerrors.New("Error getting ClusterProvider") -} - -// GetClusterProviderList returns all of the ClusterProvider for corresponding name -func (v *ClusterClient) GetClusterProviders() ([]ClusterProvider, error) { - - //Construct key and tag to select the entry - key := ClusterProviderKey{ - ClusterProviderName: "", - } - - var resp []ClusterProvider - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []ClusterProvider{}, pkgerrors.Wrap(err, "Get ClusterProviders") - } - - for _, value := range values { - cp := ClusterProvider{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []ClusterProvider{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// DeleteClusterProvider the ClusterProvider from database -func (v *ClusterClient) DeleteClusterProvider(name string) error { - - //Construct key and tag to select the entry - key := ClusterProviderKey{ - ClusterProviderName: name, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete ClusterProvider Entry;") - } - - return nil -} - -// CreateCluster - create a new Cluster for a cluster-provider -func (v *ClusterClient) CreateCluster(provider string, p Cluster, q ClusterContent) (Cluster, error) { - - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: p.Metadata.Name, - } - - //Verify ClusterProvider already exists - _, err := v.GetClusterProvider(provider) - if err != nil { - return Cluster{}, pkgerrors.New("ClusterProvider does not exist") - } - - //Check if this Cluster already exists - _, err = v.GetCluster(provider, p.Metadata.Name) - if err == nil { - return Cluster{}, pkgerrors.New("Cluster already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return Cluster{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagContent, q) - if err != nil { - return Cluster{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetCluster returns the Cluster for corresponding provider and name -func (v *ClusterClient) GetCluster(provider, name string) (Cluster, error) { - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return Cluster{}, pkgerrors.Wrap(err, "Get Cluster") - } - - //value is a byte array - if value != nil { - cl := Cluster{} - err = db.DBconn.Unmarshal(value[0], &cl) - if err != nil { - return Cluster{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cl, nil - } - - return Cluster{}, pkgerrors.New("Error getting Cluster") -} - -// GetClusterContent returns the ClusterContent for corresponding provider and name -func (v *ClusterClient) GetClusterContent(provider, name string) (ClusterContent, error) { - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagContent) - if err != nil { - return ClusterContent{}, pkgerrors.Wrap(err, "Get Cluster Content") - } - - //value is a byte array - if value != nil { - cc := ClusterContent{} - err = db.DBconn.Unmarshal(value[0], &cc) - if err != nil { - return ClusterContent{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cc, nil - } - - return ClusterContent{}, pkgerrors.New("Error getting Cluster Content") -} - -// GetClusterContext returns the AppContext for corresponding provider and name -func (v *ClusterClient) GetClusterContext(provider, name string) (appcontext.AppContext, error) { - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagContext) - if err != nil { - return appcontext.AppContext{}, pkgerrors.Wrap(err, "Get Cluster Context") - } - - //value is a byte array - if value != nil { - ctxVal := string(value[0]) - var cc appcontext.AppContext - _, err = cc.LoadAppContext(ctxVal) - if err != nil { - return appcontext.AppContext{}, pkgerrors.Wrap(err, "Reinitializing Cluster AppContext") - } - return cc, nil - } - - return appcontext.AppContext{}, pkgerrors.New("Error getting Cluster AppContext") -} - -// GetClusters returns all the Clusters for corresponding provider -func (v *ClusterClient) GetClusters(provider string) ([]Cluster, error) { - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: "", - } - - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []Cluster{}, pkgerrors.Wrap(err, "Get Clusters") - } - - var resp []Cluster - - for _, value := range values { - cp := Cluster{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []Cluster{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// GetClustersWithLabel returns all the Clusters with Labels for provider -// Support Query like /cluster-providers/{Provider}/clusters?label={label} -func (v *ClusterClient) GetClustersWithLabel(provider, label string) ([]string, error) { - //Construct key and tag to select the entry - key := LabelKey{ - ClusterProviderName: provider, - ClusterLabelName: label, - } - - values, err := db.DBconn.Find(v.db.storeName, key, "cluster") - if err != nil { - return []string{}, pkgerrors.Wrap(err, "Get Clusters by label") - } - var resp []string - - for _, value := range values { - cp := string(value) - resp = append(resp, cp) - } - - return resp, nil -} - -// DeleteCluster the Cluster from database -func (v *ClusterClient) DeleteCluster(provider, name string) error { - //Construct key and tag to select the entry - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - _, err := v.GetClusterContext(provider, name) - if err == nil { - return pkgerrors.Errorf("Cannot delete cluster until context is deleted: %v, %v", provider, name) - } - - err = db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete Cluster Entry;") - } - - return nil -} - -// Apply Network Intents associated with a cluster -func (v *ClusterClient) ApplyNetworkIntents(provider, name string) error { - - _, err := v.GetClusterContext(provider, name) - if err == nil { - return pkgerrors.Errorf("Cluster network intents have already been applied: %v, %v", provider, name) - } - - type resource struct { - name string - value string - } - - var resources []resource - - // Find all Network Intents for this cluster - networkIntents, err := NewNetworkClient().GetNetworks(provider, name) - if err != nil { - return pkgerrors.Wrap(err, "Error finding Network Intents") - } - for _, intent := range networkIntents { - var crNetwork = CrNetwork{ - ApiVersion: NETWORK_APIVERSION, - Kind: NETWORK_KIND, - } - crNetwork.Network = intent - // Produce the yaml CR document for each intent - y, err := yaml.Marshal(&crNetwork) - if err != nil { - log.Info("Error marshalling network intent to yaml", log.Fields{ - "error": err, - "intent": intent, - }) - continue - } - resources = append(resources, resource{ - name: intent.Metadata.Name + SEPARATOR + NETWORK_KIND, - value: string(y), - }) - } - - // Find all Provider Network Intents for this cluster - providerNetworkIntents, err := NewProviderNetClient().GetProviderNets(provider, name) - if err != nil { - return pkgerrors.Wrap(err, "Error finding Provider Network Intents") - } - for _, intent := range providerNetworkIntents { - var crProviderNet = CrProviderNet{ - ApiVersion: PROVIDER_NETWORK_APIVERSION, - Kind: PROVIDER_NETWORK_KIND, - } - crProviderNet.ProviderNet = intent - // Produce the yaml CR document for each intent - y, err := yaml.Marshal(&crProviderNet) - if err != nil { - log.Info("Error marshalling provider network intent to yaml", log.Fields{ - "error": err, - "intent": intent, - }) - continue - } - resources = append(resources, resource{ - name: intent.Metadata.Name + SEPARATOR + PROVIDER_NETWORK_KIND, - value: string(y), - }) - } - - if len(resources) == 0 { - return nil - } - - // Make an app context for the network intent resources - ac := appcontext.AppContext{} - ctxVal, err := ac.InitAppContext() - if err != nil { - return pkgerrors.Wrap(err, "Error creating AppContext") - } - handle, err := ac.CreateCompositeApp() - if err != nil { - return pkgerrors.Wrap(err, "Error creating AppContext CompositeApp") - } - - // Add an app (fixed value) to the app context - apphandle, err := ac.AddApp(handle, CONTEXT_CLUSTER_APP) - if err != nil { - cleanuperr := ac.DeleteCompositeApp() - if cleanuperr != nil { - log.Warn("Error cleaning AppContext CompositeApp create failure", log.Fields{ - "cluster-provider": provider, - "cluster": name, - }) - } - return pkgerrors.Wrap(err, "Error adding App to AppContext") - } - - // Add an app order instruction - appinstr := struct { - Apporder []string `json:"apporder"` - }{ - []string{CONTEXT_CLUSTER_APP}, - } - jinstr, _ := json.Marshal(appinstr) - - appdepinstr := struct { - Appdep map[string]string `json:"appdependency"` - }{ - map[string]string{CONTEXT_CLUSTER_APP: "go"}, - } - jdep, _ := json.Marshal(appdepinstr) - - _, err = ac.AddInstruction(handle, "app", "order", string(jinstr)) - _, err = ac.AddInstruction(handle, "app", "dependency", string(jdep)) - - // Add a cluster to the app - clusterhandle, err := ac.AddCluster(apphandle, provider+SEPARATOR+name) - if err != nil { - cleanuperr := ac.DeleteCompositeApp() - if cleanuperr != nil { - log.Warn("Error cleaning AppContext after add cluster failure", log.Fields{ - "cluster-provider": provider, - "cluster": name, - }) - } - return pkgerrors.Wrap(err, "Error adding Cluster to AppContext") - } - - // add the resources to the app context - - var orderinstr struct { - Resorder []string `json:"resorder"` - } - var depinstr struct { - Resdep map[string]string `json:"resdependency"` - } - resdep := make(map[string]string) - for _, resource := range resources { - orderinstr.Resorder = append(orderinstr.Resorder, resource.name) - resdep[resource.name] = "go" - _, err = ac.AddResource(clusterhandle, resource.name, resource.value) - if err != nil { - cleanuperr := ac.DeleteCompositeApp() - if cleanuperr != nil { - log.Warn("Error cleaning AppContext after add resource failure", log.Fields{ - "cluster-provider": provider, - "cluster": name, - "resource": resource.name, - }) - } - return pkgerrors.Wrap(err, "Error adding Resource to AppContext") - } - } - jresord, _ := json.Marshal(orderinstr) - depinstr.Resdep = resdep - jresdep, _ := json.Marshal(depinstr) - _, err = ac.AddInstruction(clusterhandle, "resource", "order", string(jresord)) - _, err = ac.AddInstruction(clusterhandle, "resource", "dependency", string(jresdep)) - - // save the context in the cluster db record - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagContext, ctxVal) - if err != nil { - cleanuperr := ac.DeleteCompositeApp() - if cleanuperr != nil { - log.Warn("Error cleaning AppContext after DB insert failure", log.Fields{ - "cluster-provider": provider, - "cluster": name, - }) - } - return pkgerrors.Wrap(err, "Error adding AppContext to DB") - } - - // call resource synchronizer to instantiate the CRs in the cluster - conn := rpc.GetRpcConn(grpc.RsyncName) - if conn == nil { - grpc.InitRsyncClient() - conn = rpc.GetRpcConn(grpc.RsyncName) - } - - var rpcClient installpb.InstallappClient - var installRes *installpb.InstallAppResponse - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - if conn != nil { - rpcClient = installpb.NewInstallappClient(conn) - installReq := new(installpb.InstallAppRequest) - installReq.AppContext = ctxVal.(string) - installRes, err = rpcClient.InstallApp(ctx, installReq) - if err == nil { - log.Info("Response from InstappApp GRPC call", log.Fields{ - "Succeeded": installRes.AppContextInstalled, - "Message": installRes.AppContextInstallMessage, - }) - } - } else { - return pkgerrors.Errorf("InstallApp Failed - Could not get InstallAppClient: %v", grpc.RsyncName) - } - - return nil -} - -// Terminate Network Intents associated with a cluster -func (v *ClusterClient) TerminateNetworkIntents(provider, name string) error { - context, err := v.GetClusterContext(provider, name) - if err != nil { - return pkgerrors.Wrapf(err, "Error finding AppContext for cluster: %v, %v", provider, name) - } - - // TODO: call resource synchronizer to terminate the CRs in the cluster - - // remove the app context - cleanuperr := context.DeleteCompositeApp() - if cleanuperr != nil { - log.Warn("Error deleted AppContext", log.Fields{ - "cluster-provider": provider, - "cluster": name, - }) - } - - // remove the app context field from the cluster db record - key := ClusterKey{ - ClusterProviderName: provider, - ClusterName: name, - } - err = db.DBconn.RemoveTag(v.db.storeName, key, v.db.tagContext) - if err != nil { - log.Warn("Error removing AppContext from Cluster document", log.Fields{ - "cluster-provider": provider, - "cluster": name, - }) - } - return nil -} - -// CreateClusterLabel - create a new Cluster Label mongo document for a cluster-provider/cluster -func (v *ClusterClient) CreateClusterLabel(provider string, cluster string, p ClusterLabel) (ClusterLabel, error) { - //Construct key and tag to select the entry - key := ClusterLabelKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterLabelName: p.LabelName, - } - - //Verify Cluster already exists - _, err := v.GetCluster(provider, cluster) - if err != nil { - return ClusterLabel{}, pkgerrors.New("Cluster does not exist") - } - - //Check if this ClusterLabel already exists - _, err = v.GetClusterLabel(provider, cluster, p.LabelName) - if err == nil { - return ClusterLabel{}, pkgerrors.New("Cluster Label already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return ClusterLabel{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetClusterLabel returns the Cluster for corresponding provider, cluster and label -func (v *ClusterClient) GetClusterLabel(provider, cluster, label string) (ClusterLabel, error) { - //Construct key and tag to select the entry - key := ClusterLabelKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterLabelName: label, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return ClusterLabel{}, pkgerrors.Wrap(err, "Get Cluster") - } - - //value is a byte array - if value != nil { - cl := ClusterLabel{} - err = db.DBconn.Unmarshal(value[0], &cl) - if err != nil { - return ClusterLabel{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cl, nil - } - - return ClusterLabel{}, pkgerrors.New("Error getting Cluster") -} - -// GetClusterLabels returns the Cluster Labels for corresponding provider and cluster -func (v *ClusterClient) GetClusterLabels(provider, cluster string) ([]ClusterLabel, error) { - //Construct key and tag to select the entry - key := ClusterLabelKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterLabelName: "", - } - - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []ClusterLabel{}, pkgerrors.Wrap(err, "Get Cluster Labels") - } - - var resp []ClusterLabel - - for _, value := range values { - cp := ClusterLabel{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []ClusterLabel{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// Delete the Cluster Label from database -func (v *ClusterClient) DeleteClusterLabel(provider, cluster, label string) error { - //Construct key and tag to select the entry - key := ClusterLabelKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterLabelName: label, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete ClusterLabel Entry;") - } - - return nil -} - -// CreateClusterKvPairs - Create a New Cluster KV pairs document -func (v *ClusterClient) CreateClusterKvPairs(provider string, cluster string, p ClusterKvPairs) (ClusterKvPairs, error) { - key := ClusterKvPairsKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterKvPairsName: p.Metadata.Name, - } - - //Verify Cluster already exists - _, err := v.GetCluster(provider, cluster) - if err != nil { - return ClusterKvPairs{}, pkgerrors.New("Cluster does not exist") - } - - //Check if this ClusterKvPairs already exists - _, err = v.GetClusterKvPairs(provider, cluster, p.Metadata.Name) - if err == nil { - return ClusterKvPairs{}, pkgerrors.New("Cluster KV Pair already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return ClusterKvPairs{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetClusterKvPairs returns the Cluster KeyValue pair for corresponding provider, cluster and KV pair name -func (v *ClusterClient) GetClusterKvPairs(provider, cluster, kvpair string) (ClusterKvPairs, error) { - //Construct key and tag to select entry - key := ClusterKvPairsKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterKvPairsName: kvpair, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return ClusterKvPairs{}, pkgerrors.Wrap(err, "Get Cluster") - } - - //value is a byte array - if value != nil { - ckvp := ClusterKvPairs{} - err = db.DBconn.Unmarshal(value[0], &ckvp) - if err != nil { - return ClusterKvPairs{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return ckvp, nil - } - - return ClusterKvPairs{}, pkgerrors.New("Error getting Cluster") -} - -// GetAllClusterKvPairs returns the Cluster Kv Pairs for corresponding provider and cluster -func (v *ClusterClient) GetAllClusterKvPairs(provider, cluster string) ([]ClusterKvPairs, error) { - //Construct key and tag to select the entry - key := ClusterKvPairsKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterKvPairsName: "", - } - - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []ClusterKvPairs{}, pkgerrors.Wrap(err, "Get Cluster KV Pairs") - } - - var resp []ClusterKvPairs - - for _, value := range values { - cp := ClusterKvPairs{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []ClusterKvPairs{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// DeleteClusterKvPairs the ClusterKvPairs from database -func (v *ClusterClient) DeleteClusterKvPairs(provider, cluster, kvpair string) error { - //Construct key and tag to select entry - key := ClusterKvPairsKey{ - ClusterProviderName: provider, - ClusterName: cluster, - ClusterKvPairsName: kvpair, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete ClusterKvPairs Entry;") - } - - return nil -} diff --git a/src/ncm/pkg/module/module.go b/src/ncm/pkg/module/module.go index e3ebcccc..10b241f6 100644 --- a/src/ncm/pkg/module/module.go +++ b/src/ncm/pkg/module/module.go @@ -16,20 +16,28 @@ package module +import ( + "github.com/onap/multicloud-k8s/src/ncm/pkg/cluster" + "github.com/onap/multicloud-k8s/src/ncm/pkg/networkintents" + "github.com/onap/multicloud-k8s/src/ncm/pkg/scheduler" +) + // Client for using the services in the ncm type Client struct { - Cluster *ClusterClient - Network *NetworkClient - ProviderNet *ProviderNetClient + Cluster *cluster.ClusterClient + Network *networkintents.NetworkClient + ProviderNet *networkintents.ProviderNetClient + Scheduler *scheduler.SchedulerClient // Add Clients for API's here } // NewClient creates a new client for using the services func NewClient() *Client { c := &Client{} - c.Cluster = NewClusterClient() - c.Network = NewNetworkClient() - c.ProviderNet = NewProviderNetClient() + c.Cluster = cluster.NewClusterClient() + c.Network = networkintents.NewNetworkClient() + c.ProviderNet = networkintents.NewProviderNetClient() + c.Scheduler = scheduler.NewSchedulerClient() // Add Client API handlers here return c } diff --git a/src/ncm/pkg/module/network.go b/src/ncm/pkg/module/network.go deleted file mode 100644 index e753905e..00000000 --- a/src/ncm/pkg/module/network.go +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2020 Intel Corporation, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package module - -import ( - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db" - - pkgerrors "github.com/pkg/errors" -) - -// Network contains the parameters needed for dynamic networks -type Network struct { - Metadata Metadata `json:"metadata" yaml:"metadata"` - Spec NetworkSpec `json:"spec" yaml:"spec"` -} - -type NetworkSpec struct { - CniType string `json:"cniType" yaml:"cniType"` - Ipv4Subnets []Ipv4Subnet `json:"ipv4Subnets" yaml:"ipv4Subnets"` -} - -// NetworkKey is the key structure that is used in the database -type NetworkKey struct { - ClusterProviderName string `json:"provider"` - ClusterName string `json:"cluster"` - NetworkName string `json:"network"` -} - -// structure for the Network Custom Resource -type CrNetwork struct { - ApiVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - Network Network `yaml:",inline"` -} - -const NETWORK_APIVERSION = "k8s.plugin.opnfv.org/v1alpha1" -const NETWORK_KIND = "Network" - -// Manager is an interface exposing the Network functionality -type NetworkManager interface { - CreateNetwork(pr Network, clusterProvider, cluster string, exists bool) (Network, error) - GetNetwork(name, clusterProvider, cluster string) (Network, error) - GetNetworks(clusterProvider, cluster string) ([]Network, error) - DeleteNetwork(name, clusterProvider, cluster string) error -} - -// NetworkClient implements the Manager -// It will also be used to maintain some localized state -type NetworkClient struct { - db ClientDbInfo -} - -// NewNetworkClient returns an instance of the NetworkClient -// which implements the Manager -func NewNetworkClient() *NetworkClient { - return &NetworkClient{ - db: ClientDbInfo{ - storeName: "cluster", - tagMeta: "networkmetadata", - }, - } -} - -// CreateNetwork - create a new Network -func (v *NetworkClient) CreateNetwork(p Network, clusterProvider, cluster string, exists bool) (Network, error) { - - //Construct key and tag to select the entry - key := NetworkKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - NetworkName: p.Metadata.Name, - } - - //Check if cluster exists - _, err := NewClusterClient().GetCluster(clusterProvider, cluster) - if err != nil { - return Network{}, pkgerrors.New("Unable to find the cluster") - } - - //Check if this Network already exists - _, err = v.GetNetwork(p.Metadata.Name, clusterProvider, cluster) - if err == nil && !exists { - return Network{}, pkgerrors.New("Network already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return Network{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetNetwork returns the Network for corresponding name -func (v *NetworkClient) GetNetwork(name, clusterProvider, cluster string) (Network, error) { - - //Construct key and tag to select the entry - key := NetworkKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - NetworkName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return Network{}, pkgerrors.Wrap(err, "Get Network") - } - - //value is a byte array - if value != nil { - cp := Network{} - err = db.DBconn.Unmarshal(value[0], &cp) - if err != nil { - return Network{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cp, nil - } - - return Network{}, pkgerrors.New("Error getting Network") -} - -// GetNetworkList returns all of the Network for corresponding name -func (v *NetworkClient) GetNetworks(clusterProvider, cluster string) ([]Network, error) { - - //Construct key and tag to select the entry - key := NetworkKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - NetworkName: "", - } - - var resp []Network - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []Network{}, pkgerrors.Wrap(err, "Get Networks") - } - - for _, value := range values { - cp := Network{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []Network{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// Delete the Network from database -func (v *NetworkClient) DeleteNetwork(name, clusterProvider, cluster string) error { - - //Construct key and tag to select the entry - key := NetworkKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - NetworkName: name, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete Network Entry;") - } - - return nil -} diff --git a/src/ncm/pkg/module/providernet.go b/src/ncm/pkg/module/providernet.go deleted file mode 100644 index a1cbe940..00000000 --- a/src/ncm/pkg/module/providernet.go +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2020 Intel Corporation, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package module - -import ( - "github.com/onap/multicloud-k8s/src/orchestrator/pkg/infra/db" - - pkgerrors "github.com/pkg/errors" -) - -// ProviderNet contains the parameters needed for dynamic networks -type ProviderNet struct { - Metadata Metadata `json:"metadata"` - Spec ProviderNetSpec `json:"spec"` -} - -type ProviderNetSpec struct { - CniType string `json:"cniType" yaml:"cniType"` - Ipv4Subnets []Ipv4Subnet `json:"ipv4Subnets" yaml:"ipv4Subnets"` - ProviderNetType string `json:"providerNetType" yaml:"providerNetType"` - Vlan Vlan `json:"vlan" yaml:"vlan"` -} - -// structure for the Network Custom Resource -type CrProviderNet struct { - ApiVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - ProviderNet ProviderNet `yaml:",inline"` -} - -const PROVIDER_NETWORK_APIVERSION = "k8s.plugin.opnfv.org/v1alpha1" -const PROVIDER_NETWORK_KIND = "ProviderNetwork" - -// ProviderNetKey is the key structure that is used in the database -type ProviderNetKey struct { - ClusterProviderName string `json:"provider"` - ClusterName string `json:"cluster"` - ProviderNetName string `json:"providernet"` -} - -// Manager is an interface exposing the ProviderNet functionality -type ProviderNetManager interface { - CreateProviderNet(pr ProviderNet, clusterProvider, cluster string, exists bool) (ProviderNet, error) - GetProviderNet(name, clusterProvider, cluster string) (ProviderNet, error) - GetProviderNets(clusterProvider, cluster string) ([]ProviderNet, error) - DeleteProviderNet(name, clusterProvider, cluster string) error -} - -// ProviderNetClient implements the Manager -// It will also be used to maintain some localized state -type ProviderNetClient struct { - db ClientDbInfo -} - -// NewProviderNetClient returns an instance of the ProviderNetClient -// which implements the Manager -func NewProviderNetClient() *ProviderNetClient { - return &ProviderNetClient{ - db: ClientDbInfo{ - storeName: "cluster", - tagMeta: "networkmetadata", - }, - } -} - -// CreateProviderNet - create a new ProviderNet -func (v *ProviderNetClient) CreateProviderNet(p ProviderNet, clusterProvider, cluster string, exists bool) (ProviderNet, error) { - - //Construct key and tag to select the entry - key := ProviderNetKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - ProviderNetName: p.Metadata.Name, - } - - //Check if cluster exists - _, err := NewClusterClient().GetCluster(clusterProvider, cluster) - if err != nil { - return ProviderNet{}, pkgerrors.New("Unable to find the cluster") - } - - //Check if this ProviderNet already exists - _, err = v.GetProviderNet(p.Metadata.Name, clusterProvider, cluster) - if err == nil && !exists { - return ProviderNet{}, pkgerrors.New("ProviderNet already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, p) - if err != nil { - return ProviderNet{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return p, nil -} - -// GetProviderNet returns the ProviderNet for corresponding name -func (v *ProviderNetClient) GetProviderNet(name, clusterProvider, cluster string) (ProviderNet, error) { - - //Construct key and tag to select the entry - key := ProviderNetKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - ProviderNetName: name, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return ProviderNet{}, pkgerrors.Wrap(err, "Get ProviderNet") - } - - //value is a byte array - if value != nil { - cp := ProviderNet{} - err = db.DBconn.Unmarshal(value[0], &cp) - if err != nil { - return ProviderNet{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return cp, nil - } - - return ProviderNet{}, pkgerrors.New("Error getting ProviderNet") -} - -// GetProviderNetList returns all of the ProviderNet for corresponding name -func (v *ProviderNetClient) GetProviderNets(clusterProvider, cluster string) ([]ProviderNet, error) { - - //Construct key and tag to select the entry - key := ProviderNetKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - ProviderNetName: "", - } - - var resp []ProviderNet - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []ProviderNet{}, pkgerrors.Wrap(err, "Get ProviderNets") - } - - for _, value := range values { - cp := ProviderNet{} - err = db.DBconn.Unmarshal(value, &cp) - if err != nil { - return []ProviderNet{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, cp) - } - - return resp, nil -} - -// Delete the ProviderNet from database -func (v *ProviderNetClient) DeleteProviderNet(name, clusterProvider, cluster string) error { - - //Construct key and tag to select the entry - key := ProviderNetKey{ - ClusterProviderName: clusterProvider, - ClusterName: cluster, - ProviderNetName: name, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete ProviderNet Entry;") - } - - return nil -} diff --git a/src/ncm/pkg/module/types/module_definitions.go b/src/ncm/pkg/module/types/module_definitions.go new file mode 100644 index 00000000..0dd657ac --- /dev/null +++ b/src/ncm/pkg/module/types/module_definitions.go @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Intel Corporation, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package types + +// TODO - should move to common module types location - e.g. in orchestrator +type ClientDbInfo struct { + StoreName string // name of the mongodb collection to use for client documents + TagMeta string // attribute key name for the json data of a client document + TagContent string // attribute key name for the file data of a client document + TagContext string // attribute key name for context object in App Context +} |