github.com/pluralsh/plural-cli@v0.9.5/pkg/api/charts.go (about)

     1  package api
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"path"
     7  
     8  	"github.com/pluralsh/gqlclient"
     9  	"github.com/pluralsh/gqlclient/pkg/utils"
    10  )
    11  
    12  type packageCacheEntry struct {
    13  	Charts    []*ChartInstallation
    14  	Terraform []*TerraformInstallation
    15  }
    16  
    17  var packageCache = make(map[string]*packageCacheEntry)
    18  
    19  func (client *client) GetCharts(repoId string) ([]*Chart, error) {
    20  	charts := make([]*Chart, 0)
    21  	resp, err := client.pluralClient.GetCharts(client.ctx, repoId)
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  	for _, edge := range resp.Charts.Edges {
    26  		charts = append(charts, &Chart{
    27  			Id:            utils.ConvertStringPointer(edge.Node.ID),
    28  			Name:          edge.Node.Name,
    29  			Description:   utils.ConvertStringPointer(edge.Node.Description),
    30  			LatestVersion: utils.ConvertStringPointer(edge.Node.LatestVersion),
    31  		})
    32  	}
    33  
    34  	return charts, err
    35  }
    36  
    37  func (client *client) GetVersions(chartId string) ([]*Version, error) {
    38  	versions := make([]*Version, 0)
    39  	resp, err := client.pluralClient.GetVersions(client.ctx, chartId)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	for _, version := range resp.Versions.Edges {
    44  		versions = append(versions, convertVersion(version.Node))
    45  	}
    46  	return versions, err
    47  }
    48  
    49  func (client *client) GetChartInstallations(repoId string) ([]*ChartInstallation, error) {
    50  	insts := make([]*ChartInstallation, 0)
    51  	resp, err := client.pluralClient.GetChartInstallations(client.ctx, repoId)
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	for _, edge := range resp.ChartInstallations.Edges {
    57  		if edge.Node != nil {
    58  			insts = append(insts, convertChartInstallation(edge.Node))
    59  		}
    60  	}
    61  
    62  	return insts, err
    63  }
    64  
    65  func ClearPackageCache() {
    66  	packageCache = make(map[string]*packageCacheEntry)
    67  }
    68  
    69  func (client *client) GetPackageInstallations(repoId string) (charts []*ChartInstallation, tfs []*TerraformInstallation, err error) {
    70  	if entry, ok := packageCache[repoId]; ok {
    71  		return entry.Charts, entry.Terraform, nil
    72  	}
    73  
    74  	resp, err := client.pluralClient.GetPackageInstallations(client.ctx, repoId)
    75  	if err != nil {
    76  		return
    77  	}
    78  
    79  	charts = make([]*ChartInstallation, 0)
    80  	for _, edge := range resp.ChartInstallations.Edges {
    81  		if edge.Node != nil {
    82  			charts = append(charts, convertChartInstallation(edge.Node))
    83  		}
    84  	}
    85  
    86  	tfs = make([]*TerraformInstallation, 0)
    87  	for _, edge := range resp.TerraformInstallations.Edges {
    88  		node := edge.Node
    89  		if node != nil {
    90  			tfInstall := &TerraformInstallation{
    91  				Id:        utils.ConvertStringPointer(node.ID),
    92  				Terraform: convertTerraform(node.Terraform),
    93  
    94  				Version: convertVersion(node.Version),
    95  			}
    96  
    97  			tfs = append(tfs, tfInstall)
    98  		}
    99  	}
   100  
   101  	if err == nil {
   102  		packageCache[repoId] = &packageCacheEntry{Charts: charts, Terraform: tfs}
   103  	}
   104  
   105  	return
   106  }
   107  
   108  func (client *client) CreateCrd(repo string, chart string, file string) error {
   109  	name := path.Base(file)
   110  
   111  	rf, err := os.Open(file)
   112  	if err != nil {
   113  		return err
   114  	}
   115  	defer func(rf *os.File) {
   116  		_ = rf.Close()
   117  	}(rf)
   118  
   119  	upload := gqlclient.Upload{
   120  		R:     rf,
   121  		Name:  file,
   122  		Field: "blob",
   123  	}
   124  
   125  	_, err = client.pluralClient.CreateCrd(context.Background(), gqlclient.ChartName{
   126  		Chart: &chart,
   127  		Repo:  &repo,
   128  	}, name, "blob", gqlclient.WithFiles([]gqlclient.Upload{upload}))
   129  
   130  	return err
   131  }
   132  
   133  func (client *client) UninstallChart(id string) (err error) {
   134  	_, err = client.pluralClient.UninstallChart(client.ctx, id)
   135  	return
   136  }
   137  
   138  func convertVersion(version *gqlclient.VersionFragment) *Version {
   139  	if version == nil {
   140  		return nil
   141  	}
   142  	v := &Version{
   143  		Id:      version.ID,
   144  		Version: version.Version,
   145  		Helm:    version.Helm,
   146  	}
   147  	if version.Readme != nil {
   148  		v.Readme = *version.Readme
   149  	}
   150  	if version.Package != nil {
   151  		v.Package = *version.Package
   152  	}
   153  	if version.ValuesTemplate != nil {
   154  		v.ValuesTemplate = *version.ValuesTemplate
   155  	}
   156  	v.TemplateType = gqlclient.TemplateTypeGotemplate
   157  	if version.TemplateType != nil {
   158  		v.TemplateType = *version.TemplateType
   159  	}
   160  	if version.InsertedAt != nil {
   161  		v.InsertedAt = *version.InsertedAt
   162  	}
   163  
   164  	v.Crds = make([]Crd, 0)
   165  	for _, crd := range version.Crds {
   166  		v.Crds = append(v.Crds, convertCrd(crd))
   167  	}
   168  	v.Dependencies = convertDependencies(version.Dependencies)
   169  	return v
   170  }
   171  
   172  func convertCrd(crd *gqlclient.CrdFragment) Crd {
   173  	c := Crd{
   174  		Id:   crd.ID,
   175  		Name: crd.Name,
   176  		Blob: utils.ConvertStringPointer(crd.Blob),
   177  	}
   178  
   179  	return c
   180  }
   181  
   182  func convertDependencies(depFragment *gqlclient.DependenciesFragment) *Dependencies {
   183  	if depFragment == nil {
   184  		return nil
   185  	}
   186  	dep := &Dependencies{
   187  		Outputs:         depFragment.Outputs,
   188  		Secrets:         utils.ConvertStringArrayPointer(depFragment.Secrets),
   189  		Providers:       convertProviders(depFragment.Providers),
   190  		ProviderWirings: depFragment.ProviderWirings,
   191  	}
   192  	if depFragment.ProviderVsn != nil {
   193  		dep.ProviderVsn = *depFragment.ProviderVsn
   194  	}
   195  	if depFragment.CliVsn != nil {
   196  		dep.CliVsn = *depFragment.CliVsn
   197  	}
   198  	if depFragment.Application != nil {
   199  		dep.Application = *depFragment.Application
   200  	}
   201  	if depFragment.Wait != nil {
   202  		dep.Wait = *depFragment.Wait
   203  	}
   204  	dep.Dependencies = make([]*Dependency, 0)
   205  	for _, dependency := range depFragment.Dependencies {
   206  		dep.Dependencies = append(dep.Dependencies, &Dependency{
   207  			Type: string(*dependency.Type),
   208  			Repo: utils.ConvertStringPointer(dependency.Repo),
   209  			Name: utils.ConvertStringPointer(dependency.Name),
   210  		})
   211  	}
   212  	if depFragment.Wirings != nil {
   213  		dep.Wirings = &Wirings{
   214  			Terraform: utils.ConvertMapInterfaceToString(depFragment.Wirings.Terraform),
   215  			Helm:      utils.ConvertMapInterfaceToString(depFragment.Wirings.Helm),
   216  		}
   217  	}
   218  
   219  	return dep
   220  }
   221  
   222  func convertProviders(providers []*gqlclient.Provider) []string {
   223  	p := make([]string, 0)
   224  	for _, provider := range providers {
   225  		p = append(p, string(*provider))
   226  	}
   227  
   228  	return p
   229  }
   230  
   231  func convertChartInstallation(fragment *gqlclient.ChartInstallationFragment) *ChartInstallation {
   232  	if fragment == nil {
   233  		return nil
   234  	}
   235  	return &ChartInstallation{
   236  		Id: *fragment.ID,
   237  		Chart: &Chart{
   238  			Id:            utils.ConvertStringPointer(fragment.Chart.ID),
   239  			Name:          fragment.Chart.Name,
   240  			Description:   utils.ConvertStringPointer(fragment.Chart.Description),
   241  			LatestVersion: utils.ConvertStringPointer(fragment.Chart.LatestVersion),
   242  			Dependencies:  convertDependencies(fragment.Chart.Dependencies),
   243  		},
   244  		Version: convertVersion(fragment.Version),
   245  	}
   246  }