Add support for parsing profile yaml files 40/76240/13
authorKiran Kamineni <kiran.k.kamineni@intel.com>
Wed, 23 Jan 2019 20:54:50 +0000 (12:54 -0800)
committerKiran Kamineni <kiran.k.kamineni@intel.com>
Mon, 28 Jan 2019 23:52:10 +0000 (15:52 -0800)
Add code to parse profile configuration yaml
The parsing function is global and returns a client
which can then be used to get or apply specific parts
of the configuration on top of an extracted helm chart.

Issue-ID: ONAPARC-348
Change-Id: I4504d0b158fdfef476b8c2a461d33306926545d7
Signed-off-by: Kiran Kamineni <kiran.k.kamineni@intel.com>
src/k8splugin/go.mod
src/k8splugin/internal/rb/profile.go
src/k8splugin/internal/rb/profile_yaml.go [new file with mode: 0644]

index c6d2ef2..1e7115d 100644 (file)
@@ -2,7 +2,7 @@ module k8splugin
 
 require (
        github.com/davecgh/go-spew v1.1.1 // indirect
-       github.com/ghodss/yaml v1.0.0 // indirect
+       github.com/ghodss/yaml v1.0.0
        github.com/go-stack/stack v1.8.0 // indirect
        github.com/gogo/protobuf v1.0.0 // indirect
        github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
index 2456ad2..d78e32e 100644 (file)
@@ -51,6 +51,7 @@ type ProfileManager interface {
 type ProfileClient struct {
        storeName           string
        tagMeta, tagContent string
+       manifestName        string
 }
 
 // NewProfileClient returns an instance of the ProfileClient
@@ -58,9 +59,10 @@ type ProfileClient struct {
 // Uses rb/def prefix
 func NewProfileClient() *ProfileClient {
        return &ProfileClient{
-               storeName:  "rbprofile",
-               tagMeta:    "metadata",
-               tagContent: "content",
+               storeName:    "rbprofile",
+               tagMeta:      "metadata",
+               tagContent:   "content",
+               manifestName: "manifest.yaml",
        }
 }
 
diff --git a/src/k8splugin/internal/rb/profile_yaml.go b/src/k8splugin/internal/rb/profile_yaml.go
new file mode 100644 (file)
index 0000000..ba55fba
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2018 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 rb
+
+import (
+       "io/ioutil"
+       "log"
+       "path/filepath"
+
+       "github.com/ghodss/yaml"
+       pkgerrors "github.com/pkg/errors"
+)
+
+/*
+#Sample Yaml format for profile manifest.yaml
+---
+version: v1
+type:
+  values: "values_override.yaml"
+  configresource:
+    - filepath: config.yaml
+      chartpath: chart/config/resources/config.yaml
+    - filepath: config2.yaml
+      chartpath: chart/config/resources/config2.yaml
+*/
+
+type overrideFiles struct {
+       FilePath  string `yaml:"filepath"`
+       ChartPath string `yaml:"chartpath"`
+}
+
+type supportedOverrides struct {
+       ConfigResource []overrideFiles `yaml:"configresource"`
+       Values         string          `yaml:"values"`
+}
+
+type profileOverride struct {
+       Version string             `yaml:"version"`
+       Type    supportedOverrides `yaml:"type"`
+}
+
+type ProfileYamlClient struct {
+       path     string
+       override profileOverride
+}
+
+func (p ProfileYamlClient) Print() {
+       log.Println(p.override)
+}
+
+//GetValues returns a path to the override values.yam
+//that was part of the profile
+func (p ProfileYamlClient) GetValues() string {
+       return filepath.Join(p.path, p.override.Type.Values)
+}
+
+//CopyConfigurationOverrides copies the various files that are
+//provided as overrides to their corresponding locations within
+//the destination chart.
+func (p ProfileYamlClient) CopyConfigurationOverrides(chartPath string) error {
+
+       //Iterate over each configresource and copy that file into
+       //the respective path in the chart.
+       for _, v := range p.override.Type.ConfigResource {
+               data, err := ioutil.ReadFile(filepath.Join(p.path, v.FilePath))
+               if err != nil {
+                       return pkgerrors.Wrap(err, "Reading configuration file")
+               }
+               err = ioutil.WriteFile(filepath.Join(chartPath, v.ChartPath), data, 0644)
+               if err != nil {
+                       return pkgerrors.Wrap(err, "Writing configuration file into chartpath")
+               }
+       }
+
+       return nil
+}
+
+//ProcessProfileYaml parses the manifest.yaml file that is part of the profile
+//package and creates the appropriate structures out of it.
+func ProcessProfileYaml(fpath string, manifestFileName string) (ProfileYamlClient, error) {
+
+       p := filepath.Join(fpath, manifestFileName)
+       data, err := ioutil.ReadFile(p)
+       if err != nil {
+               return ProfileYamlClient{}, pkgerrors.Wrap(err, "Reading manifest file")
+       }
+
+       out := profileOverride{}
+       err = yaml.Unmarshal(data, &out)
+       if err != nil {
+               return ProfileYamlClient{}, pkgerrors.Wrap(err, "Marshaling manifest yaml file")
+       }
+
+       return ProfileYamlClient{path: fpath, override: out}, nil
+}