From c644ab480d2a764ee242cca14f96ea28a181bcad Mon Sep 17 00:00:00 2001 From: Rajamohan Raj Date: Tue, 31 Mar 2020 01:30:03 +0000 Subject: Resolve the helm templates Resolving the helm templates for each of the apps in the compositeApp by utilizing the helm libraries and thus getting the sorted templates with all values rendered. This is a subtask of adding instantiation APIs. Issue-ID: MULTICLOUD-1041 Signed-off-by: Rajamohan Raj Change-Id: Id4fddda69b5276b2409d835723b11367400ab6ea --- src/orchestrator/pkg/infra/db/mongo.go | 3 +- src/orchestrator/pkg/infra/db/store.go | 2 +- src/orchestrator/pkg/module/app.go | 1 + src/orchestrator/pkg/module/composite_profile.go | 6 +- src/orchestrator/pkg/module/instantiation.go | 143 +++++++++++++++++++++++ src/orchestrator/pkg/module/module.go | 4 +- 6 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/orchestrator/pkg/module/instantiation.go (limited to 'src/orchestrator/pkg') diff --git a/src/orchestrator/pkg/infra/db/mongo.go b/src/orchestrator/pkg/infra/db/mongo.go index a344aa1c..b33d6c65 100644 --- a/src/orchestrator/pkg/infra/db/mongo.go +++ b/src/orchestrator/pkg/infra/db/mongo.go @@ -49,7 +49,7 @@ type MongoCollection interface { opts ...*options.FindOptions) (*mongo.Cursor, error) UpdateOne(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) (*mongo.UpdateResult, error) - CountDocuments(ctx context.Context, filter interface{}, + CountDocuments(ctx context.Context, filter interface{}, opts ...*options.CountOptions) (int64, error) } @@ -587,4 +587,3 @@ func (m *MongoStore) Remove(coll string, key Key) error { } return nil } - diff --git a/src/orchestrator/pkg/infra/db/store.go b/src/orchestrator/pkg/infra/db/store.go index e87722cd..9c6532f1 100644 --- a/src/orchestrator/pkg/infra/db/store.go +++ b/src/orchestrator/pkg/infra/db/store.go @@ -59,7 +59,7 @@ type Store interface { // Find the document(s) with key and get the tag values from the document(s) Find(coll string, key Key, tag string) ([][]byte, error) - // Removes the document(s) matching the key if no child reference in collection + // Removes the document(s) matching the key if no child reference in collection Remove(coll string, key Key) error // Remove all the document(s) matching the key diff --git a/src/orchestrator/pkg/module/app.go b/src/orchestrator/pkg/module/app.go index 1e1a5974..40659de8 100644 --- a/src/orchestrator/pkg/module/app.go +++ b/src/orchestrator/pkg/module/app.go @@ -38,6 +38,7 @@ type AppMetaData struct { } //AppContent contains fileContent +// TODO : This should have been []byte type AppContent struct { FileContent string } diff --git a/src/orchestrator/pkg/module/composite_profile.go b/src/orchestrator/pkg/module/composite_profile.go index dca2116a..25a9721c 100644 --- a/src/orchestrator/pkg/module/composite_profile.go +++ b/src/orchestrator/pkg/module/composite_profile.go @@ -121,7 +121,7 @@ func (c *CompositeProfileClient) CreateCompositeProfile(cpf CompositeProfile, p return cpf, nil } -// GetCompositeProfile shall take arguments - name of the composite profile, name of //// the project, name of the composite app and version of the composite app. It shall return the CompositeProfile if its present. +// GetCompositeProfile shall take arguments - name of the composite profile, name of the project, name of the composite app and version of the composite app. It shall return the CompositeProfile if its present. func (c *CompositeProfileClient) GetCompositeProfile(cpf string, p string, ca string, v string) (CompositeProfile, error) { key := CompositeProfileKey{ Name: cpf, @@ -147,7 +147,7 @@ func (c *CompositeProfileClient) GetCompositeProfile(cpf string, p string, ca st return CompositeProfile{}, pkgerrors.New("Error getting CompositeProfile") } -// GetCompositeProfile shall take arguments - name of the composite profile, name of //// the project, name of the composite app and version of the composite app. It shall return the CompositeProfile if its present. +// GetCompositeProfiles shall take arguments - name of the project, name of the composite profile and version of the composite app. It shall return an array of CompositeProfile. func (c *CompositeProfileClient) GetCompositeProfiles(p string, ca string, v string) ([]CompositeProfile, error) { key := CompositeProfileKey{ Name: "", @@ -175,7 +175,7 @@ func (c *CompositeProfileClient) GetCompositeProfiles(p string, ca string, v str return resp, nil } -// DeleteCompositeProfile the intent from the database +// DeleteCompositeProfile deletes the compsiteApp profile from the database func (c *CompositeProfileClient) DeleteCompositeProfile(cpf string, p string, ca string, v string) error { key := CompositeProfileKey{ Name: cpf, diff --git a/src/orchestrator/pkg/module/instantiation.go b/src/orchestrator/pkg/module/instantiation.go new file mode 100644 index 00000000..3c704181 --- /dev/null +++ b/src/orchestrator/pkg/module/instantiation.go @@ -0,0 +1,143 @@ +/* + * 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 ( + "fmt" + "github.com/onap/multicloud-k8s/src/orchestrator/utils/helm" + + "github.com/onap/multicloud-k8s/src/orchestrator/utils/types" + pkgerrors "github.com/pkg/errors" + + "encoding/base64" + "log" +) + +// ManifestFileName is the name given to the manifest file in the profile package +const ManifestFileName = "manifest.yaml" + +// InstantiationClient implements the InstantiationManager +type InstantiationClient struct { + storeName string + tagMetaData string +} + +// InstantiationManager is an interface which exposes the +// InstantiationManager functionalities +type InstantiationManager interface { + //ApproveInstantiation(p string, ca string, v string, di string) (error) + Instantiate(p string, ca string, v string, di string) error +} + +// NewInstantiationClient returns an instance of InstantiationClient +func NewInstantiationClient() *InstantiationClient { + return &InstantiationClient{ + storeName: "orchestrator", + tagMetaData: "instantiation", + } +} + +// TODO +//ApproveInstantiation approves an instantiation +// func (c InstantiationClient) ApproveInstantiation(p string, ca string, v string, di string) (error){ +// } + +func getOverrideValuesByAppName(ov []OverrideValues, a string) map[string]string { + for _, eachOverrideVal := range ov { + if eachOverrideVal.AppName == a { + return eachOverrideVal.ValuesObj + } + } + return map[string]string{} +} + +// GetSortedTemplateForApp returns the sorted templates. +//It takes in arguments - appName, project, compositeAppName, releaseName, compositeProfileName, array of override values +func GetSortedTemplateForApp(appName, p, ca, v, rName, cp string, overrideValues []OverrideValues) ([]types.KubernetesResourceTemplate, error) { + + log.Println("Processing App.. ", appName) + + var sortedTemplates []types.KubernetesResourceTemplate + + aC, err := NewAppClient().GetAppContent(appName, p, ca, v) + if err != nil { + return sortedTemplates, pkgerrors.Wrap(err, fmt.Sprint("Not finding the content of app:: ", appName)) + } + appContent, err := base64.StdEncoding.DecodeString(aC.FileContent) + if err != nil { + return sortedTemplates, pkgerrors.Wrap(err, "Fail to convert to byte array") + } + log.Println("Got the app content..") + + appPC, err := NewAppProfileClient().GetAppProfileContentByApp(p, ca, v, cp, appName) + if err != nil { + return sortedTemplates, pkgerrors.Wrap(err, fmt.Sprintf("Not finding the appProfileContent for:: %s", appName)) + } + appProfileContent, err := base64.StdEncoding.DecodeString(appPC.Profile) + if err != nil { + return sortedTemplates, pkgerrors.Wrap(err, "Fail to convert to byte array") + } + + log.Println("Got the app Profile content ...") + + overrideValuesOfApp := getOverrideValuesByAppName(overrideValues, appName) + //Convert override values from map to array of strings of the following format + //foo=bar + overrideValuesOfAppStr := []string{} + if overrideValuesOfApp != nil { + for k, v := range overrideValuesOfApp { + overrideValuesOfAppStr = append(overrideValuesOfAppStr, k+"="+v) + } + } + + sortedTemplates, err = helm.NewTemplateClient("", "default", rName, + ManifestFileName).Resolve(appContent, + appProfileContent, overrideValuesOfAppStr, + rName, appName) + + log.Printf("The len of the sortedTemplates :: %d", len(sortedTemplates)) + + return sortedTemplates, err +} + +// Instantiate methods takes in project +func (c InstantiationClient) Instantiate(p string, ca string, v string, di string) error { + + dIGrp, err := NewDeploymentIntentGroupClient().GetDeploymentIntentGroup(di, p, ca, v) + if err != nil { + return pkgerrors.Wrap(err, "Not finding the deploymentIntentGroup") + } + rName := dIGrp.Spec.Version //rName is releaseName + overrideValues := dIGrp.Spec.OverrideValuesObj + cp := dIGrp.Spec.Profile + + log.Printf("dIGrp :: %s, releaseName :: %s and cp :: %s \n", dIGrp.MetaData.Name, rName, cp) + allApps, err := NewAppClient().GetApps(p, ca, v) + if err != nil { + return pkgerrors.Wrap(err, "Not finding the apps") + } + for _, eachApp := range allApps { + sortedTemplates, err := GetSortedTemplateForApp(eachApp.Metadata.Name, p, ca, v, rName, cp, overrideValues) + if err != nil { + return pkgerrors.Wrap(err, "Unable to get the sorted templates for app") + } + log.Printf("Resolved all the templates for app :: %s under the compositeApp...", eachApp.Metadata.Name) + log.Printf("sortedTemplates :: %v ", sortedTemplates) + } + log.Printf("Done with instantiation...") + return err +} diff --git a/src/orchestrator/pkg/module/module.go b/src/orchestrator/pkg/module/module.go index c697bbff..e05b8753 100644 --- a/src/orchestrator/pkg/module/module.go +++ b/src/orchestrator/pkg/module/module.go @@ -1,5 +1,5 @@ /* - * Copyright 2018 Intel Corporation, Inc + * 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. @@ -29,6 +29,7 @@ type Client struct { CompositeProfile *CompositeProfileClient AppProfile *AppProfileClient // Add Clients for API's here + Instantiation *InstantiationClient } // NewClient creates a new client for using the services @@ -45,5 +46,6 @@ func NewClient() *Client { c.CompositeProfile = NewCompositeProfileClient() c.AppProfile = NewAppProfileClient() // Add Client API handlers here + c.Instantiation = NewInstantiationClient() return c } -- cgit 1.2.3-korg