Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pkg/scaffold/role,pkg/operator-sdk/new.go: generate role rules from helm chart #1188

Merged
merged 9 commits into from
Apr 11, 2019
6 changes: 5 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 12 additions & 2 deletions cmd/operator-sdk/new/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (

log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"sigs.k8s.io/controller-runtime/pkg/client/config"
)

func NewCmd() *cobra.Command {
Expand Down Expand Up @@ -277,9 +278,18 @@ func doHelmScaffold() error {
return fmt.Errorf("failed to create helm chart: %s", err)
}

valuesPath := filepath.Join("<project_dir>", helm.HelmChartsDir, chart.GetMetadata().GetName(), "values.yaml")
valuesPath := filepath.Join("<project_dir>", scaffold.HelmChartsDir, chart.GetMetadata().GetName(), "values.yaml")
crSpec := fmt.Sprintf("# Default values copied from %s\n\n%s", valuesPath, chart.GetValues().GetRaw())

k8sCfg, err := config.GetConfig()
if err != nil {
return fmt.Errorf("failed to get kubernetes config: %s", err)
}
roleScaffold, err := helm.CreateRoleScaffold(k8sCfg, chart, isClusterScoped)
if err != nil {
return fmt.Errorf("failed to generate role scaffold: %s", err)
}

s := &scaffold.Scaffold{}
err = s.Execute(cfg,
&helm.Dockerfile{},
Expand All @@ -288,7 +298,7 @@ func doHelmScaffold() error {
ChartName: chart.GetMetadata().GetName(),
},
&scaffold.ServiceAccount{},
&scaffold.Role{IsClusterScoped: isClusterScoped},
roleScaffold,
&scaffold.RoleBinding{IsClusterScoped: isClusterScoped},
&helm.Operator{IsClusterScoped: isClusterScoped},
&scaffold.CRD{Resource: resource},
Expand Down
1 change: 1 addition & 0 deletions internal/pkg/scaffold/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,6 @@ const (
DeployDir = "deploy"
OLMCatalogDir = DeployDir + filePathSep + "olm-catalog"
CRDsDir = DeployDir + filePathSep + "crds"
HelmChartsDir = "helm-charts"
VersionDir = "version"
)
52 changes: 33 additions & 19 deletions internal/pkg/scaffold/helm/chart.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ import (
)

const (

// HelmChartsDir is the relative directory within an SDK project where Helm
// charts are stored.
HelmChartsDir string = "helm-charts"

// DefaultAPIVersion is the Kubernetes CRD API Version used for fetched
// charts when the --api-version flag is not specified
DefaultAPIVersion string = "charts.helm.k8s.io/v1alpha1"
Expand Down Expand Up @@ -113,7 +108,7 @@ type CreateChartOptions struct {
// CreateChart returns an error if an error occurs creating the scaffold.Resource or
// creating the chart.
func CreateChart(projectDir string, opts CreateChartOptions) (*scaffold.Resource, *chart.Chart, error) {
chartsDir := filepath.Join(projectDir, HelmChartsDir)
chartsDir := filepath.Join(projectDir, scaffold.HelmChartsDir)
err := os.MkdirAll(chartsDir, 0755)
if err != nil {
return nil, nil, err
Expand All @@ -134,7 +129,20 @@ func CreateChart(projectDir string, opts CreateChartOptions) (*scaffold.Resource
if err != nil {
return nil, nil, err
}
log.Infof("Created %s/%s/", HelmChartsDir, c.GetMetadata().GetName())

relChartPath := filepath.Join(scaffold.HelmChartsDir, c.GetMetadata().GetName())
absChartPath := filepath.Join(projectDir, relChartPath)
if err := fetchChartDependencies(absChartPath); err != nil {
return nil, nil, err
}

// Reload chart in case dependencies changed
c, err = chartutil.Load(absChartPath)
if err != nil {
return nil, nil, err
}

log.Infof("Created %s", relChartPath)
return r, c, nil
}

Expand All @@ -159,7 +167,7 @@ func scaffoldChart(destDir, apiVersion, kind string) (*scaffold.Resource, *chart
return nil, nil, err
}

chart, err := chartutil.LoadDir(chartPath)
chart, err := chartutil.Load(chartPath)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -198,17 +206,7 @@ func fetchChart(destDir string, opts CreateChartOptions) (*scaffold.Resource, *c
}

func createChartFromDisk(destDir, source string, isDir bool) (*chart.Chart, error) {
var (
chart *chart.Chart
err error
)

// If source is a file or directory, attempt to load it
if isDir {
chart, err = chartutil.LoadDir(source)
} else {
chart, err = chartutil.LoadFile(source)
}
chart, err := chartutil.Load(source)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -265,3 +263,19 @@ func createChartFromRemote(destDir string, opts CreateChartOptions) (*chart.Char

return createChartFromDisk(destDir, chartArchive, false)
}

func fetchChartDependencies(chartPath string) error {
helmHome, ok := os.LookupEnv(environment.HomeEnvVar)
if !ok {
helmHome = environment.DefaultHelmHome
}
getters := getter.All(environment.EnvSettings{})

man := &downloader.Manager{
Out: ioutil.Discard,
ChartPath: chartPath,
HelmHome: helmpath.Home(helmHome),
Getters: getters,
}
return man.Build()
}
2 changes: 1 addition & 1 deletion internal/pkg/scaffold/helm/dockerfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (d *Dockerfile) GetInput() (input.Input, error) {
if d.Path == "" {
d.Path = filepath.Join(scaffold.BuildDir, scaffold.DockerfileFile)
}
d.HelmChartsDir = HelmChartsDir
d.HelmChartsDir = scaffold.HelmChartsDir
d.ImageTag = strings.TrimSuffix(version.Version, "+git")
d.TemplateBody = dockerFileHelmTmpl
return d.Input, nil
Expand Down
Loading