Skip to content
This repository has been archived by the owner on May 3, 2022. It is now read-only.

Commit

Permalink
Changing command to recieve an application yaml
Browse files Browse the repository at this point in the history
  • Loading branch information
hihilla committed Jan 19, 2021
1 parent 598b944 commit a6b4d1b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 103 deletions.
58 changes: 50 additions & 8 deletions cmd/shipperctl/cmd/chart/app.go
Original file line number Diff line number Diff line change
@@ -1,27 +1,52 @@
package chart

import (
"github.com/bookingcom/shipper/cmd/shipperctl/config"
"io/ioutil"
"os"

"github.com/spf13/cobra"
"sigs.k8s.io/yaml"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/bookingcom/shipper/cmd/shipperctl/config"
shipper "github.com/bookingcom/shipper/pkg/apis/shipper/v1alpha1"
)

var (
appName string
appName string
fileName string

renderAppCmd = &cobra.Command{
Use: "app bikerental",
Use: "app",
Short: "render Shipper Charts for an Application",
RunE: renderChartFromApp,
Args: cobra.ExactArgs(1),
PersistentPreRun: func(cmd *cobra.Command, args []string) {
if appName == "" && fileName == "" {
cmd.Printf("error: must have *one* of the flags: appName, filename\n")
os.Exit(1)
}
if appName != "" && fileName != "" {
cmd.Printf("error: must have *one* of the flags: appName, filename\n")
os.Exit(1)
}
},
}
)

func init() {
fileFlagName := "filename"

renderAppCmd.Flags().StringVar(&appName, "appName", "", "The name of an existing application to render chart for")
renderAppCmd.Flags().StringVar(&fileName, fileFlagName, "", "An application manifest in the current context to render chart for (e.g. `applicastion.yaml`)")
err := renderAppCmd.MarkFlagFilename(fileFlagName, "yaml")
if err != nil {
renderAppCmd.Printf("warning: could not mark %q for filename yaml autocompletion: %s\n", fileFlagName, err)
}

renderCmd.AddCommand(renderAppCmd)
}

