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 }