From 95f079d6a3764ab3040aeaa3482a216c2be355b2 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Tue, 29 Oct 2024 18:04:16 +0530 Subject: [PATCH 1/5] Support for helm upgrades Signed-off-by: Mayank Shah --- .github/workflows/dev-build.yaml | 2 +- .github/workflows/release.yml | 8 +++---- Dockerfile | 1 + pkg/upgrade/upgrade.go | 38 ++++++++++++++++++++++---------- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/.github/workflows/dev-build.yaml b/.github/workflows/dev-build.yaml index 5005c90aa..e0f41f7cd 100644 --- a/.github/workflows/dev-build.yaml +++ b/.github/workflows/dev-build.yaml @@ -42,7 +42,7 @@ jobs: - name: Build Everest run: | - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make build + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make build build-cli - name: Setup docker build metadata uses: docker/metadata-action@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2c124188..90cb608fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -428,6 +428,10 @@ jobs: type=raw,value=latest type=raw,value=${{ env.FLOATING_TAG }},enable=${{ env.IS_RC == 0 }} + - name: CLI - build binaries + run: | + make release-cli + - name: Everest - build Everest image uses: docker/build-push-action@v6 with: @@ -457,10 +461,6 @@ jobs: push: true tags: ${{ steps.everest_meta.outputs.tags }} - - name: CLI - build binaries - run: | - make release-cli - - name: CLI - create release with binaries uses: softprops/action-gh-release@v2 with: diff --git a/Dockerfile b/Dockerfile index ab5e6cb8a..7cdefe1db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,7 @@ FROM scratch WORKDIR / COPY ./bin/everest /everest-api +COPY ./bin/everestctl /everestctl COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ EXPOSE 8080 diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index ef667c780..ca42171e8 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -133,17 +133,31 @@ func NewUpgrade(cfg *Config, l *zap.SugaredLogger) (*Upgrade, error) { cli.l = zap.NewNop().Sugar() } - k, err := kubernetes.New(cfg.KubeconfigPath, cli.l) - if err != nil { - var u *url.Error - if errors.As(err, &u) { - l.Error("Could not connect to Kubernetes. " + - "Make sure Kubernetes is running and is accessible from this computer/server.") + // If a KubeConfig is provided, we use it to create a client. + // Otherwise, we try to create an in-cluster client, since the upgrade CLI may be used to run + // pre-upgrade checks when using Helm (using a chart hook). + var kubeClient kubernetes.KubernetesConnector + if cfg.KubeconfigPath != "" { + k, err := kubernetes.New(cfg.KubeconfigPath, cli.l) + if err != nil { + var u *url.Error + if errors.As(err, &u) { + l.Error("Could not connect to Kubernetes. " + + "Make sure Kubernetes is running and is accessible from this computer/server.") + } + return nil, err + } + kubeClient = k + } else { + k, err := kubernetes.NewInCluster(cli.l) + if err != nil { + return nil, fmt.Errorf("could not create in-cluster kubernetes client: %w", err) } - return nil, err + kubeClient = k } + cli.dryRun = cfg.DryRun - cli.kubeClient = k + cli.kubeClient = kubeClient cli.versionService = versionservice.New(cfg.VersionMetadataURL) return cli, nil } @@ -174,6 +188,10 @@ func (u *Upgrade) Run(ctx context.Context) error { return err } + if u.dryRun { + return nil + } + if !u.config.SkipEnvDetection { // Catalog namespace or Skip OLM implies disabled environment detection. if u.config.SkipOLM || u.config.CatalogNamespace != kubernetes.OLMNamespace { @@ -193,10 +211,6 @@ func (u *Upgrade) Run(ctx context.Context) error { u.config.CatalogNamespace = env.CatalogNamespace } - if u.dryRun { - return nil - } - upgradeSteps := []common.Step{} // Start upgrade. From cc5bb60f2c8530571d0543d831528608613cdb46 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Thu, 31 Oct 2024 10:01:17 +0530 Subject: [PATCH 2/5] Add --in-cluster flag Signed-off-by: Mayank Shah --- commands/upgrade.go | 3 ++- pkg/upgrade/upgrade.go | 19 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/commands/upgrade.go b/commands/upgrade.go index 1e992ecf4..c66c1de33 100644 --- a/commands/upgrade.go +++ b/commands/upgrade.go @@ -73,7 +73,7 @@ func initUpgradeFlags(cmd *cobra.Command) { cmd.Flags().String("version-metadata-url", "https://check.percona.com", "URL to retrieve version metadata information from") cmd.Flags().BoolP("logs", "l", false, "If set, logs are printed during the upgrade process") cmd.Flags().Bool("dry-run", false, "If set, only executes the pre-upgrade checks") - + cmd.Flags().Bool("in-cluster", false, "If set, uses the in-cluster Kubernetes client configuration") cmd.Flags().Bool(upgrade.FlagSkipEnvDetection, false, "Skip detecting Kubernetes environment where Everest is installed") cmd.Flags().String(upgrade.FlagCatalogNamespace, kubernetes.OLMNamespace, fmt.Sprintf("Namespace where Everest OLM catalog is installed. Implies --%s", upgrade.FlagSkipEnvDetection), @@ -88,6 +88,7 @@ func initUpgradeViperFlags(cmd *cobra.Command) { viper.BindPFlag("verbose", cmd.Flags().Lookup("verbose")) //nolint:errcheck,gosec viper.BindPFlag("json", cmd.Flags().Lookup("json")) //nolint:errcheck,gosec viper.BindPFlag("dry-run", cmd.Flags().Lookup("dry-run")) //nolint:errcheck,gosec + viper.BindPFlag("in-cluster", cmd.Flags().Lookup("in-cluster")) //nolint:errcheck,gosec viper.BindPFlag(upgrade.FlagSkipEnvDetection, cmd.Flags().Lookup(upgrade.FlagSkipEnvDetection)) //nolint:errcheck,gosec viper.BindPFlag(upgrade.FlagSkipOLM, cmd.Flags().Lookup(upgrade.FlagSkipOLM)) //nolint:errcheck,gosec diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index ca42171e8..fb12cc57e 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -92,6 +92,8 @@ type ( Config struct { // KubeconfigPath is a path to a kubeconfig KubeconfigPath string `mapstructure:"kubeconfig"` + // InCluster is set if the upgrade process should use in-cluster configuration. + InCluster bool `mapstructure:"in-cluster"` // VersionMetadataURL stores hostname to retrieve version metadata information from. VersionMetadataURL string `mapstructure:"version-metadata-url"` // DryRun is set if the upgrade process should only perform pre-upgrade checks and not perform the actual upgrade. @@ -133,11 +135,14 @@ func NewUpgrade(cfg *Config, l *zap.SugaredLogger) (*Upgrade, error) { cli.l = zap.NewNop().Sugar() } - // If a KubeConfig is provided, we use it to create a client. - // Otherwise, we try to create an in-cluster client, since the upgrade CLI may be used to run - // pre-upgrade checks when using Helm (using a chart hook). var kubeClient kubernetes.KubernetesConnector - if cfg.KubeconfigPath != "" { + if cfg.InCluster { + k, err := kubernetes.NewInCluster(cli.l) + if err != nil { + return nil, fmt.Errorf("could not create in-cluster kubernetes client: %w", err) + } + kubeClient = k + } else { k, err := kubernetes.New(cfg.KubeconfigPath, cli.l) if err != nil { var u *url.Error @@ -148,12 +153,6 @@ func NewUpgrade(cfg *Config, l *zap.SugaredLogger) (*Upgrade, error) { return nil, err } kubeClient = k - } else { - k, err := kubernetes.NewInCluster(cli.l) - if err != nil { - return nil, fmt.Errorf("could not create in-cluster kubernetes client: %w", err) - } - kubeClient = k } cli.dryRun = cfg.DryRun From 72c9f5cfe7024bfb0962253814f4657dc4201308 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Thu, 31 Oct 2024 10:02:55 +0530 Subject: [PATCH 3/5] undo changes in CI Signed-off-by: Mayank Shah --- .github/workflows/dev-build.yaml | 2 +- .github/workflows/release.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev-build.yaml b/.github/workflows/dev-build.yaml index e0f41f7cd..5005c90aa 100644 --- a/.github/workflows/dev-build.yaml +++ b/.github/workflows/dev-build.yaml @@ -42,7 +42,7 @@ jobs: - name: Build Everest run: | - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make build build-cli + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make build - name: Setup docker build metadata uses: docker/metadata-action@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90cb608fd..d2c124188 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -428,10 +428,6 @@ jobs: type=raw,value=latest type=raw,value=${{ env.FLOATING_TAG }},enable=${{ env.IS_RC == 0 }} - - name: CLI - build binaries - run: | - make release-cli - - name: Everest - build Everest image uses: docker/build-push-action@v6 with: @@ -461,6 +457,10 @@ jobs: push: true tags: ${{ steps.everest_meta.outputs.tags }} + - name: CLI - build binaries + run: | + make release-cli + - name: CLI - create release with binaries uses: softprops/action-gh-release@v2 with: From 5d2694b987a6a9e9a15711a0e8cc8904a5eb83cf Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Thu, 31 Oct 2024 10:03:36 +0530 Subject: [PATCH 4/5] undo Dockerfile Signed-off-by: Mayank Shah --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7cdefe1db..ab5e6cb8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,6 @@ FROM scratch WORKDIR / COPY ./bin/everest /everest-api -COPY ./bin/everestctl /everestctl COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ EXPOSE 8080 From eefb9a93fd3c8e4fdced5bb79da288270ceeb0c3 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Thu, 31 Oct 2024 10:24:03 +0530 Subject: [PATCH 5/5] simplify if-else Signed-off-by: Mayank Shah --- pkg/upgrade/upgrade.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index fb12cc57e..099905464 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -142,7 +142,8 @@ func NewUpgrade(cfg *Config, l *zap.SugaredLogger) (*Upgrade, error) { return nil, fmt.Errorf("could not create in-cluster kubernetes client: %w", err) } kubeClient = k - } else { + } + if cfg.KubeconfigPath != "" { k, err := kubernetes.New(cfg.KubeconfigPath, cli.l) if err != nil { var u *url.Error @@ -154,6 +155,9 @@ func NewUpgrade(cfg *Config, l *zap.SugaredLogger) (*Upgrade, error) { } kubeClient = k } + if kubeClient == nil { + return nil, errors.New("must provide kubeconfig path or run in-cluster") + } cli.dryRun = cfg.DryRun cli.kubeClient = kubeClient