/* * 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 context import ( "encoding/json" "fmt" "log" "sync" "strings" "github.com/onap/multicloud-k8s/src/orchestrator/pkg/appcontext" pkgerrors "github.com/pkg/errors" res "github.com/onap/multicloud-k8s/src/rsync/pkg/resource" con "github.com/onap/multicloud-k8s/src/rsync/pkg/connector" "github.com/onap/multicloud-k8s/src/rsync/pkg/app" ) type CompositeAppContext struct { cid interface{} appsorder string appsdependency string appsmap []instMap } type clusterInfo struct { name string resorder string resdependency string ressmap []instMap } type instMap struct { name string depinfo string status string rerr error clusters []clusterInfo } func getInstMap(order string, dependency string, level string) ([]instMap, error) { if order == "" { return nil, pkgerrors.Errorf("Not a valid order value") } if dependency == "" { return nil, pkgerrors.Errorf("Not a valid dependency value") } if !(level == "app" || level == "res") { return nil, pkgerrors.Errorf("Not a valid level name given to create map") } var aov map[string]interface{} json.Unmarshal([]byte(order), &aov) s := fmt.Sprintf("%vorder", level) appso := aov[s].([]interface{}) var instmap = make([]instMap, len(appso)) var adv map[string]interface{} json.Unmarshal([]byte(dependency), &adv) s = fmt.Sprintf("%vdependency", level) appsd := adv[s].(map[string]interface{}) for i, u := range appso { instmap[i] = instMap{u.(string), appsd[u.(string)].(string), "none", nil, nil} } return instmap, nil } func deleteResource(clustername string, resname string, respath string) error { k8sClient := app.KubernetesClient{} err := k8sClient.Init(clustername, resname) if err != nil { log.Println("Init failed: " + err.Error()) return err } var c con.KubernetesConnector c = &k8sClient var gp res.Resource err = gp.Delete(respath, resname, "default", c) if err != nil { log.Println("Delete resource failed: " + err.Error() + resname) return err } log.Println("Resource succesfully deleted", resname) return nil } func createResource(clustername string, resname string, respath string) error { k8sClient := app.KubernetesClient{} err := k8sClient.Init(clustername, resname) if err != nil { log.Println("Client init failed: " + err.Error()) return err } var c con.KubernetesConnector c = &k8sClient var gp res.Resource _, err = gp.Create(respath,"default", c) if err != nil { log.Println("Create failed: " + err.Error() + resname) return err } log.Println("Resource succesfully created", resname) return nil } func terminateResource(ac appcontext.AppContext, resmap instMap, appname string, clustername string) error { rh, err := ac.GetResourceHandle(appname, clustername, resmap.name) if err != nil { return err } resval, err := ac.GetValue(rh) if err != nil { return err } if resval != "" { result := strings.Split(resmap.name, "+") if result[0] == "" { return pkgerrors.Errorf("Resource name is nil") } err = deleteResource(clustername, result[0], resval.(string)) if err != nil { return err } } else { return pkgerrors.Errorf("Resource value is nil") } return nil } func instantiateResource(ac appcontext.AppContext, resmap instMap, appname string, clustername string) error { rh, err := ac.GetResourceHandle(appname, clustername, resmap.name) if err != nil { return err } resval, err := ac.GetValue(rh) if err != nil { return err } if resval != "" { result := strings.Split(resmap.name, "+") if result[0] == "" { return pkgerrors.Errorf("Resource name is nil") } err = createResource(clustername, result[0], resval.(string)) if err != nil { return err } } else { return pkgerrors.Errorf("Resource value is nil") } return nil } func terminateResources(ac appcontext.AppContext, ressmap []instMap, appname string, clustername string) error { var wg sync.WaitGroup var chans = make([]chan int, len(ressmap)) for l := range chans { chans[l] = make(chan int) } for i:=0; i