diff options
Diffstat (limited to 'src/ncm/pkg/module/netcontrolintent.go')
-rw-r--r-- | src/ncm/pkg/module/netcontrolintent.go | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/src/ncm/pkg/module/netcontrolintent.go b/src/ncm/pkg/module/netcontrolintent.go deleted file mode 100644 index c005a935..00000000 --- a/src/ncm/pkg/module/netcontrolintent.go +++ /dev/null @@ -1,295 +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 ( - "encoding/json" - "strings" - - jyaml "github.com/ghodss/yaml" - - nettypes "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1" - "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" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes/scheme" - - pkgerrors "github.com/pkg/errors" -) - -// NetControlIntent contains the parameters needed for dynamic networks -type NetControlIntent struct { - Metadata Metadata `json:"metadata"` -} - -// NetControlIntentKey is the key structure that is used in the database -type NetControlIntentKey struct { - NetControlIntent string `json:"netcontrolintent"` - Project string `json:"project"` - CompositeApp string `json:"compositeapp"` - CompositeAppVersion string `json:"compositeappversion"` -} - -// Manager is an interface exposing the NetControlIntent functionality -type NetControlIntentManager interface { - CreateNetControlIntent(nci NetControlIntent, project, compositeapp, compositeappversion string, exists bool) (NetControlIntent, error) - GetNetControlIntent(name, project, compositeapp, compositeappversion string) (NetControlIntent, error) - GetNetControlIntents(project, compositeapp, compositeappversion string) ([]NetControlIntent, error) - DeleteNetControlIntent(name, project, compositeapp, compositeappversion string) error - ApplyNetControlIntent(name, project, compositeapp, compositeappversion, appContextId string) error -} - -// NetControlIntentClient implements the Manager -// It will also be used to maintain some localized state -type NetControlIntentClient struct { - db ClientDbInfo -} - -// NewNetControlIntentClient returns an instance of the NetControlIntentClient -// which implements the Manager -func NewNetControlIntentClient() *NetControlIntentClient { - return &NetControlIntentClient{ - db: ClientDbInfo{ - storeName: "orchestrator", - tagMeta: "netcontrolintentmetadata", - }, - } -} - -// CreateNetControlIntent - create a new NetControlIntent -func (v *NetControlIntentClient) CreateNetControlIntent(nci NetControlIntent, project, compositeapp, compositeappversion string, exists bool) (NetControlIntent, error) { - - //Construct key and tag to select the entry - key := NetControlIntentKey{ - NetControlIntent: nci.Metadata.Name, - Project: project, - CompositeApp: compositeapp, - CompositeAppVersion: compositeappversion, - } - - //Check if this NetControlIntent already exists - _, err := v.GetNetControlIntent(nci.Metadata.Name, project, compositeapp, compositeappversion) - if err == nil && !exists { - return NetControlIntent{}, pkgerrors.New("NetControlIntent already exists") - } - - err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, nci) - if err != nil { - return NetControlIntent{}, pkgerrors.Wrap(err, "Creating DB Entry") - } - - return nci, nil -} - -// GetNetControlIntent returns the NetControlIntent for corresponding name -func (v *NetControlIntentClient) GetNetControlIntent(name, project, compositeapp, compositeappversion string) (NetControlIntent, error) { - - //Construct key and tag to select the entry - key := NetControlIntentKey{ - NetControlIntent: name, - Project: project, - CompositeApp: compositeapp, - CompositeAppVersion: compositeappversion, - } - - value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return NetControlIntent{}, pkgerrors.Wrap(err, "Get NetControlIntent") - } - - //value is a byte array - if value != nil { - nci := NetControlIntent{} - err = db.DBconn.Unmarshal(value[0], &nci) - if err != nil { - return NetControlIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - return nci, nil - } - - return NetControlIntent{}, pkgerrors.New("Error getting NetControlIntent") -} - -// GetNetControlIntentList returns all of the NetControlIntent for corresponding name -func (v *NetControlIntentClient) GetNetControlIntents(project, compositeapp, compositeappversion string) ([]NetControlIntent, error) { - - //Construct key and tag to select the entry - key := NetControlIntentKey{ - NetControlIntent: "", - Project: project, - CompositeApp: compositeapp, - CompositeAppVersion: compositeappversion, - } - - var resp []NetControlIntent - values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) - if err != nil { - return []NetControlIntent{}, pkgerrors.Wrap(err, "Get NetControlIntents") - } - - for _, value := range values { - nci := NetControlIntent{} - err = db.DBconn.Unmarshal(value, &nci) - if err != nil { - return []NetControlIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value") - } - resp = append(resp, nci) - } - - return resp, nil -} - -// Delete the NetControlIntent from database -func (v *NetControlIntentClient) DeleteNetControlIntent(name, project, compositeapp, compositeappversion string) error { - - //Construct key and tag to select the entry - key := NetControlIntentKey{ - NetControlIntent: name, - Project: project, - CompositeApp: compositeapp, - CompositeAppVersion: compositeappversion, - } - - err := db.DBconn.Remove(v.db.storeName, key) - if err != nil { - return pkgerrors.Wrap(err, "Delete NetControlIntent Entry;") - } - - return nil -} - -// (Test Routine) - Apply network-control-intent -func (v *NetControlIntentClient) ApplyNetControlIntent(name, project, compositeapp, compositeappversion, appContextId string) error { - // TODO: Handle all Network Chain Intents for the Network Control Intent - - // Handle all Workload Intents for the Network Control Intent - wis, err := NewWorkloadIntentClient().GetWorkloadIntents(project, compositeapp, compositeappversion, name) - if err != nil { - return pkgerrors.Wrapf(err, "Error getting Workload Intents for Network Control Intent %v for %v/%v%v not found", name, project, compositeapp, compositeappversion) - } - - // Setup the AppContext - var context appcontext.AppContext - _, err = context.LoadAppContext(appContextId) - if err != nil { - return pkgerrors.Wrapf(err, "Error getting AppContext with Id: %v for %v/%v%v", - appContextId, project, compositeapp, compositeappversion) - } - - // Handle all intents (currently just Interface intents) for each Workload Intent - for _, wi := range wis { - // The app/resource identified in the workload intent needs to be updated with two annotations. - // 1 - The "k8s.v1.cni.cncf.io/networks" annotation will have {"name": "ovn-networkobj", "namespace": "default"} added - // to it (preserving any existing values for this annotation. - // 2 - The "k8s.plugin.opnfv.org/nfn-network" annotation will add any network interfaces that are provided by the - // workload/interfaces intents. - - // Prepare the list of interfaces from the workload intent - wifs, err := NewWorkloadIfIntentClient().GetWorkloadIfIntents(project, - compositeapp, - compositeappversion, - name, - wi.Metadata.Name) - if err != nil { - return pkgerrors.Wrapf(err, - "Error getting Workload Interface Intents for Workload Intent %v under Network Control Intent %v for %v/%v%v not found", - wi.Metadata.Name, name, project, compositeapp, compositeappversion) - } - if len(wifs) == 0 { - log.Warn("No interface intents provided for workload intent", log.Fields{ - "project": project, - "composite app": compositeapp, - "composite app version": compositeappversion, - "network control intent": name, - "workload intent": wi.Metadata.Name, - }) - continue - } - - // Get all clusters for the current App from the AppContext - clusters, err := context.GetClusterNames(wi.Spec.AppName) - for _, c := range clusters { - rh, err := context.GetResourceHandle(wi.Spec.AppName, c, - strings.Join([]string{wi.Spec.WorkloadResource, wi.Spec.Type}, "+")) - if err != nil { - log.Warn("App Context resource handle not found", log.Fields{ - "project": project, - "composite app": compositeapp, - "composite app version": compositeappversion, - "network control intent": name, - "workload name": wi.Metadata.Name, - "app": wi.Spec.AppName, - "resource": wi.Spec.WorkloadResource, - "resource type": wi.Spec.Type, - }) - continue - } - r, err := context.GetValue(rh) - if err != nil { - log.Error("Error retrieving resource from App Context", log.Fields{ - "error": err, - "resource handle": rh, - }) - } - - // Unmarshal resource to K8S object - robj, err := runtime.Decode(scheme.Codecs.UniversalDeserializer(), []byte(r.(string))) - - // Add network annotation to object - netAnnot := nettypes.NetworkSelectionElement{ - Name: "ovn-networkobj", - Namespace: "default", - } - AddNetworkAnnotation(robj, netAnnot) - - // Add nfn interface annotations to object - var newNfnIfs []WorkloadIfIntentSpec - for _, i := range wifs { - newNfnIfs = append(newNfnIfs, i.Spec) - } - AddNfnAnnotation(robj, newNfnIfs) - - // Marshal object back to yaml format (via json - seems to eliminate most clutter) - j, err := json.Marshal(robj) - if err != nil { - log.Error("Error marshalling resource to JSON", log.Fields{ - "error": err, - }) - continue - } - y, err := jyaml.JSONToYAML(j) - if err != nil { - log.Error("Error marshalling resource to YAML", log.Fields{ - "error": err, - }) - continue - } - - // Update resource in AppContext - err = context.UpdateResourceValue(rh, string(y)) - if err != nil { - log.Error("Network updating app context resource handle", log.Fields{ - "error": err, - "resource handle": rh, - }) - } - } - } - - return nil -} |