From c968c08ddc05bcd546ff07482a8a67447809d645 Mon Sep 17 00:00:00 2001 From: Ilya Lesikov Date: Thu, 16 Jun 2022 14:09:19 +0300 Subject: [PATCH] feat(external-deps): external dependencies now available for `werf helm` Signed-off-by: Ilya Lesikov --- cmd/werf/bundle/apply/apply.go | 7 +--- cmd/werf/converge/converge.go | 7 +--- cmd/werf/helm/helm.go | 5 +-- cmd/werf/helm/install.go | 5 +-- cmd/werf/helm/template.go | 5 +-- cmd/werf/helm/upgrade.go | 5 +-- pkg/deploy/helm/external_deps_generator.go | 46 +++++++++++++++------- 7 files changed, 41 insertions(+), 39 deletions(-) diff --git a/cmd/werf/bundle/apply/apply.go b/cmd/werf/bundle/apply/apply.go index c00912abb2..d414670c25 100644 --- a/cmd/werf/bundle/apply/apply.go +++ b/cmd/werf/bundle/apply/apply.go @@ -214,14 +214,9 @@ func runApply() error { ChartExtender: bundle, } - stagesExternalDepsGenerator, err := helm.NewStagesExternalDepsGenerator(actionConfig.RESTClientGetter) - if err != nil { - return fmt.Errorf("error creating external deps generator: %w", err) - } - helmUpgradeCmd, _ := helm_v3.NewUpgradeCmd(actionConfig, logboek.Context(ctx).OutStream(), helm_v3.UpgradeCmdOptions{ StagesSplitter: helm.NewStagesSplitter(), - StagesExternalDepsGenerator: stagesExternalDepsGenerator, + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), ChainPostRenderer: bundle.ChainPostRenderer, ValueOpts: &values.Options{ ValueFiles: common.GetValues(&commonCmdData), diff --git a/cmd/werf/converge/converge.go b/cmd/werf/converge/converge.go index 626ca947f9..e41d6e5c7c 100644 --- a/cmd/werf/converge/converge.go +++ b/cmd/werf/converge/converge.go @@ -444,14 +444,9 @@ func run(ctx context.Context, containerBackend container_backend.ContainerBacken return err } - stagesExternalDepsGenerator, err := helm.NewStagesExternalDepsGenerator(actionConfig.RESTClientGetter) - if err != nil { - return fmt.Errorf("error creating external deps generator: %w", err) - } - helmUpgradeCmd, _ := helm_v3.NewUpgradeCmd(actionConfig, logboek.OutStream(), helm_v3.UpgradeCmdOptions{ StagesSplitter: helm.NewStagesSplitter(), - StagesExternalDepsGenerator: stagesExternalDepsGenerator, + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), ChainPostRenderer: wc.ChainPostRenderer, ValueOpts: valueOpts, CreateNamespace: common.NewBool(true), diff --git a/cmd/werf/helm/helm.go b/cmd/werf/helm/helm.go index f2dad6eec3..986c0d5ce5 100644 --- a/cmd/werf/helm/helm.go +++ b/cmd/werf/helm/helm.go @@ -80,9 +80,8 @@ func NewCmd() *cobra.Command { NewTemplateCmd(actionConfig, wc), helm_v3.NewRepoCmd(os.Stdout), helm_v3.NewRollbackCmd(actionConfig, os.Stdout, helm_v3.RollbackCmdOptions{ - StagesSplitter: helm.NewStagesSplitter(), - // TODO: actionConfig.RESTClientGetter not initialized at this point, but we need it. - StagesExternalDepsGenerator: nil, + StagesSplitter: helm.NewStagesSplitter(), + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), }), NewInstallCmd(actionConfig, wc), NewUpgradeCmd(actionConfig, wc), diff --git a/cmd/werf/helm/install.go b/cmd/werf/helm/install.go index a64464a1d0..60daf39cb1 100644 --- a/cmd/werf/helm/install.go +++ b/cmd/werf/helm/install.go @@ -19,9 +19,8 @@ var installCmdData common.CmdData func NewInstallCmd(actionConfig *action.Configuration, wc *chart_extender.WerfChartStub) *cobra.Command { cmd, helmAction := helm_v3.NewInstallCmd(actionConfig, os.Stdout, helm_v3.InstallCmdOptions{ - StagesSplitter: helm.NewStagesSplitter(), - // TODO: actionConfig.RESTClientGetter not initialized at this point, but we need it. - StagesExternalDepsGenerator: nil, + StagesSplitter: helm.NewStagesSplitter(), + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), ChainPostRenderer: wc.ChainPostRenderer, }) SetupRenderRelatedWerfChartParams(cmd, &installCmdData) diff --git a/cmd/werf/helm/template.go b/cmd/werf/helm/template.go index d384b93bb5..767c7bd5ef 100644 --- a/cmd/werf/helm/template.go +++ b/cmd/werf/helm/template.go @@ -17,9 +17,8 @@ var templateCmdData common.CmdData func NewTemplateCmd(actionConfig *action.Configuration, wc *chart_extender.WerfChartStub) *cobra.Command { cmd, _ := helm_v3.NewTemplateCmd(actionConfig, os.Stdout, helm_v3.TemplateCmdOptions{ - StagesSplitter: helm.NewStagesSplitter(), - // TODO: actionConfig.RESTClientGetter not initialized at this point, but we need it. - StagesExternalDepsGenerator: nil, + StagesSplitter: helm.NewStagesSplitter(), + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), ChainPostRenderer: wc.ChainPostRenderer, }) SetupRenderRelatedWerfChartParams(cmd, &templateCmdData) diff --git a/cmd/werf/helm/upgrade.go b/cmd/werf/helm/upgrade.go index 68ca021988..4eef633446 100644 --- a/cmd/werf/helm/upgrade.go +++ b/cmd/werf/helm/upgrade.go @@ -19,9 +19,8 @@ var upgradeCmdData common.CmdData func NewUpgradeCmd(actionConfig *action.Configuration, wc *chart_extender.WerfChartStub) *cobra.Command { cmd, _ := helm_v3.NewUpgradeCmd(actionConfig, os.Stdout, helm_v3.UpgradeCmdOptions{ - StagesSplitter: helm.NewStagesSplitter(), - // TODO: actionConfig.RESTClientGetter not initialized at this point, but we need it. - StagesExternalDepsGenerator: nil, + StagesSplitter: helm.NewStagesSplitter(), + StagesExternalDepsGenerator: helm.NewStagesExternalDepsGenerator(&actionConfig.RESTClientGetter), ChainPostRenderer: wc.ChainPostRenderer, }) SetupRenderRelatedWerfChartParams(cmd, &upgradeCmdData) diff --git a/pkg/deploy/helm/external_deps_generator.go b/pkg/deploy/helm/external_deps_generator.go index 0dbb1a5c56..57662ea198 100644 --- a/pkg/deploy/helm/external_deps_generator.go +++ b/pkg/deploy/helm/external_deps_generator.go @@ -13,33 +13,49 @@ import ( "k8s.io/client-go/restmapper" ) -func NewStagesExternalDepsGenerator(restClient action.RESTClientGetter) (*StagesExternalDepsGenerator, error) { - mapper, err := restClient.ToRESTMapper() - if err != nil { - return nil, fmt.Errorf("error getting REST mapper: %w", err) - } - - discoveryClient, err := restClient.ToDiscoveryClient() - if err != nil { - return nil, fmt.Errorf("error getting discovery client: %w", err) - } - - gvkBuilder := NewGVKBuilder(scheme.Scheme, restmapper.NewShortcutExpander(mapper, discoveryClient)) - +func NewStagesExternalDepsGenerator(restClient *action.RESTClientGetter) *StagesExternalDepsGenerator { return &StagesExternalDepsGenerator{ + restClient: restClient, metaAccessor: metadataAccessor, scheme: scheme.Scheme, - gvkBuilder: gvkBuilder, - }, nil + } } type StagesExternalDepsGenerator struct { + restClient *action.RESTClientGetter gvkBuilder externaldeps.GVKBuilder metaAccessor meta.MetadataAccessor scheme *runtime.Scheme + initialized bool +} + +func (s *StagesExternalDepsGenerator) init() error { + if s.initialized { + return nil + } + + mapper, err := (*s.restClient).ToRESTMapper() + if err != nil { + return fmt.Errorf("error getting REST mapper: %w", err) + } + + discoveryClient, err := (*s.restClient).ToDiscoveryClient() + if err != nil { + return fmt.Errorf("error getting discovery client: %w", err) + } + + s.gvkBuilder = NewGVKBuilder(scheme.Scheme, restmapper.NewShortcutExpander(mapper, discoveryClient)) + + s.initialized = true + + return nil } func (s *StagesExternalDepsGenerator) Generate(stages stages.SortedStageList) error { + if err := s.init(); err != nil { + return fmt.Errorf("error initializing external dependencies generator: %w", err) + } + for _, stage := range stages { if err := stage.DesiredResources.Visit(func(resInfo *resource.Info, err error) error { if err != nil {