func renderChartFromApp(cmd *cobra.Command, args []string) error {
appName = args[0]
c, err := newChartRenderConfig()
if err != nil {
return err
Expand All @@ -30,10 +55,28 @@ func renderChartFromApp(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
if err := populateFromApp(shipperClient, &c); err != nil {
return err
var application shipper.Application
if appName != "" {
applicationP, err := shipperClient.ShipperV1alpha1().Applications(namespace).Get(appName, metav1.GetOptions{})
if err != nil {
return err
}
application = *applicationP
} else {
appYaml, err := ioutil.ReadFile(fileName)
if err != nil {
return err
}

if err := yaml.Unmarshal(appYaml, &application); err != nil {
return err
}

}

if err := populateFromApp(shipperClient, &c, application); err != nil {
return err
}
rendered, err := render(c)
if err != nil {
return err
Expand All @@ -42,4 +85,3 @@ func renderChartFromApp(cmd *cobra.Command, args []string) error {
cmd.Println(rendered)
return nil
}

98 changes: 3 additions & 95 deletions cmd/shipperctl/cmd/chart/render.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package chart

import (
"bytes"
"fmt"
"os"
"path/filepath"
"strings"

"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/yaml"

"github.com/bookingcom/shipper/cmd/shipperctl/config"
"github.com/bookingcom/shipper/cmd/shipperctl/configurator"
Expand All @@ -24,11 +22,6 @@ var (
kubeConfigFile string
managementClusterContext string

chartName string
chartVersion string
chartRepoUrl string
values string

Command = &cobra.Command{
Use: "chart",
Short: "operate on Shipper Charts",
Expand All @@ -37,7 +30,6 @@ var (
renderCmd = &cobra.Command{
Use: "render",
Short: "render Helm Charts for an Application or Release",
RunE: renderChart,
}
)

Expand All @@ -55,79 +47,11 @@ func init() {
Command.Printf("warning: could not mark %q for filename autocompletion: %s\n", kubeConfigFlagName, err)
}
Command.PersistentFlags().StringVar(&managementClusterContext, "management-cluster-context", "", "The name of the context to use to communicate with the management cluster. defaults to the current one")
Command.PersistentFlags().StringVarP(&namespace, "namespace", "n", "", "namespace where the app lives")

renderCmd.Flags().StringVar(&chartName, "chart-name", "", "The name of the chart as specified in the application manifest")
if err := renderCmd.MarkFlagRequired("chart-name"); err != nil {
renderCmd.Printf("warning: could not mark flag %q as required: %s\n", "chart-name", err)
}
renderCmd.Flags().StringVar(&chartVersion, "chart-version", "", "The version of the chart as specified in the application manifest (semver are accepted)")
if err := renderCmd.MarkFlagRequired("chart-version"); err != nil {
renderCmd.Printf("warning: could not mark flag %q as required: %s\n", "chart-version", err)
}
renderCmd.Flags().StringVar(&chartRepoUrl, "chart-repo", "", "The repository URL of the chart as specified in the application manifest")
if err := renderCmd.MarkFlagRequired("chart-repo"); err != nil {
renderCmd.Printf("warning: could not mark flag %q as required: %s\n", "chart-repo", err)
}

renderCmd.Flags().StringVar(&values, "values", values, "Values to apply to the chart in a JSON format")
Command.PersistentFlags().StringVarP(&namespace, "namespace", "n", "", "The namespace where the app lives")

Command.AddCommand(renderCmd)
}

func renderChart(cmd *cobra.Command, args []string) error {
c, err := newChartRenderConfig()
if err != nil {
return err
}
if err := populateFromFlags(&c); err != nil {
return err
}

cmd.Printf("Here is the chart config: \n%v\n", c)
cmd.Printf("Here is the chart values: \n%v\n", c.ChartValues)

rendered, err := render(c)
if err != nil {
return err
}

cmd.Println(rendered)
return nil
}

func populateFromFlags(c *ChartRenderConfig) error {
chartSpec, err := chartSpec()
if err != nil {
return err
}
c.ChartSpec = chartSpec

chartValues := shipper.ChartValues{}
if err := yaml.Unmarshal(bytes.NewBufferString(values).Bytes(), &chartValues); err != nil {
return err
}

c.ChartValues = &chartValues
c.ReleaseName = "foobar-foobar-0"
return nil
}

func chartSpec() (shipper.Chart, error) {
chartSpec := shipper.Chart{
Name: chartName,
Version: chartVersion,
RepoURL: chartRepoUrl,
}
chartResolver := newResolveChartVersionFunc()
cv, err := chartResolver(&chartSpec)
if err != nil {
return chartSpec, err
}
chartSpec.Version = cv.Version
return chartSpec, nil
}

func render(c ChartRenderConfig) (string, error) {
chartFetcher := newFetchChartFunc()
chart, err := chartFetcher(&c.ChartSpec)
Expand Down Expand Up @@ -178,13 +102,8 @@ func populateFormRelease(shipperClient shipperclientset.Interface, c *ChartRende
return nil
}

func populateFromApp(shipperClient shipperclientset.Interface, c *ChartRenderConfig) error {
app, err := shipperClient.ShipperV1alpha1().Applications(namespace).Get(appName, metav1.GetOptions{})
if err != nil {
return err
}

c.ReleaseName = fmt.Sprintf("%s-%s-%d", appName, "foobar", 0)
func populateFromApp(shipperClient shipperclientset.Interface, c *ChartRenderConfig, app shipper.Application) error {
c.ReleaseName = fmt.Sprintf("%s-%s-%d", app.Name, "foobar", 0)
c.ChartSpec = app.Spec.Template.Chart
c.ChartValues = app.Spec.Template.Values
return nil
Expand All @@ -200,14 +119,3 @@ func newFetchChartFunc() repo.ChartFetcher {

return repo.FetchChartFunc(repoCatalog)
}

func newResolveChartVersionFunc() repo.ChartVersionResolver {
stopCh := make(<-chan struct{})

repoCatalog := repo.NewCatalog(
repo.DefaultFileCacheFactory(filepath.Join(os.TempDir(), "chart-cache")),
repo.DefaultRemoteFetcher,
stopCh)

return repo.ResolveChartVersionFunc(repoCatalog)
}

0 comments on commit a6b4d1b

Please sign in to comment.