github.com/profzone/eden-framework@v1.0.10/internal/k8s/maker.go (about)

     1  package k8s
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/pkg/errors"
     7  	"github.com/profzone/eden-framework/pkg/executil"
     8  	"io/ioutil"
     9  	appsv1 "k8s.io/api/apps/v1"
    10  	apiv1 "k8s.io/api/core/v1"
    11  	"k8s.io/apimachinery/pkg/util/yaml"
    12  	"os"
    13  	"path/filepath"
    14  )
    15  
    16  func MakeDeployment(pathToYaml string) (*appsv1.Deployment, map[string]interface{}, error) {
    17  	manifest, err := PathToOSFile(pathToYaml)
    18  	if err != nil {
    19  		return nil, nil, err
    20  	}
    21  	manifestData, err := ioutil.ReadAll(manifest)
    22  	if err != nil {
    23  		return nil, nil, err
    24  	}
    25  
    26  	envVars := executil.EnvVars{}
    27  	envVars.LoadFromEnviron()
    28  	manifestData = []byte(envVars.Parse(string(manifestData)))
    29  	reader := bytes.NewReader(manifestData)
    30  
    31  	deployment := appsv1.Deployment{}
    32  	if err := yaml.NewYAMLOrJSONDecoder(reader, 100).Decode(&deployment); err != nil {
    33  		return nil, nil, errors.Wrap(err, fmt.Sprintf("failed to decode file %s into Deployment", pathToYaml))
    34  	}
    35  
    36  	reader.Reset(manifestData)
    37  
    38  	patch := make(map[string]interface{})
    39  	if err := yaml.NewYAMLOrJSONDecoder(reader, 100).Decode(&patch); err != nil {
    40  		return nil, nil, errors.Wrap(err, fmt.Sprintf("failed to decode file %s into patch", pathToYaml))
    41  	}
    42  
    43  	return &deployment, patch, nil
    44  }
    45  
    46  func MakeService(pathToYaml string) (*apiv1.Service, map[string]interface{}, error) {
    47  	manifest, err := PathToOSFile(pathToYaml)
    48  	if err != nil {
    49  		return nil, nil, err
    50  	}
    51  	manifestData, err := ioutil.ReadAll(manifest)
    52  	if err != nil {
    53  		return nil, nil, err
    54  	}
    55  
    56  	envVars := executil.EnvVars{}
    57  	envVars.LoadFromEnviron()
    58  	manifestData = []byte(envVars.Parse(string(manifestData)))
    59  	reader := bytes.NewReader(manifestData)
    60  
    61  	resource := apiv1.Service{}
    62  	if err := yaml.NewYAMLOrJSONDecoder(reader, 100).Decode(&resource); err != nil {
    63  		return nil, nil, errors.Wrap(err, fmt.Sprintf("failed to decode file %s into Service", pathToYaml))
    64  	}
    65  	reader.Reset(manifestData)
    66  
    67  	patch := make(map[string]interface{})
    68  	if err := yaml.NewYAMLOrJSONDecoder(reader, 100).Decode(&patch); err != nil {
    69  		return nil, nil, errors.Wrap(err, fmt.Sprintf("failed to decode file %s into patch", pathToYaml))
    70  	}
    71  
    72  	return &resource, patch, nil
    73  }
    74  
    75  func PathToOSFile(relativPath string) (*os.File, error) {
    76  	path, err := filepath.Abs(relativPath)
    77  	if err != nil {
    78  		return nil, errors.Wrap(err, fmt.Sprintf("failed generate absolut file path of %s", relativPath))
    79  	}
    80  
    81  	manifest, err := os.Open(path)
    82  	if err != nil {
    83  		return nil, errors.Wrap(err, fmt.Sprintf("failed to open file %s", path))
    84  	}
    85  
    86  	return manifest, nil
    87  }