diff options
author | Eric Multanen <eric.w.multanen@intel.com> | 2020-05-28 17:07:20 -0700 |
---|---|---|
committer | Eric Multanen <eric.w.multanen@intel.com> | 2020-06-02 14:00:07 -0700 |
commit | ad7782cbf83c11f152a6457f3808a4da99a1ae56 (patch) | |
tree | e88276d8f0d55bd58a903d1c31ab4e43e4011193 /src/ovnaction/pkg/module/workloadintent.go | |
parent | c257a136355a794f5bf778f670c041e8958c3608 (diff) |
Create OVN network action controller from ncm
Split out part of ncm microservice to act as the
Onv4k8s network action controller for the orchestrator.
No code changes really - just moving around to fit the
architectural plan.
Issue-ID: MULTICLOUD-1029
Signed-off-by: Eric Multanen <eric.w.multanen@intel.com>
Change-Id: I17292ac72d041050269f05fc4a0c2a6ca741aeb5
Diffstat (limited to 'src/ovnaction/pkg/module/workloadintent.go')
-rw-r--r-- | src/ovnaction/pkg/module/workloadintent.go | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/ovnaction/pkg/module/workloadintent.go b/src/ovnaction/pkg/module/workloadintent.go new file mode 100644 index 00000000..e6916954 --- /dev/null +++ b/src/ovnaction/pkg/module/workloadintent.go @@ -0,0 +1,181 @@ +/* + * 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" +) + +// WorkloadIntent contains the parameters needed for dynamic networks +type WorkloadIntent struct { + Metadata Metadata `json:"metadata"` + Spec WorkloadIntentSpec `json:"spec"` +} + +type WorkloadIntentSpec struct { + AppName string `json:"application-name"` + WorkloadResource string `json:"workload-resource"` + Type string `json:"type"` +} + +// WorkloadIntentKey is the key structure that is used in the database +type WorkloadIntentKey struct { + Project string `json:"provider"` + CompositeApp string `json:"compositeapp"` + CompositeAppVersion string `json:"compositeappversion"` + NetControlIntent string `json:"netcontrolintent"` + WorkloadIntent string `json:"workloadintent"` +} + +// Manager is an interface exposing the WorkloadIntent functionality +type WorkloadIntentManager interface { + CreateWorkloadIntent(wi WorkloadIntent, project, compositeapp, compositeappversion, netcontrolintent string, exists bool) (WorkloadIntent, error) + GetWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) (WorkloadIntent, error) + GetWorkloadIntents(project, compositeapp, compositeappversion, netcontrolintent string) ([]WorkloadIntent, error) + DeleteWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) error +} + +// WorkloadIntentClient implements the Manager +// It will also be used to maintain some localized state +type WorkloadIntentClient struct { + db ClientDbInfo +} + +// NewWorkloadIntentClient returns an instance of the WorkloadIntentClient +// which implements the Manager +func NewWorkloadIntentClient() *WorkloadIntentClient { + return &WorkloadIntentClient{ + db: ClientDbInfo{ + storeName: "orchestrator", + tagMeta: "workloadintentmetadata", + }, + } +} + +// CreateWorkloadIntent - create a new WorkloadIntent +func (v *WorkloadIntentClient) CreateWorkloadIntent(wi WorkloadIntent, project, compositeapp, compositeappversion, netcontrolintent string, exists bool) (WorkloadIntent, error) { + + //Construct key and tag to select the entry + key := WorkloadIntentKey{ + Project: project, + CompositeApp: compositeapp, + CompositeAppVersion: compositeappversion, + NetControlIntent: netcontrolintent, + WorkloadIntent: wi.Metadata.Name, + } + + //Check if the Network Control Intent exists + _, err := NewNetControlIntentClient().GetNetControlIntent(netcontrolintent, project, compositeapp, compositeappversion) + if err != nil { + return WorkloadIntent{}, pkgerrors.Errorf("Network Control Intent %v does not exist", netcontrolintent) + } + + //Check if this WorkloadIntent already exists + _, err = v.GetWorkloadIntent(wi.Metadata.Name, project, compositeapp, compositeappversion, netcontrolintent) + if err == nil && !exists { + return WorkloadIntent{}, pkgerrors.New("WorkloadIntent already exists") + } + + err = db.DBconn.Insert(v.db.storeName, key, nil, v.db.tagMeta, wi) + if err != nil { + return WorkloadIntent{}, pkgerrors.Wrap(err, "Creating DB Entry") + } + + return wi, nil +} + +// GetWorkloadIntent returns the WorkloadIntent for corresponding name +func (v *WorkloadIntentClient) GetWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) (WorkloadIntent, error) { + + //Construct key and tag to select the entry + key := WorkloadIntentKey{ + Project: project, + CompositeApp: compositeapp, + CompositeAppVersion: compositeappversion, + NetControlIntent: netcontrolintent, + WorkloadIntent: name, + } + + value, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) + if err != nil { + return WorkloadIntent{}, pkgerrors.Wrap(err, "Get WorkloadIntent") + } + + //value is a byte array + if value != nil { + wi := WorkloadIntent{} + err = db.DBconn.Unmarshal(value[0], &wi) + if err != nil { + return WorkloadIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value") + } + return wi, nil + } + + return WorkloadIntent{}, pkgerrors.New("Error getting WorkloadIntent") +} + +// GetWorkloadIntentList returns all of the WorkloadIntent for corresponding name +func (v *WorkloadIntentClient) GetWorkloadIntents(project, compositeapp, compositeappversion, netcontrolintent string) ([]WorkloadIntent, error) { + + //Construct key and tag to select the entry + key := WorkloadIntentKey{ + Project: project, + CompositeApp: compositeapp, + CompositeAppVersion: compositeappversion, + NetControlIntent: netcontrolintent, + WorkloadIntent: "", + } + + var resp []WorkloadIntent + values, err := db.DBconn.Find(v.db.storeName, key, v.db.tagMeta) + if err != nil { + return []WorkloadIntent{}, pkgerrors.Wrap(err, "Get WorkloadIntents") + } + + for _, value := range values { + wi := WorkloadIntent{} + err = db.DBconn.Unmarshal(value, &wi) + if err != nil { + return []WorkloadIntent{}, pkgerrors.Wrap(err, "Unmarshalling Value") + } + resp = append(resp, wi) + } + + return resp, nil +} + +// Delete the WorkloadIntent from database +func (v *WorkloadIntentClient) DeleteWorkloadIntent(name, project, compositeapp, compositeappversion, netcontrolintent string) error { + + //Construct key and tag to select the entry + key := WorkloadIntentKey{ + Project: project, + CompositeApp: compositeapp, + CompositeAppVersion: compositeappversion, + NetControlIntent: netcontrolintent, + WorkloadIntent: name, + } + + err := db.DBconn.Remove(v.db.storeName, key) + if err != nil { + return pkgerrors.Wrap(err, "Delete WorkloadIntent Entry;") + } + + return nil +} |