From 79d13b103f7176b1ebb7ea711b6c0b28a6bb35a6 Mon Sep 17 00:00:00 2001 From: DerBurri Date: Wed, 12 Aug 2026 14:22:57 +0200 Subject: [PATCH 001/132] first draft --- cli/cmd/codesphere/codesphere_suite_test.go | 16 + cli/cmd/codesphere/smoketest_codesphere.go | 12 +- .../codesphere/smoketest_codesphere_test.go | 36 +- cli/cmd/codesphere/status_codesphere.go | 87 +++++ cli/cmd/codesphere/status_report.go | 155 ++++++++ cli/cmd/codesphere/test_codesphere.go | 249 +++++++++++++ cli/cmd/codesphere/test_codesphere_test.go | 144 ++++++++ cli/cmd/root.go | 4 + cli/cmd/status.go | 30 ++ cli/cmd/test.go | 63 ++++ docs/README.md | 2 + internal/codesphere/testplan/testplan.go | 347 ++++++++++++++++++ .../testplan/testplan_suite_test.go | 16 + internal/codesphere/testplan/testplan_test.go | 235 ++++++++++++ 14 files changed, 1375 insertions(+), 21 deletions(-) create mode 100644 cli/cmd/codesphere/codesphere_suite_test.go create mode 100644 cli/cmd/codesphere/status_codesphere.go create mode 100644 cli/cmd/codesphere/status_report.go create mode 100644 cli/cmd/codesphere/test_codesphere.go create mode 100644 cli/cmd/codesphere/test_codesphere_test.go create mode 100644 cli/cmd/status.go create mode 100644 cli/cmd/test.go create mode 100644 internal/codesphere/testplan/testplan.go create mode 100644 internal/codesphere/testplan/testplan_suite_test.go create mode 100644 internal/codesphere/testplan/testplan_test.go diff --git a/cli/cmd/codesphere/codesphere_suite_test.go b/cli/cmd/codesphere/codesphere_suite_test.go new file mode 100644 index 000000000..b8f38f853 --- /dev/null +++ b/cli/cmd/codesphere/codesphere_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestCodesphere(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Codesphere Cmd Suite") +} diff --git a/cli/cmd/codesphere/smoketest_codesphere.go b/cli/cmd/codesphere/smoketest_codesphere.go index 54425365b..a93b78bbb 100644 --- a/cli/cmd/codesphere/smoketest_codesphere.go +++ b/cli/cmd/codesphere/smoketest_codesphere.go @@ -40,14 +40,15 @@ type SmoketestCodesphereCmd struct { Opts *teststeps.SmoketestCodesphereOpts } -func (c *SmoketestCodesphereCmd) RunE(_ *cobra.Command, args []string) error { +// RunE runs the smoke test against the configured Codesphere installation. +func (c *SmoketestCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) if err != nil { return fmt.Errorf("failed to create Codesphere client: %w", err) } c.Opts.Client = client - return c.RunSmoketest() + return c.RunSmoketest(cmd.Context()) } func AddSmoketestCmd(parent *cobra.Command, opts *util.GlobalOptions) { @@ -113,8 +114,11 @@ func AddSmoketestCmd(parent *cobra.Command, opts *util.GlobalOptions) { util.AddCmd(parent, c.cmd) } -func (c *SmoketestCodesphereCmd) RunSmoketest() (err error) { - ctx, cancel := context.WithTimeout(context.Background(), c.Opts.Timeout) +// RunSmoketest runs the selected smoke test steps. The passed context bounds +// the run in addition to the configured timeout, so callers that orchestrate +// several tests (see the test command) can cancel it. +func (c *SmoketestCodesphereCmd) RunSmoketest(ctx context.Context) (err error) { + ctx, cancel := context.WithTimeout(ctx, c.Opts.Timeout) defer cancel() availableStepsMap := make(map[string]teststeps.SmokeTestStep) diff --git a/cli/cmd/codesphere/smoketest_codesphere_test.go b/cli/cmd/codesphere/smoketest_codesphere_test.go index e740356e2..70bb7a7ab 100644 --- a/cli/cmd/codesphere/smoketest_codesphere_test.go +++ b/cli/cmd/codesphere/smoketest_codesphere_test.go @@ -4,6 +4,7 @@ package codesphere_test import ( + "context" "fmt" "strconv" "strings" @@ -124,7 +125,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { It("returns an error indicating no teams are available", func() { mockClient.EXPECT().ListTeams("").Return([]api.Team{}, nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("no teams available"))) }) }) @@ -138,7 +139,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, 99, 456, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) @@ -152,7 +153,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, 21, 456, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) @@ -164,7 +165,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { It("returns an error indicating no workspace plans are available", func() { mockClient.EXPECT().ListWorkspacePlans().Return([]api.WorkspacePlan{}, nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("no workspace plans available"))) }) }) @@ -176,13 +177,14 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, teamIdInt, 42, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) It("completes successfully with all steps", func() { mockFullTestRun(mockClient, teamIdInt, planIdInt, 789) - err := c.RunSmoketest() + + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) @@ -194,7 +196,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { (*string)(nil), // empty workspace ).Return(0, fmt.Errorf("create failed")).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to create workspace"))) }) @@ -218,7 +220,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceID, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to set environment variable"))) }) @@ -248,7 +250,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to create ci.yml"))) }) @@ -291,7 +293,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to sync landscape"))) }) @@ -340,7 +342,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to start pipeline"))) }) @@ -394,7 +396,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("unexpected state"))) }) @@ -448,7 +450,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("unexpected state"))) }) @@ -501,7 +503,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { ).Return(nil).Once() opts.Timeout = 100 * time.Millisecond - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("timed out"))) Expect(err).To(MatchError(ContainSubstring("connection refused"))) }) @@ -558,7 +560,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { ).Return(nil).Once() opts.Timeout = 100 * time.Millisecond - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("timed out"))) }) @@ -614,7 +616,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(fmt.Errorf("delete failed")).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to delete workspace"))) }) @@ -634,7 +636,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { "smoketest", ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) diff --git a/cli/cmd/codesphere/status_codesphere.go b/cli/cmd/codesphere/status_codesphere.go new file mode 100644 index 000000000..23e32d9bf --- /dev/null +++ b/cli/cmd/codesphere/status_codesphere.go @@ -0,0 +1,87 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "fmt" + "time" + + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/spf13/cobra" +) + +const ( + defaultStatusTimeout = 5 * time.Minute + statusPollInterval = 5 * time.Second +) + +// StatusCodesphereOpts configures the status report of a Codesphere installation. +type StatusCodesphereOpts struct { + BaseURL string + Token string + Wait bool + Timeout time.Duration + Client codesphere.Client +} + +// StatusCodesphereCmd represents the status codesphere command. +type StatusCodesphereCmd struct { + cmd *cobra.Command + Opts *StatusCodesphereOpts +} + +// RunE prints the status report and fails the command if the installation is not ready. +func (c *StatusCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { + client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) + if err != nil { + return fmt.Errorf("failed to create Codesphere client: %w", err) + } + + c.Opts.Client = client + + report := fetchStatus(cmd.Context(), c.Opts) + printStatus(cmd.OutOrStdout(), c.Opts.BaseURL, report) + + if !report.Ready { + return fmt.Errorf("codesphere installation is not ready") + } + + return nil +} + +// AddStatusCmd adds the status codesphere command to the given parent command. +func AddStatusCmd(parent *cobra.Command, _ *util.GlobalOptions) { + c := StatusCodesphereCmd{ + cmd: &cobra.Command{ + Use: "codesphere", + Short: "Check the status of a Codesphere installation", + Long: csio.Long(`Check whether a Codesphere installation is reachable and ready to use, + by querying the Codesphere API.`), + Example: util.FormatExamples("status codesphere", []csio.Example{ + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN", + Desc: "Check the status of a Codesphere installation", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait", + Desc: "Block and retry until the Codesphere installation is ready", + }, + }), + }, + Opts: &StatusCodesphereOpts{}, + } + c.cmd.Flags().StringVar(&c.Opts.BaseURL, "baseurl", "", "Base URL of the Codesphere API") + c.cmd.Flags().StringVar(&c.Opts.Token, "token", "", "API token for authentication") + c.cmd.Flags().BoolVar(&c.Opts.Wait, "wait", false, "Block and retry until the installation is ready") + c.cmd.Flags().DurationVar(&c.Opts.Timeout, "timeout", defaultStatusTimeout, "Timeout when waiting for the installation to become ready") + + util.MarkFlagRequired(c.cmd, "baseurl") + util.MarkFlagRequired(c.cmd, "token") + + c.cmd.RunE = c.RunE + + util.AddCmd(parent, c.cmd) +} diff --git a/cli/cmd/codesphere/status_report.go b/cli/cmd/codesphere/status_report.go new file mode 100644 index 000000000..5ad8eb580 --- /dev/null +++ b/cli/cmd/codesphere/status_report.go @@ -0,0 +1,155 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "context" + "fmt" + "io" + "net/url" + "strings" + "time" +) + +const ( + ansiReset = "\x1b[0m" + ansiBold = "\x1b[1m" + ansiCyan = "\x1b[36m" + ansiGreen = "\x1b[32m" + ansiRed = "\x1b[31m" +) + +// logo is a small ASCII mark printed next to the status report, neofetch-style. +var logo = []string{ + " ▄▄▄▄▄▄▄▄▄▄▄▄ ", + " ▄█████████████████▄ ", + " ▄███▀▀▀ ▀▀▀███▄ ", + "███ ████", + "██ ▄▄▄▄▄▄▄▄▄ ███", + "██ ███████████ ███", + "██ ███████████ ███", + "██ ▀▀▀▀▀▀▀▀▀ ███", + "████ ████", + " ▀███▄▄▄ ▄▄▄███▀ ", + " ▀██████████████████▀ ", + " ▀▀▀▀▀▀▀▀▀▀▀▀ ", +} + +type statusReport struct { + Ready bool + Latency time.Duration + Teams int + Plans int + Attempts int + Err error +} + +// fetchStatus pings the Codesphere API with a cheap, side-effect-free call +// (ListWorkspacePlans) to determine readiness. With Wait set, it retries on +// failure until the installation becomes ready or opts.Timeout elapses. +func fetchStatus(ctx context.Context, opts *StatusCodesphereOpts) *statusReport { + ctx, cancel := context.WithTimeout(ctx, opts.Timeout) + defer cancel() + + report := &statusReport{} + for { + report.Attempts++ + + start := time.Now() + plans, err := opts.Client.ListWorkspacePlans() + report.Latency = time.Since(start) + + if err == nil { + report.Ready = true + + report.Plans = len(plans) + if teams, terr := opts.Client.ListTeams(""); terr == nil { + report.Teams = len(teams) + } + + return report + } + + report.Err = err + + if !opts.Wait { + return report + } + + select { + case <-ctx.Done(): + return report + case <-time.After(statusPollInterval): + } + } +} + +// printStatus renders a neofetch-style report: a small ASCII logo alongside +// key/value status lines. +func printStatus(w io.Writer, baseURL string, r *statusReport) { + host := baseURL + if u, err := url.Parse(baseURL); err == nil && u.Host != "" { + host = u.Host + } + + statusColor, statusText := ansiGreen, "Ready" + if !r.Ready { + statusColor, statusText = ansiRed, "Not Ready" + } + + header := fmt.Sprintf("%s%scodesphere%s@%s", ansiBold, ansiCyan, ansiReset, host) + rule := strings.Repeat("-", len("codesphere@")+len(host)) + + lines := []string{ + header, + rule, + fmt.Sprintf("%sStatus%s: %s%s%s", ansiBold, ansiReset, statusColor, statusText, ansiReset), + fmt.Sprintf("%sLatency%s: %s", ansiBold, ansiReset, r.Latency.Round(time.Millisecond)), + } + if r.Ready { + lines = append(lines, + fmt.Sprintf("%sTeams%s: %d", ansiBold, ansiReset, r.Teams), + fmt.Sprintf("%sPlans%s: %d", ansiBold, ansiReset, r.Plans), + ) + } else { + lines = append(lines, fmt.Sprintf("%sError%s: %s", ansiBold, ansiReset, r.Err)) + } + + if r.Attempts > 1 { + lines = append(lines, fmt.Sprintf("%sAttempts%s: %d", ansiBold, ansiReset, r.Attempts)) + } + + rows := len(logo) + if len(lines) > rows { + rows = len(lines) + } + + // Pad the logo to a fixed width so the status lines form a straight column. + logoWidth := 0 + for _, l := range logo { + if n := len([]rune(l)); n > logoWidth { + logoWidth = n + } + } + + _, _ = fmt.Fprintln(w) + + for i := 0; i < rows; i++ { + logoLine := "" + if i < len(logo) { + logoLine = logo[i] + } + + logoLine += strings.Repeat(" ", logoWidth-len([]rune(logoLine))) + + statLine := "" + if i < len(lines) { + statLine = lines[i] + } + + _, _ = fmt.Fprintf(w, " %s%s%s %s\n", ansiCyan, logoLine, ansiReset, statLine) + } + + _, _ = fmt.Fprintln(w) +} diff --git a/cli/cmd/codesphere/test_codesphere.go b/cli/cmd/codesphere/test_codesphere.go new file mode 100644 index 000000000..d4394ac59 --- /dev/null +++ b/cli/cmd/codesphere/test_codesphere.go @@ -0,0 +1,249 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "context" + "fmt" + "io" + "strings" + "time" + + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" + "github.com/codesphere-cloud/oms/internal/codesphere/teststeps" + "github.com/spf13/cobra" +) + +const ( + // defaultTestTimeout bounds the whole playlist, not a single test. + defaultTestTimeout = 20 * time.Minute + // DefaultPlaylist is run when neither --playlist nor --tests is given. + DefaultPlaylist = "default" +) + +// Names of the tests that can be part of a playlist. +const ( + StatusTestName = "status" + SmoketestTestName = "smoketest" +) + +// TestCodesphereOpts configures a test run against a Codesphere installation. +type TestCodesphereOpts struct { + BaseURL string + Token string + TeamID string + PlanID string + Profile string + Playlist string + Tests []string + Wait bool + WaitTimeout time.Duration + Timeout time.Duration + FailFast bool + Quiet bool + Client codesphere.Client +} + +// TestCodesphereCmd represents the test codesphere command. +type TestCodesphereCmd struct { + cmd *cobra.Command + Opts *TestCodesphereOpts +} + +// Registry returns the tests that can run against a Codesphere installation, +// together with the playlists that group them. The tests close over opts, so +// the registry has to be built after the flags are parsed and the client is +// set. Building it with zero options is safe as long as no test is run, which +// is what the test list command does. +func Registry(opts *TestCodesphereOpts) *testplan.Registry { + statusTest := &testplan.Func{ + TestName: StatusTestName, + Desc: "Report the state of the installation and verify the API answers", + Fn: func(ctx context.Context, out io.Writer) error { + waitTimeout := opts.WaitTimeout + if waitTimeout <= 0 { + waitTimeout = defaultStatusTimeout + } + + statusOpts := &StatusCodesphereOpts{ + BaseURL: opts.BaseURL, + Token: opts.Token, + Wait: opts.Wait, + Timeout: waitTimeout, + Client: opts.Client, + } + + report := fetchStatus(ctx, statusOpts) + printStatus(out, opts.BaseURL, report) + + if !report.Ready { + if report.Err != nil { + return fmt.Errorf("codesphere installation is not ready: %w", report.Err) + } + + return fmt.Errorf("codesphere installation is not ready") + } + + return nil + }, + } + + smoketest := &testplan.Func{ + TestName: SmoketestTestName, + Desc: "Create a workspace, deploy a sample app in it and clean up afterwards", + Fn: func(ctx context.Context, _ io.Writer) error { + c := SmoketestCodesphereCmd{ + Opts: &teststeps.SmoketestCodesphereOpts{ + BaseURL: opts.BaseURL, + Token: opts.Token, + TeamID: opts.TeamID, + PlanID: opts.PlanID, + Profile: opts.Profile, + Quiet: opts.Quiet, + Timeout: opts.Timeout, + Client: opts.Client, + }, + } + + return c.RunSmoketest(ctx) + }, + } + + registry := testplan.NewRegistry(statusTest, smoketest) + registry.AddPlaylist(testplan.Playlist{ + Name: DefaultPlaylist, + Description: "Verify the installation is up and can run a workspace", + Tests: []string{StatusTestName, SmoketestTestName}, + }) + registry.AddPlaylist(testplan.Playlist{ + Name: "readiness", + Description: "Only check that the installation is reachable and ready", + Tests: []string{StatusTestName}, + }) + + return registry +} + +// selectTests resolves the requested tests. An explicit --tests selection wins +// over --playlist, so a playlist default doesn't have to be unset first. +func (c *TestCodesphereCmd) selectTests() ([]testplan.Test, error) { + registry := Registry(c.Opts) + + if len(c.Opts.Tests) > 0 { + tests, err := registry.Select(c.Opts.Tests) + if err != nil { + return nil, fmt.Errorf("failed to select tests: %w", err) + } + + return tests, nil + } + + tests, err := registry.SelectPlaylist(c.Opts.Playlist) + if err != nil { + return nil, fmt.Errorf("failed to select playlist: %w", err) + } + + return tests, nil +} + +// RunE runs the selected tests and fails the command if any of them failed. +func (c *TestCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { + tests, err := c.selectTests() + if err != nil { + return err + } + + client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) + if err != nil { + return fmt.Errorf("failed to create Codesphere client: %w", err) + } + + c.Opts.Client = client + + ctx, cancel := context.WithTimeout(cmd.Context(), c.Opts.Timeout) + defer cancel() + + out := cmd.OutOrStdout() + runner := &testplan.Runner{ + Out: out, + FailFast: c.Opts.FailFast, + Quiet: c.Opts.Quiet, + } + + results := runner.Run(ctx, tests) + testplan.Summarize(out, results) + + if err := testplan.Err(results); err != nil { + return fmt.Errorf("test run failed: %w", err) + } + + return nil +} + +// AddTestCmd adds the test codesphere command to the given parent command. +func AddTestCmd(parent *cobra.Command, _ *util.GlobalOptions) { + registry := Registry(&TestCodesphereOpts{}) + + c := TestCodesphereCmd{ + cmd: &cobra.Command{ + Use: "codesphere", + Short: "Run a playlist of tests against a Codesphere installation", + Long: csio.Long(`Run a playlist of tests against a Codesphere installation. + + A playlist is an ordered selection of tests, for example a status report + followed by a smoke test. Every test is run even if an earlier one failed, + unless --fail-fast is set, and the results are summarized at the end. + + Run 'oms test list' to see the available tests and playlists.`), + Example: util.FormatExamples("test codesphere", []csio.Example{ + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN", + Desc: fmt.Sprintf("Run the %q playlist against a Codesphere installation", DefaultPlaylist), + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --playlist readiness", + Desc: "Run a specific playlist", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --tests status,smoketest", + Desc: "Run a specific list of tests, in the given order", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait", + Desc: "Wait for the installation to become ready before running the remaining tests", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --fail-fast", + Desc: "Stop at the first failing test instead of running the whole playlist", + }, + }), + }, + Opts: &TestCodesphereOpts{}, + } + + c.cmd.Flags().StringVar(&c.Opts.BaseURL, "baseurl", "", "Base URL of the Codesphere API") + c.cmd.Flags().StringVar(&c.Opts.Token, "token", "", "API token for authentication") + c.cmd.Flags().StringVar(&c.Opts.TeamID, "team-id", "", "Team ID to run tests in") + c.cmd.Flags().StringVar(&c.Opts.PlanID, "plan-id", "", "Plan ID to use for workspaces created by tests") + c.cmd.Flags().StringVar(&c.Opts.Profile, "profile", defaultProfile, "CI profile to use for landscape and pipeline") + c.cmd.Flags().StringVar(&c.Opts.Playlist, "playlist", DefaultPlaylist, + fmt.Sprintf("Playlist of tests to run (%s)", strings.Join(registry.PlaylistNames(), ","))) + c.cmd.Flags().StringSliceVar(&c.Opts.Tests, "tests", []string{}, + fmt.Sprintf("Comma-separated list of tests to run, in the given order (%s). Takes precedence over --playlist.", strings.Join(registry.TestNames(), ","))) + c.cmd.Flags().BoolVar(&c.Opts.Wait, "wait", false, "Wait for the installation to become ready during the status test") + c.cmd.Flags().DurationVar(&c.Opts.WaitTimeout, "wait-timeout", defaultStatusTimeout, "Timeout when waiting for the installation to become ready") + c.cmd.Flags().DurationVar(&c.Opts.Timeout, "timeout", defaultTestTimeout, "Timeout for the entire test run") + c.cmd.Flags().BoolVar(&c.Opts.FailFast, "fail-fast", false, "Skip the remaining tests after the first failure") + c.cmd.Flags().BoolVarP(&c.Opts.Quiet, "quiet", "q", false, "Suppress progress logging") + + util.MarkFlagRequired(c.cmd, "baseurl") + util.MarkFlagRequired(c.cmd, "token") + + c.cmd.RunE = c.RunE + + util.AddCmd(parent, c.cmd) +} diff --git a/cli/cmd/codesphere/test_codesphere_test.go b/cli/cmd/codesphere/test_codesphere_test.go new file mode 100644 index 000000000..0c88515aa --- /dev/null +++ b/cli/cmd/codesphere/test_codesphere_test.go @@ -0,0 +1,144 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere_test + +import ( + "bytes" + "context" + "fmt" + "time" + + "github.com/codesphere-cloud/cs-go/api" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + intcs "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" +) + +var _ = Describe("TestCodesphereCmd", func() { + var ( + mockClient *intcs.MockClient + opts *codesphere.TestCodesphereOpts + out *bytes.Buffer + runner *testplan.Runner + ) + + BeforeEach(func() { + mockClient = intcs.NewMockClient(GinkgoT()) + out = &bytes.Buffer{} + opts = &codesphere.TestCodesphereOpts{ + BaseURL: "https://test.codesphere.com/api", + Token: "test-token", + TeamID: "123", + PlanID: "456", + Profile: "ci.yml", + Quiet: true, // Suppress log output in tests + Timeout: time.Minute, + WaitTimeout: time.Minute, + Client: mockClient, + } + runner = &testplan.Runner{Out: out, Quiet: true} + }) + + AfterEach(func() { + mockClient.AssertExpectations(GinkgoT()) + }) + + expectHealthyStatus := func() { + mockClient.EXPECT().ListWorkspacePlans().Return([]api.WorkspacePlan{{Id: 456, Title: "small"}}, nil).Once() + mockClient.EXPECT().ListTeams("").Return([]api.Team{{Id: 123, Name: "team"}}, nil).Once() + } + + Describe("Registry", func() { + It("offers the status and smoketest tests", func() { + registry := codesphere.Registry(opts) + + Expect(registry.TestNames()).To(ContainElements( + codesphere.StatusTestName, + codesphere.SmoketestTestName, + )) + }) + + It("runs the status test before the smoketest in the default playlist", func() { + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(2)) + Expect(tests[0].Name()).To(Equal(codesphere.StatusTestName)) + Expect(tests[1].Name()).To(Equal(codesphere.SmoketestTestName)) + }) + + It("offers a readiness playlist that only checks the status", func() { + tests, err := codesphere.Registry(opts).SelectPlaylist("readiness") + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(1)) + Expect(tests[0].Name()).To(Equal(codesphere.StatusTestName)) + }) + }) + + Describe("status test", func() { + var tests []testplan.Test + + JustBeforeEach(func() { + var err error + + tests, err = codesphere.Registry(opts).Select([]string{codesphere.StatusTestName}) + Expect(err).NotTo(HaveOccurred()) + }) + + It("passes and reports the installation state if the API answers", func() { + expectHealthyStatus() + + results := runner.Run(context.Background(), tests) + + Expect(testplan.Err(results)).To(BeNil()) + Expect(out.String()).To(ContainSubstring("test.codesphere.com")) + Expect(out.String()).To(ContainSubstring("Ready")) + }) + + It("fails if the installation is not reachable", func() { + mockClient.EXPECT().ListWorkspacePlans().Return(nil, fmt.Errorf("connection refused")).Once() + + results := runner.Run(context.Background(), tests) + + Expect(results[0].Status).To(Equal(testplan.StatusFailed)) + Expect(results[0].Err).To(MatchError(ContainSubstring("not ready"))) + Expect(results[0].Err).To(MatchError(ContainSubstring("connection refused"))) + }) + }) + + Describe("default playlist", func() { + It("passes if the installation is ready and the smoketest succeeds", func() { + expectHealthyStatus() + mockFullTestRun(mockClient, 123, 456, 789) + + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + Expect(err).NotTo(HaveOccurred()) + + results := runner.Run(context.Background(), tests) + + Expect(testplan.Err(results)).To(BeNil()) + Expect(results).To(HaveLen(2)) + }) + + It("skips the smoketest if the status test fails with fail-fast", func() { + mockClient.EXPECT().ListWorkspacePlans().Return(nil, fmt.Errorf("connection refused")).Once() + + runner.FailFast = true + + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + Expect(err).NotTo(HaveOccurred()) + + results := runner.Run(context.Background(), tests) + + Expect(results[0].Status).To(Equal(testplan.StatusFailed)) + Expect(results[1].Name).To(Equal(codesphere.SmoketestTestName)) + Expect(results[1].Status).To(Equal(testplan.StatusSkipped)) + Expect(testplan.Err(results)).To(MatchError(ContainSubstring("status"))) + }) + }) +}) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 591b1c8b0..47814a597 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -74,6 +74,10 @@ func GetRootCmd() *cobra.Command { // Smoke test commands AddSmoketestCmd(rootCmd, opts) + // Status and test commands + AddStatusCmd(rootCmd, opts) + AddTestCmd(rootCmd, opts) + // Resource creation commands AddCreateCmd(rootCmd, opts) diff --git a/cli/cmd/status.go b/cli/cmd/status.go new file mode 100644 index 000000000..878760db0 --- /dev/null +++ b/cli/cmd/status.go @@ -0,0 +1,30 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/spf13/cobra" +) + +// StatusCmd represents the status command +type StatusCmd struct { + cmd *cobra.Command +} + +// AddStatusCmd adds the status command and its subcommands to the root command. +func AddStatusCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { + status := StatusCmd{ + cmd: &cobra.Command{ + Use: "status", + Short: "Check the status of Codesphere components", + Long: io.Long(`Check whether Codesphere installations or components are up and ready.`), + }, + } + util.AddCmd(rootCmd, status.cmd) + + codesphere.AddStatusCmd(status.cmd, opts) +} diff --git a/cli/cmd/test.go b/cli/cmd/test.go new file mode 100644 index 000000000..0e60c6510 --- /dev/null +++ b/cli/cmd/test.go @@ -0,0 +1,63 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/spf13/cobra" +) + +// TestCmd represents the test command +type TestCmd struct { + cmd *cobra.Command +} + +// TestListCmd represents the test list command +type TestListCmd struct { + cmd *cobra.Command +} + +// AddTestCmd adds the test command and its subcommands to the root command. +func AddTestCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { + test := TestCmd{ + cmd: &cobra.Command{ + Use: "test", + Short: "Run playlists of tests against Codesphere components", + Long: io.Long(`Run playlists of tests against Codesphere components. + + A playlist bundles individual tests, such as a status report or a smoke test, + into a single run with a summarized result.`), + }, + } + util.AddCmd(rootCmd, test.cmd) + + codesphere.AddTestCmd(test.cmd, opts) + AddTestListCmd(test.cmd) +} + +// AddTestListCmd adds the test list command to the given parent command. +func AddTestListCmd(parent *cobra.Command) { + list := TestListCmd{ + cmd: &cobra.Command{ + Use: "list", + Short: "List the available tests and playlists", + Long: io.Long(`List the tests that can be run against a Codesphere installation and the playlists that group them.`), + Example: util.FormatExamples("test list", []io.Example{ + { + Cmd: "", + Desc: "List the available tests and playlists", + }, + }), + }, + } + + list.cmd.RunE = func(cmd *cobra.Command, _ []string) error { + codesphere.Registry(&codesphere.TestCodesphereOpts{}).Describe(cmd.OutOrStdout()) + return nil + } + + util.AddCmd(parent, list.cmd) +} diff --git a/docs/README.md b/docs/README.md index dbbe2f036..7ed3c1788 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,7 +29,9 @@ like downloading new versions. * [oms register](oms_register.md) - Register a new API key * [oms revoke](oms_revoke.md) - Revoke resources available through OMS * [oms smoketest](oms_smoketest.md) - Run smoke tests for Codesphere components +* [oms status](oms_status.md) - Check the status of Codesphere components * [oms template](oms_template.md) - Render OMS configuration templates +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components * [oms update](oms_update.md) - Update OMS related resources * [oms version](oms_version.md) - Print version diff --git a/internal/codesphere/testplan/testplan.go b/internal/codesphere/testplan/testplan.go new file mode 100644 index 000000000..fdc1fe42c --- /dev/null +++ b/internal/codesphere/testplan/testplan.go @@ -0,0 +1,347 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package testplan runs ordered playlists of tests against a Codesphere +// installation and reports their results. +// +// A Test is a single, self-contained check (for example a status report or a +// smoke test). A Playlist is a named, ordered selection of those tests, so +// operators can run a well-known set of checks with a single command. +package testplan + +import ( + "context" + "errors" + "fmt" + "io" + "slices" + "strings" + "text/tabwriter" + "time" +) + +const ( + // ANSI color codes + colorGreen = "\033[32m" + colorRed = "\033[31m" + colorYellow = "\033[33m" + colorBold = "\033[1m" + colorReset = "\033[0m" +) + +// Status is the outcome of a single test run. +type Status string + +// The outcomes a test can have. A test that was not run at all, because an +// earlier test failed or the run was cancelled, is skipped. +const ( + StatusPassed Status = "PASS" + StatusFailed Status = "FAIL" + StatusSkipped Status = "SKIP" +) + +func (s Status) colored() string { + switch s { + case StatusPassed: + return colorGreen + string(s) + colorReset + case StatusFailed: + return colorRed + string(s) + colorReset + default: + return colorYellow + string(s) + colorReset + } +} + +// Test is a single, independently runnable check of a Codesphere installation. +type Test interface { + Name() string + Description() string + Run(ctx context.Context, out io.Writer) error +} + +// Func adapts a plain function into a Test. +type Func struct { + TestName string + Desc string + Fn func(ctx context.Context, out io.Writer) error +} + +// Name returns the name the test is selected by. +func (f *Func) Name() string { return f.TestName } + +// Description returns what the test does, as shown in listings and progress logs. +func (f *Func) Description() string { return f.Desc } + +// Run executes the wrapped function. +func (f *Func) Run(ctx context.Context, out io.Writer) error { + return f.Fn(ctx, out) +} + +// Result records the outcome of a single test. +type Result struct { + Name string + Status Status + Duration time.Duration + Err error +} + +// Playlist is a named, ordered selection of tests. +type Playlist struct { + Name string + Description string + Tests []string +} + +// Registry holds the tests that can be run and the playlists that select them. +type Registry struct { + tests []Test + playlists []Playlist +} + +// NewRegistry returns a registry of the given tests, in the order they are +// passed. Tests keep that order unless a playlist specifies a different one. +func NewRegistry(tests ...Test) *Registry { + return &Registry{tests: tests} +} + +// AddPlaylist registers a named selection of tests. +func (r *Registry) AddPlaylist(p Playlist) { + r.playlists = append(r.playlists, p) +} + +// Tests returns all registered tests. +func (r *Registry) Tests() []Test { + return slices.Clone(r.tests) +} + +// Playlists returns all registered playlists. +func (r *Registry) Playlists() []Playlist { + return slices.Clone(r.playlists) +} + +// TestNames returns the names of all registered tests, in registration order. +func (r *Registry) TestNames() []string { + names := make([]string, 0, len(r.tests)) + for _, t := range r.tests { + names = append(names, t.Name()) + } + + return names +} + +// PlaylistNames returns the names of all registered playlists. +func (r *Registry) PlaylistNames() []string { + names := make([]string, 0, len(r.playlists)) + for _, p := range r.playlists { + names = append(names, p.Name) + } + + return names +} + +// Select resolves test names to tests, keeping the requested order. Unknown +// names are reported instead of silently ignored, so a typo doesn't quietly +// shrink the test run. +func (r *Registry) Select(names []string) ([]Test, error) { + if len(names) == 0 { + return nil, errors.New("no tests selected") + } + + byName := make(map[string]Test, len(r.tests)) + for _, t := range r.tests { + byName[t.Name()] = t + } + + selected := make([]Test, 0, len(names)) + + var unknown []string + + for _, name := range names { + test, ok := byName[name] + if !ok { + unknown = append(unknown, name) + continue + } + + if slices.ContainsFunc(selected, func(t Test) bool { return t.Name() == name }) { + continue + } + + selected = append(selected, test) + } + + if len(unknown) > 0 { + return nil, fmt.Errorf("unknown test(s) %s, available tests are %s", + strings.Join(unknown, ","), strings.Join(r.TestNames(), ",")) + } + + return selected, nil +} + +// SelectPlaylist resolves a playlist name to the tests it contains. +func (r *Registry) SelectPlaylist(name string) ([]Test, error) { + idx := slices.IndexFunc(r.playlists, func(p Playlist) bool { return p.Name == name }) + if idx < 0 { + return nil, fmt.Errorf("unknown playlist %q, available playlists are %s", + name, strings.Join(r.PlaylistNames(), ",")) + } + + tests, err := r.Select(r.playlists[idx].Tests) + if err != nil { + return nil, fmt.Errorf("playlist %q: %w", name, err) + } + + return tests, nil +} + +// Describe writes the available tests and playlists in a human readable form. +func (r *Registry) Describe(w io.Writer) { + tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) + + printf(tw, "%sTests%s\n", colorBold, colorReset) + + for _, t := range r.tests { + printf(tw, " %s\t%s\n", t.Name(), t.Description()) + } + + printf(tw, "\n%sPlaylists%s\n", colorBold, colorReset) + + for _, p := range r.playlists { + printf(tw, " %s\t%s\t[%s]\n", p.Name, p.Description, strings.Join(p.Tests, ", ")) + } + + //nolint:errcheck // flushing to the command's output stream, nothing to recover from + tw.Flush() +} + +// Runner executes tests in order and reports what happened. +type Runner struct { + // Out receives both the progress log and the output of the tests themselves. + Out io.Writer + // FailFast skips the remaining tests as soon as one fails. + FailFast bool + // Quiet suppresses the per-test progress log, but not the summary. + Quiet bool +} + +// Run executes the tests in order and returns one result per test. Tests that +// are not run (because of a failure with FailFast, or an expired context) are +// reported as skipped, so the result list always covers the full playlist. +func (r *Runner) Run(ctx context.Context, tests []Test) []Result { + results := make([]Result, 0, len(tests)) + + for i, test := range tests { + if err := ctx.Err(); err != nil { + results = append(results, skipRemaining(tests[i:], fmt.Errorf("test run aborted: %w", err))...) + break + } + + r.logf("\n%s▶ %s%s: %s\n", colorBold, test.Name(), colorReset, test.Description()) + + start := time.Now() + err := test.Run(ctx, r.Out) + result := Result{Name: test.Name(), Duration: time.Since(start), Err: err} + + result.Status = StatusPassed + if err != nil { + result.Status = StatusFailed + } + + results = append(results, result) + + r.logf("%s %s (%s)\n", test.Name(), result.Status.colored(), formatDuration(result.Duration)) + + if err != nil && r.FailFast { + results = append(results, skipRemaining(tests[i+1:], errors.New("skipped after earlier failure"))...) + break + } + } + + return results +} + +func (r *Runner) logf(format string, args ...any) { + if r.Quiet || r.Out == nil { + return + } + + printf(r.Out, format, args...) +} + +func skipRemaining(tests []Test, reason error) []Result { + skipped := make([]Result, 0, len(tests)) + for _, t := range tests { + skipped = append(skipped, Result{Name: t.Name(), Status: StatusSkipped, Err: reason}) + } + + return skipped +} + +// Summarize writes a table of results followed by a one line tally. +func Summarize(w io.Writer, results []Result) { + var ( + passed, failed, skipped int + total time.Duration + ) + for _, res := range results { + total += res.Duration + switch res.Status { + case StatusPassed: + passed++ + case StatusFailed: + failed++ + default: + skipped++ + } + } + + printf(w, "\n%sTest results%s\n", colorBold, colorReset) + + tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0) + + for _, res := range results { + detail := "" + if res.Err != nil { + detail = res.Err.Error() + } + + printf(tw, " %s\t%s\t%s\t%s\n", res.Status.colored(), res.Name, formatDuration(res.Duration), detail) + } + //nolint:errcheck // flushing to the command's output stream, nothing to recover from + tw.Flush() + + printf(w, "\n%d test(s): %d passed, %d failed, %d skipped in %s\n", + len(results), passed, failed, skipped, formatDuration(total)) +} + +// Err aggregates the failures of a test run into a single error, or returns +// nil if nothing failed. +func Err(results []Result) error { + var failed []string + + for _, res := range results { + if res.Status == StatusFailed { + failed = append(failed, res.Name) + } + } + + if len(failed) == 0 { + return nil + } + + return fmt.Errorf("%d of %d test(s) failed: %s", len(failed), len(results), strings.Join(failed, ",")) +} + +// printf writes to the report output. Write errors are ignored: the output is +// the operator's terminal, and there is no fallback to report them on. +func printf(w io.Writer, format string, args ...any) { + //nolint:errcheck // see above + fmt.Fprintf(w, format, args...) +} + +func formatDuration(d time.Duration) string { + if d < time.Second { + return d.Round(time.Millisecond).String() + } + + return d.Round(100 * time.Millisecond).String() +} diff --git a/internal/codesphere/testplan/testplan_suite_test.go b/internal/codesphere/testplan/testplan_suite_test.go new file mode 100644 index 000000000..fbe3f880b --- /dev/null +++ b/internal/codesphere/testplan/testplan_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package testplan_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestTestplan(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Testplan Suite") +} diff --git a/internal/codesphere/testplan/testplan_test.go b/internal/codesphere/testplan/testplan_test.go new file mode 100644 index 000000000..987988ea2 --- /dev/null +++ b/internal/codesphere/testplan/testplan_test.go @@ -0,0 +1,235 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package testplan_test + +import ( + "bytes" + "context" + "fmt" + "io" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" +) + +// recordingTest records that it ran and returns a fixed error. +type recordingTest struct { + name string + err error + ran *[]string +} + +func (t *recordingTest) Name() string { return t.name } +func (t *recordingTest) Description() string { return t.name + " description" } + +func (t *recordingTest) Run(_ context.Context, out io.Writer) error { + *t.ran = append(*t.ran, t.name) + _, _ = fmt.Fprintf(out, "output of %s\n", t.name) + + return t.err +} + +var _ = Describe("Testplan", func() { + var ( + ran []string + out *bytes.Buffer + passes *recordingTest + fails *recordingTest + second *recordingTest + ) + + newTest := func(name string, err error) *recordingTest { + return &recordingTest{name: name, err: err, ran: &ran} + } + + BeforeEach(func() { + ran = []string{} + out = &bytes.Buffer{} + passes = newTest("passes", nil) + fails = newTest("fails", fmt.Errorf("boom")) + second = newTest("second", nil) + }) + + Describe("Registry", func() { + var registry *testplan.Registry + + BeforeEach(func() { + registry = testplan.NewRegistry(passes, fails, second) + registry.AddPlaylist(testplan.Playlist{ + Name: "default", + Tests: []string{"fails", "passes"}, + }) + }) + + It("lists tests and playlists in registration order", func() { + Expect(registry.TestNames()).To(Equal([]string{"passes", "fails", "second"})) + Expect(registry.PlaylistNames()).To(Equal([]string{"default"})) + }) + + It("selects tests in the requested order", func() { + tests, err := registry.Select([]string{"second", "passes"}) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(2)) + Expect(tests[0].Name()).To(Equal("second")) + Expect(tests[1].Name()).To(Equal("passes")) + }) + + It("ignores duplicates in a selection", func() { + tests, err := registry.Select([]string{"passes", "passes"}) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(1)) + }) + + It("reports unknown test names", func() { + _, err := registry.Select([]string{"passes", "nope"}) + + Expect(err).To(MatchError(ContainSubstring("unknown test(s) nope"))) + Expect(err).To(MatchError(ContainSubstring("passes,fails,second"))) + }) + + It("returns an error for an empty selection", func() { + _, err := registry.Select(nil) + + Expect(err).To(MatchError(ContainSubstring("no tests selected"))) + }) + + It("resolves a playlist to its tests, keeping the playlist order", func() { + tests, err := registry.SelectPlaylist("default") + + Expect(err).NotTo(HaveOccurred()) + Expect(tests[0].Name()).To(Equal("fails")) + Expect(tests[1].Name()).To(Equal("passes")) + }) + + It("reports an unknown playlist", func() { + _, err := registry.SelectPlaylist("nope") + + Expect(err).To(MatchError(ContainSubstring(`unknown playlist "nope"`))) + Expect(err).To(MatchError(ContainSubstring("available playlists are default"))) + }) + + It("reports a playlist that references an unknown test", func() { + registry.AddPlaylist(testplan.Playlist{Name: "broken", Tests: []string{"nope"}}) + + _, err := registry.SelectPlaylist("broken") + + Expect(err).To(MatchError(ContainSubstring(`playlist "broken"`))) + Expect(err).To(MatchError(ContainSubstring("unknown test(s) nope"))) + }) + + It("describes tests and playlists", func() { + registry.Describe(out) + + Expect(out.String()).To(ContainSubstring("passes description")) + Expect(out.String()).To(ContainSubstring("default")) + Expect(out.String()).To(ContainSubstring("[fails, passes]")) + }) + }) + + Describe("Runner", func() { + var runner *testplan.Runner + + BeforeEach(func() { + runner = &testplan.Runner{Out: out} + }) + + It("runs all tests and reports their status", func() { + results := runner.Run(context.Background(), []testplan.Test{passes, fails, second}) + + Expect(ran).To(Equal([]string{"passes", "fails", "second"})) + Expect(results).To(HaveLen(3)) + Expect(results[0].Status).To(Equal(testplan.StatusPassed)) + Expect(results[1].Status).To(Equal(testplan.StatusFailed)) + Expect(results[1].Err).To(MatchError("boom")) + Expect(results[2].Status).To(Equal(testplan.StatusPassed)) + }) + + It("continues after a failure by default", func() { + runner.Run(context.Background(), []testplan.Test{fails, second}) + + Expect(ran).To(Equal([]string{"fails", "second"})) + }) + + It("skips the remaining tests with fail-fast", func() { + runner.FailFast = true + + results := runner.Run(context.Background(), []testplan.Test{fails, second}) + + Expect(ran).To(Equal([]string{"fails"})) + Expect(results).To(HaveLen(2)) + Expect(results[1].Name).To(Equal("second")) + Expect(results[1].Status).To(Equal(testplan.StatusSkipped)) + }) + + It("skips all tests when the context is already done", func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + results := runner.Run(ctx, []testplan.Test{passes, second}) + + Expect(ran).To(BeEmpty()) + Expect(results).To(HaveLen(2)) + + for _, res := range results { + Expect(res.Status).To(Equal(testplan.StatusSkipped)) + Expect(res.Err).To(MatchError(ContainSubstring("test run aborted"))) + } + }) + + It("forwards test output and logs progress", func() { + runner.Run(context.Background(), []testplan.Test{passes}) + + Expect(out.String()).To(ContainSubstring("passes description")) + Expect(out.String()).To(ContainSubstring("output of passes")) + Expect(out.String()).To(ContainSubstring("PASS")) + }) + + It("keeps test output but drops progress logging when quiet", func() { + runner.Quiet = true + + runner.Run(context.Background(), []testplan.Test{passes}) + + Expect(out.String()).To(ContainSubstring("output of passes")) + Expect(out.String()).NotTo(ContainSubstring("passes description")) + }) + }) + + Describe("Summarize", func() { + It("lists every result and tallies them", func() { + results := []testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "fails", Status: testplan.StatusFailed, Err: fmt.Errorf("boom")}, + {Name: "second", Status: testplan.StatusSkipped}, + } + + testplan.Summarize(out, results) + + Expect(out.String()).To(ContainSubstring("passes")) + Expect(out.String()).To(ContainSubstring("boom")) + Expect(out.String()).To(ContainSubstring("3 test(s): 1 passed, 1 failed, 1 skipped")) + }) + }) + + Describe("Err", func() { + It("returns nil if nothing failed", func() { + Expect(testplan.Err([]testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "second", Status: testplan.StatusSkipped}, + })).To(BeNil()) + }) + + It("names the failed tests", func() { + err := testplan.Err([]testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "fails", Status: testplan.StatusFailed}, + }) + + Expect(err).To(MatchError("1 of 2 test(s) failed: fails")) + }) + }) +}) From 937e8c14aac5cea59d117c45a8e65c84a60c810e Mon Sep 17 00:00:00 2001 From: DerBurri <7892993+DerBurri@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:25:17 +0000 Subject: [PATCH 002/132] chore(docs): Auto-update docs and licenses Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com> --- docs/oms.md | 2 ++ docs/oms_status.md | 19 +++++++++++ docs/oms_status_codesphere.md | 38 ++++++++++++++++++++++ docs/oms_test.md | 23 ++++++++++++++ docs/oms_test_codesphere.md | 60 +++++++++++++++++++++++++++++++++++ docs/oms_test_list.md | 30 ++++++++++++++++++ 6 files changed, 172 insertions(+) create mode 100644 docs/oms_status.md create mode 100644 docs/oms_status_codesphere.md create mode 100644 docs/oms_test.md create mode 100644 docs/oms_test_codesphere.md create mode 100644 docs/oms_test_list.md diff --git a/docs/oms.md b/docs/oms.md index dbbe2f036..7ed3c1788 100644 --- a/docs/oms.md +++ b/docs/oms.md @@ -29,7 +29,9 @@ like downloading new versions. * [oms register](oms_register.md) - Register a new API key * [oms revoke](oms_revoke.md) - Revoke resources available through OMS * [oms smoketest](oms_smoketest.md) - Run smoke tests for Codesphere components +* [oms status](oms_status.md) - Check the status of Codesphere components * [oms template](oms_template.md) - Render OMS configuration templates +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components * [oms update](oms_update.md) - Update OMS related resources * [oms version](oms_version.md) - Print version diff --git a/docs/oms_status.md b/docs/oms_status.md new file mode 100644 index 000000000..6183fb6ce --- /dev/null +++ b/docs/oms_status.md @@ -0,0 +1,19 @@ +## oms status + +Check the status of Codesphere components + +### Synopsis + +Check whether Codesphere installations or components are up and ready. + +### Options + +``` + -h, --help help for status +``` + +### SEE ALSO + +* [oms](oms.md) - Codesphere Operations Management System (OMS) +* [oms status codesphere](oms_status_codesphere.md) - Check the status of a Codesphere installation + diff --git a/docs/oms_status_codesphere.md b/docs/oms_status_codesphere.md new file mode 100644 index 000000000..b21f9c04f --- /dev/null +++ b/docs/oms_status_codesphere.md @@ -0,0 +1,38 @@ +## oms status codesphere + +Check the status of a Codesphere installation + +### Synopsis + +Check whether a Codesphere installation is reachable and ready to use, +by querying the Codesphere API. + +``` +oms status codesphere [flags] +``` + +### Examples + +``` +# Check the status of a Codesphere installation +$ oms status codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN + +# Block and retry until the Codesphere installation is ready +$ oms status codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait + +``` + +### Options + +``` + --baseurl string Base URL of the Codesphere API + -h, --help help for codesphere + --timeout duration Timeout when waiting for the installation to become ready (default 5m0s) + --token string API token for authentication + --wait Block and retry until the installation is ready +``` + +### SEE ALSO + +* [oms status](oms_status.md) - Check the status of Codesphere components + diff --git a/docs/oms_test.md b/docs/oms_test.md new file mode 100644 index 000000000..171cecb7b --- /dev/null +++ b/docs/oms_test.md @@ -0,0 +1,23 @@ +## oms test + +Run playlists of tests against Codesphere components + +### Synopsis + +Run playlists of tests against Codesphere components. + +A playlist bundles individual tests, such as a status report or a smoke test, +into a single run with a summarized result. + +### Options + +``` + -h, --help help for test +``` + +### SEE ALSO + +* [oms](oms.md) - Codesphere Operations Management System (OMS) +* [oms test codesphere](oms_test_codesphere.md) - Run a playlist of tests against a Codesphere installation +* [oms test list](oms_test_list.md) - List the available tests and playlists + diff --git a/docs/oms_test_codesphere.md b/docs/oms_test_codesphere.md new file mode 100644 index 000000000..508ebd4a0 --- /dev/null +++ b/docs/oms_test_codesphere.md @@ -0,0 +1,60 @@ +## oms test codesphere + +Run a playlist of tests against a Codesphere installation + +### Synopsis + +Run a playlist of tests against a Codesphere installation. + +A playlist is an ordered selection of tests, for example a status report +followed by a smoke test. Every test is run even if an earlier one failed, +unless --fail-fast is set, and the results are summarized at the end. + +Run 'oms test list' to see the available tests and playlists. + +``` +oms test codesphere [flags] +``` + +### Examples + +``` +# Run the "default" playlist against a Codesphere installation +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN + +# Run a specific playlist +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --playlist readiness + +# Run a specific list of tests, in the given order +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --tests status,smoketest + +# Wait for the installation to become ready before running the remaining tests +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait + +# Stop at the first failing test instead of running the whole playlist +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --fail-fast + +``` + +### Options + +``` + --baseurl string Base URL of the Codesphere API + --fail-fast Skip the remaining tests after the first failure + -h, --help help for codesphere + --plan-id string Plan ID to use for workspaces created by tests + --playlist string Playlist of tests to run (default,readiness) (default "default") + --profile string CI profile to use for landscape and pipeline (default "ci.yml") + -q, --quiet Suppress progress logging + --team-id string Team ID to run tests in + --tests strings Comma-separated list of tests to run, in the given order (status,smoketest). Takes precedence over --playlist. + --timeout duration Timeout for the entire test run (default 20m0s) + --token string API token for authentication + --wait Wait for the installation to become ready during the status test + --wait-timeout duration Timeout when waiting for the installation to become ready (default 5m0s) +``` + +### SEE ALSO + +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components + diff --git a/docs/oms_test_list.md b/docs/oms_test_list.md new file mode 100644 index 000000000..a3f00c8b9 --- /dev/null +++ b/docs/oms_test_list.md @@ -0,0 +1,30 @@ +## oms test list + +List the available tests and playlists + +### Synopsis + +List the tests that can be run against a Codesphere installation and the playlists that group them. + +``` +oms test list [flags] +``` + +### Examples + +``` +# List the available tests and playlists +$ oms test list + +``` + +### Options + +``` + -h, --help help for list +``` + +### SEE ALSO + +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components + From d09ae9ae195be749299392cdfc3dfedc65ec1ded Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 12 Aug 2026 15:10:49 +0200 Subject: [PATCH 003/132] update(deps): update github.com/rook/rook/pkg/apis digest to 483b2c0 (#681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `a4c28bc` → `483b2c0` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index e95f889cf..a49b28341 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260811210519-a4c28bc84816 +Version: v0.0.0-20260812115214-483b2c00845a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/a4c28bc84816/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/483b2c00845a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 119841a73..f88fda16c 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.0 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260811210519-a4c28bc84816 + github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a ) require ( diff --git a/go.sum b/go.sum index 2ed460f7f..ab0b1cc85 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260811210519-a4c28bc84816 h1:nyGynTLB5dkhWQ0bOy1TZZeseQshfeScH2kdootKsWA= -github.com/rook/rook/pkg/apis v0.0.0-20260811210519-a4c28bc84816/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a h1:g+j8fy7jVGsiJ0OidR0ExIPfNe/WpRNJoq5i3FK2VpU= +github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index e95f889cf..a49b28341 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260811210519-a4c28bc84816 +Version: v0.0.0-20260812115214-483b2c00845a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/a4c28bc84816/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/483b2c00845a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 2d3d6ac5c7f7f601ee24f211835042cc254a22de Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:11:38 +0200 Subject: [PATCH 004/132] update(deps): update module github.com/argoproj/argo-cd/v3 to v3.5.1 (#682) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/argoproj/argo-cd/v3](https://redirect.github.com/argoproj/argo-cd) | `v3.5.0` → `v3.5.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.0/v3.5.1?slim=true) | --- ### Release Notes
argoproj/argo-cd (github.com/argoproj/argo-cd/v3) ### [`v3.5.1`](https://redirect.github.com/argoproj/argo-cd/releases/tag/v3.5.1) [Compare Source](https://redirect.github.com/argoproj/argo-cd/compare/v3.5.0...v3.5.1) #### Quick Start ##### Non-HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.1/manifests/install.yaml ``` ##### HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.1/manifests/ha/install.yaml ``` #### Release Signatures and Provenance All Argo CD container images are signed by cosign. A Provenance is generated for container images and CLI binaries which meet the SLSA Level 3 specifications. See the [documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/signed-release-assets) on how to verify. #### Release Notes Blog Post For a detailed breakdown of the key changes and improvements in this release, check out the [official blog post](https://blog.argoproj.io/argo-cd-v3-0-release-candidate-a0b933f4e58f) #### Upgrading If upgrading from a different minor version, be sure to read the [upgrading](https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/overview/) documentation. #### Changelog ##### Bug fixes - [`33f3bc5`](https://redirect.github.com/argoproj/argo-cd/commit/33f3bc59faeec96204cda3a5ae211be17d15f1ac): fix(appset): stop progressive sync reconciling in a tight loop ([#​27577](https://redirect.github.com/argoproj/argo-cd/issues/27577)) ([#​29139](https://redirect.github.com/argoproj/argo-cd/issues/29139)) ([@​himeshp](https://redirect.github.com/himeshp)) - [`d358e75`](https://redirect.github.com/argoproj/argo-cd/commit/d358e75b3539c3fc43eb2372317bde7a0d01c55f): fix(appset): verify terminating Applications against the API server ([#​29042](https://redirect.github.com/argoproj/argo-cd/issues/29042)) ([#​29138](https://redirect.github.com/argoproj/argo-cd/issues/29138)) ([@​himeshp](https://redirect.github.com/himeshp)) - [`ecf3737`](https://redirect.github.com/argoproj/argo-cd/commit/ecf37373a9d3a72b259a73abfee7ce27226b960a): fix(controller): cherry-pick treat `timeout.reconciliation=0` as disabled soft expiry ([#​27683](https://redirect.github.com/argoproj/argo-cd/issues/27683)) ([#​29007](https://redirect.github.com/argoproj/argo-cd/issues/29007)) ([@​aali309](https://redirect.github.com/aali309)) - [`978fa65`](https://redirect.github.com/argoproj/argo-cd/commit/978fa65006565baaaf35894918fd661d610f5953): fix(controller): reuse server-side diff result when masking Secret data ([#​27858](https://redirect.github.com/argoproj/argo-cd/issues/27858)) ([#​29074](https://redirect.github.com/argoproj/argo-cd/issues/29074)) ([@​1ovsss](https://redirect.github.com/1ovsss)) - [`f399c84`](https://redirect.github.com/argoproj/argo-cd/commit/f399c84f85fc4e3a19ac1e8314ff111493d26fee): fix(controller): use diff cache when timeout.reconciliation is disabled (cherry-pick [#​29073](https://redirect.github.com/argoproj/argo-cd/issues/29073) for 3.5) ([#​29158](https://redirect.github.com/argoproj/argo-cd/issues/29158)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`960bed7`](https://redirect.github.com/argoproj/argo-cd/commit/960bed7f2efcdc8b43fe392dd6d17cf95507c9f2): fix(server): prevent SSD CLI secret mask spoofing (cherry-pick [#​29089](https://redirect.github.com/argoproj/argo-cd/issues/29089) for 3.5) ([#​29130](https://redirect.github.com/argoproj/argo-cd/issues/29130)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`9f360f4`](https://redirect.github.com/argoproj/argo-cd/commit/9f360f4953a1dc0f3474aa9c482d72366863ea33): fix(ssd): hide secret in last-applied-configuration annotation ([#​28989](https://redirect.github.com/argoproj/argo-cd/issues/28989)) ([#​29052](https://redirect.github.com/argoproj/argo-cd/issues/29052)) ([@​pjiang-dev](https://redirect.github.com/pjiang-dev)) ##### Other work - [`109ca7c`](https://redirect.github.com/argoproj/argo-cd/commit/109ca7ca71139e514114499d294a492e7910a965): chore: bump version to 3.5.1 on release-3.5 branch ([#​29165](https://redirect.github.com/argoproj/argo-cd/issues/29165)) ([@​github-actions](https://redirect.github.com/github-actions)\[bot]) - [`b44fbbc`](https://redirect.github.com/argoproj/argo-cd/commit/b44fbbc2e040e303c18a69182fd5dbe2c36cfdf9): fix(manifest-generate-paths): Consistent gen manifest cache key ([#​28074](https://redirect.github.com/argoproj/argo-cd/issues/28074) and [#​29037](https://redirect.github.com/argoproj/argo-cd/issues/29037)) ([#​29049](https://redirect.github.com/argoproj/argo-cd/issues/29049)) ([@​agaudreault](https://redirect.github.com/agaudreault)) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index a49b28341..90715fea1 100644 --- a/NOTICE +++ b/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.0 +Version: v3.5.1 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.0/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.1/LICENSE ---------- Module: github.com/argoproj/pkg/v2 diff --git a/go.mod b/go.mod index f88fda16c..b8be0f0fa 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( require ( github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/argoproj/argo-cd/v3 v3.5.0 + github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a diff --git a/go.sum b/go.sum index ab0b1cc85..00a67bfad 100644 --- a/go.sum +++ b/go.sum @@ -2920,8 +2920,8 @@ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d h1:/rO/uVUBn8ywSeYGDCXIIpKiCgxZ23+xshH+5UeuLUo= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d/go.mod h1:RsOM4gdM/lsvAfIuzAhYrnHDTLA1AGooZRzVyxbVT3A= -github.com/argoproj/argo-cd/v3 v3.5.0 h1:iqnPFSKaQ0l3hREMH2Rk55VDcxrvBFaSO0g9bifZKzc= -github.com/argoproj/argo-cd/v3 v3.5.0/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= +github.com/argoproj/argo-cd/v3 v3.5.1 h1:jtwPLEFX9mNj3jSq88ugFcScGnOZVs2DWaXFuZxrRT8= +github.com/argoproj/argo-cd/v3 v3.5.1/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= github.com/argoproj/pkg/v2 v2.0.1 h1:O/gCETzB/3+/hyFL/7d/VM/6pSOIRWIiBOTb2xqAHvc= github.com/argoproj/pkg/v2 v2.0.1/go.mod h1:sdifF6sUTx9ifs38ZaiNMRJuMpSCBB9GulHfbPgQeRE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index a49b28341..90715fea1 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.0 +Version: v3.5.1 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.0/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.1/LICENSE ---------- Module: github.com/argoproj/pkg/v2 From aaee923232a4488f133ef81d56075a20a6897a30 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 12 Aug 2026 19:10:51 +0200 Subject: [PATCH 005/132] update(deps): update github.com/rook/rook/pkg/apis digest to ce08b76 (#684) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `483b2c0` → `ce08b76` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 90715fea1..ec39bd6ec 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812115214-483b2c00845a +Version: v0.0.0-20260812153635-ce08b76998cf License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/483b2c00845a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/ce08b76998cf/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b8be0f0fa..b84d1f312 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a + github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf ) require ( diff --git a/go.sum b/go.sum index 00a67bfad..45be6ea6f 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a h1:g+j8fy7jVGsiJ0OidR0ExIPfNe/WpRNJoq5i3FK2VpU= -github.com/rook/rook/pkg/apis v0.0.0-20260812115214-483b2c00845a/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf h1:rDaJZMebi4QYPOnqIH6jU8rV+KzjyP+vtn5/uFPuV3w= +github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 90715fea1..ec39bd6ec 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812115214-483b2c00845a +Version: v0.0.0-20260812153635-ce08b76998cf License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/483b2c00845a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/ce08b76998cf/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 676731d52c7215dab354f4ab02688b868aa32125 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:10:27 +0200 Subject: [PATCH 006/132] update(deps): update github.com/rook/rook/pkg/apis digest to 87b643a (#685) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `ce08b76` → `87b643a` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index ec39bd6ec..4a6d7105a 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812153635-ce08b76998cf +Version: v0.0.0-20260812173305-87b643a74112 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/ce08b76998cf/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/87b643a74112/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b84d1f312..37d795385 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf + github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112 ) require ( diff --git a/go.sum b/go.sum index 45be6ea6f..6d8cfe57a 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf h1:rDaJZMebi4QYPOnqIH6jU8rV+KzjyP+vtn5/uFPuV3w= -github.com/rook/rook/pkg/apis v0.0.0-20260812153635-ce08b76998cf/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112 h1:XYoL5I814X9NBadkfF4VMWOQrxma/w5hOVSUJ5tZkRA= +github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index ec39bd6ec..4a6d7105a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812153635-ce08b76998cf +Version: v0.0.0-20260812173305-87b643a74112 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/ce08b76998cf/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/87b643a74112/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From c4752e58dc79e8fe1c964f90f9874abebf44645a Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 12 Aug 2026 23:15:55 +0200 Subject: [PATCH 007/132] update(deps): update github.com/rook/rook/pkg/apis digest to efb7995 (#686) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `87b643a` → `efb7995` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 4a6d7105a..c518b6314 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812173305-87b643a74112 +Version: v0.0.0-20260812192858-efb799561cab License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/87b643a74112/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/efb799561cab/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 37d795385..b8aaa0f45 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112 + github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab ) require ( diff --git a/go.sum b/go.sum index 6d8cfe57a..ef3127389 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112 h1:XYoL5I814X9NBadkfF4VMWOQrxma/w5hOVSUJ5tZkRA= -github.com/rook/rook/pkg/apis v0.0.0-20260812173305-87b643a74112/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab h1:vbY6yfOHv89ngAHWnao66Qp937TxW/E55ACDEIycb48= +github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 4a6d7105a..c518b6314 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812173305-87b643a74112 +Version: v0.0.0-20260812192858-efb799561cab License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/87b643a74112/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/efb799561cab/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 91d8baee510c2e2b089ae733fd5c267c6cc68008 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Thu, 13 Aug 2026 00:17:57 +0200 Subject: [PATCH 008/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.21.0 (#688) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.20.0` → `v1.21.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.21.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.20.0/v1.21.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.21.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.21.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.20.0...v1.21.0) #### Changelog - [`6035f38`](https://redirect.github.com/codesphere-cloud/cs-go/commit/6035f382421a3e09192244398ac33c0363a64f1a) update(deps): update module github.com/vektra/mockery/v3 to v3.7.3 ([#​303](https://redirect.github.com/codesphere-cloud/cs-go/issues/303)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 12 ++++++------ go.mod | 4 ++-- go.sum | 8 ++++---- internal/tmpl/NOTICE | 12 ++++++------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/NOTICE b/NOTICE index c518b6314..356c7ff32 100644 --- a/NOTICE +++ b/NOTICE @@ -199,7 +199,7 @@ License URL: https://github.com/beorn7/perks/blob/v1.0.1/LICENSE Module: github.com/blang/semver/v4 Version: v4.0.0 License: MIT -License URL: https://github.com/blang/semver/blob/v4.0.0/v4/LICENSE +License URL: https://github.com/blang/semver/blob/v4.0.0/LICENSE ---------- Module: github.com/bmatcuk/doublestar/v4 @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.20.0 +Version: v1.21.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.20.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.21.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -385,7 +385,7 @@ License URL: https://github.com/emirpasic/gods/blob/v1.18.1/LICENSE Module: github.com/evanphx/json-patch/v5 Version: v5.9.11 License: BSD-3-Clause -License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/v5/LICENSE +License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/LICENSE ---------- Module: github.com/exponent-io/jsonpath @@ -709,7 +709,7 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. Module: github.com/googleapis/gax-go/v2 Version: v2.23.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1471,7 +1471,7 @@ License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE Module: gomodules.xyz/jsonpatch/v2 Version: v2.5.0 License: Apache-2.0 -License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE +License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/LICENSE ---------- Module: google.golang.org/api diff --git a/go.mod b/go.mod index b8aaa0f45..c50427bf0 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( filippo.io/age v1.3.1 github.com/Masterminds/semver/v3 v3.5.0 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.20.0 + github.com/codesphere-cloud/cs-go v1.21.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/jedib0t/go-pretty/v6 v6.8.3 @@ -474,7 +474,7 @@ require ( github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.1 // indirect github.com/uudashr/iface v1.5.0 // indirect - github.com/vektra/mockery/v3 v3.7.2 // indirect + github.com/vektra/mockery/v3 v3.7.3 // indirect github.com/wagoodman/go-progress v0.0.0-20260303201901-10176f79b2c0 // indirect github.com/whyrusleeping/cbor-gen v0.3.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect diff --git a/go.sum b/go.sum index ef3127389..9f3d7e64e 100644 --- a/go.sum +++ b/go.sum @@ -3219,8 +3219,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.20.0 h1:MY4lDHxjs6a/48h6VwbatyFJjDnm5n863npipxPep2w= -github.com/codesphere-cloud/cs-go v1.20.0/go.mod h1:hnk7uN0QL0Rs5oFpQv26b5xk5n2b6opxsx/LvegZUgY= +github.com/codesphere-cloud/cs-go v1.21.0 h1:+9NQvhtGtQaZbTmV+/mSb/Dc9VwLTRZuNxXygnd9yeE= +github.com/codesphere-cloud/cs-go v1.21.0/go.mod h1:/l1HlPrs6jR93MUnMBOsFsrUUkoEB/U6Kn+kHKmqs98= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -4951,8 +4951,8 @@ github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= github.com/uudashr/iface v1.5.0 h1:PgdMt4uAettGG8K/Kbamc4B9FABgUgnS3TLbl6fnjEk= github.com/uudashr/iface v1.5.0/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= -github.com/vektra/mockery/v3 v3.7.2 h1:x4r2DwXSdOZdrs89+IKX4VS1dfJySc/YbZsrW80zMBY= -github.com/vektra/mockery/v3 v3.7.2/go.mod h1:fbChccNiUvQaUVaCHS6/7OL5/D65KljJVk31LuPPUjY= +github.com/vektra/mockery/v3 v3.7.3 h1:xL6MqWo4yDgiueMDsggt1eTNoDEkwYNQeVXN5vyaJG0= +github.com/vektra/mockery/v3 v3.7.3/go.mod h1:fbChccNiUvQaUVaCHS6/7OL5/D65KljJVk31LuPPUjY= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vmihailenco/go-tinylfu v0.2.2 h1:H1eiG6HM36iniK6+21n9LLpzx1G9R3DJa2UjUjbynsI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index c518b6314..356c7ff32 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -199,7 +199,7 @@ License URL: https://github.com/beorn7/perks/blob/v1.0.1/LICENSE Module: github.com/blang/semver/v4 Version: v4.0.0 License: MIT -License URL: https://github.com/blang/semver/blob/v4.0.0/v4/LICENSE +License URL: https://github.com/blang/semver/blob/v4.0.0/LICENSE ---------- Module: github.com/bmatcuk/doublestar/v4 @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.20.0 +Version: v1.21.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.20.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.21.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -385,7 +385,7 @@ License URL: https://github.com/emirpasic/gods/blob/v1.18.1/LICENSE Module: github.com/evanphx/json-patch/v5 Version: v5.9.11 License: BSD-3-Clause -License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/v5/LICENSE +License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/LICENSE ---------- Module: github.com/exponent-io/jsonpath @@ -709,7 +709,7 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. Module: github.com/googleapis/gax-go/v2 Version: v2.23.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1471,7 +1471,7 @@ License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE Module: gomodules.xyz/jsonpatch/v2 Version: v2.5.0 License: Apache-2.0 -License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE +License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/LICENSE ---------- Module: google.golang.org/api From e57874c85e62fd3d7994a2236fa1d9ae653fbccf Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Thu, 13 Aug 2026 11:35:07 +0200 Subject: [PATCH 009/132] feat(openfga): add the openFga block to the install config (#679) One OpenFGA instance serves a whole installation, so in a multi-data-center setup exactly one data center deploys and publishes it and the others only point at it. That is an installation-level decision rather than a chart detail, so operators express it in config.yaml: ``` codesphere: openFga: deploy: true apiUrl: https://openfga.1.cs.example.com expose: enabled: true host: openfga.1.cs.example.com ``` Validation rejects the combinations that cannot work: a data center that does not deploy OpenFGA has nowhere to fall back to and must name the instance it uses, an exposed one needs a host, and a data center cannot expose an OpenFGA it does not deploy. Nothing reads the block yet; deriving the pc-applications values from it follows separately. Signed-off-by: Jona Neef Co-authored-by: Claude Opus 5 (1M context) --- internal/installer/config_manager.go | 33 +++++++++++++++ internal/installer/config_manager_test.go | 49 +++++++++++++++++++++++ internal/installer/files/config_yaml.go | 34 ++++++++++++++++ 3 files changed, 116 insertions(+) diff --git a/internal/installer/config_manager.go b/internal/installer/config_manager.go index 8d3eacaa4..21081fb1c 100644 --- a/internal/installer/config_manager.go +++ b/internal/installer/config_manager.go @@ -230,6 +230,39 @@ func (g *InstallConfig) ValidateInstallConfig() []string { } } + errors = append(errors, validateOpenFga(g.Config.Codesphere.OpenFga)...) + + return errors +} + +// validateOpenFga checks the codesphere.openFga block. A data center that does not deploy +// OpenFGA has nowhere to fall back to, so it must name the instance it uses; a data center that +// exposes one must say under which host. +func validateOpenFga(config *files.OpenFgaConfig) []string { + if config == nil { + return nil + } + + errors := []string{} + if !config.DeploysOpenFga() && config.APIURL == "" { + errors = append(errors, "OpenFGA apiUrl is required when codesphere.openFga.deploy is false") + } + + if config.APIURL != "" { + if _, err := url.ParseRequestURI(config.APIURL); err != nil { + errors = append(errors, "OpenFGA apiUrl must be a valid URL") + } + } + + if config.ExposesOpenFga() { + if config.Expose.Host == "" { + errors = append(errors, "OpenFGA expose host is required when codesphere.openFga.expose.enabled is true") + } + + if !config.DeploysOpenFga() { + errors = append(errors, "OpenFGA cannot be exposed by a data center that does not deploy it") + } + } return errors } diff --git a/internal/installer/config_manager_test.go b/internal/installer/config_manager_test.go index 3b6830b80..8aed5c644 100644 --- a/internal/installer/config_manager_test.go +++ b/internal/installer/config_manager_test.go @@ -342,6 +342,55 @@ var _ = Describe("ConfigManager", func() { }) }) + Context("openFga validation", func() { + It("should accept an absent openFga block", func() { + configManager.Config.Codesphere.OpenFga = nil + errors := configManager.ValidateInstallConfig() + Expect(errors).NotTo(ContainElement(ContainSubstring("OpenFGA"))) + }) + + It("should require an apiUrl when the data center does not deploy OpenFGA", func() { + deploy := false + configManager.Config.Codesphere.OpenFga = &files.OpenFgaConfig{Deploy: &deploy} + errors := configManager.ValidateInstallConfig() + Expect(errors).To(ContainElement(ContainSubstring("OpenFGA apiUrl is required"))) + }) + + It("should validate the apiUrl format", func() { + configManager.Config.Codesphere.OpenFga = &files.OpenFgaConfig{APIURL: "not-a-valid-url"} + errors := configManager.ValidateInstallConfig() + Expect(errors).To(ContainElement(ContainSubstring("OpenFGA apiUrl must be a valid URL"))) + }) + + It("should require a host when exposing OpenFGA", func() { + configManager.Config.Codesphere.OpenFga = &files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true}, + } + errors := configManager.ValidateInstallConfig() + Expect(errors).To(ContainElement(ContainSubstring("OpenFGA expose host is required"))) + }) + + It("should reject exposing an OpenFGA the data center does not deploy", func() { + deploy := false + configManager.Config.Codesphere.OpenFga = &files.OpenFgaConfig{ + Deploy: &deploy, + APIURL: "https://openfga.1.cs.example.com", + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.2.cs.example.com"}, + } + errors := configManager.ValidateInstallConfig() + Expect(errors).To(ContainElement(ContainSubstring("cannot be exposed by a data center that does not deploy it"))) + }) + + It("should accept a data center that deploys and exposes OpenFGA", func() { + configManager.Config.Codesphere.OpenFga = &files.OpenFgaConfig{ + APIURL: "https://openfga.1.cs.example.com", + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + } + errors := configManager.ValidateInstallConfig() + Expect(errors).NotTo(ContainElement(ContainSubstring("OpenFGA"))) + }) + }) + Context("ceph validation", func() { It("should require at least one Ceph host", func() { configManager.Config.Ceph.Hosts = []files.CephHost{} diff --git a/internal/installer/files/config_yaml.go b/internal/installer/files/config_yaml.go index cce8757e3..b91f8a56c 100644 --- a/internal/installer/files/config_yaml.go +++ b/internal/installer/files/config_yaml.go @@ -361,6 +361,7 @@ type CodesphereConfig struct { ManagedServices []ManagedServiceConfig `yaml:"managedServices,omitempty"` OpenBao *OpenBaoConfig `yaml:"openBao,omitempty"` OpenfgaBackups *OpenfgaBackupsConfig `yaml:"openfgaBackups,omitempty"` + OpenFga *OpenFgaConfig `yaml:"openFga,omitempty"` Migration *MigrationConfig `yaml:"migration,omitempty"` TelemetryExport *TelemetryExport `yaml:"telemetryExport,omitempty"` Override ChartOverride `yaml:"override,omitempty"` @@ -398,6 +399,39 @@ type OpenfgaBackupsConfig struct { RetentionPolicy string `yaml:"retentionPolicy,omitempty"` } +// OpenFgaConfig configures the authorization store. One OpenFGA instance serves a whole +// installation, so in a multi-data-center setup exactly one data center deploys and exposes +// it (Deploy + Expose) and every other one only points at it (APIURL). +type OpenFgaConfig struct { + // Deploy controls whether pc-applications deploys OpenFGA in this data center. + // Defaults to true when unset, matching the pc-applications chart. + Deploy *bool `yaml:"deploy,omitempty"` + // APIURL is the URL the Codesphere services reach OpenFGA at. Defaults to the + // in-cluster service of a locally deployed OpenFGA; required when Deploy is false. + APIURL string `yaml:"apiUrl,omitempty"` + // Expose publishes the deployed OpenFGA through the Codesphere gateway so the other + // data centers can reach it. + Expose *OpenFgaExposeConfig `yaml:"expose,omitempty"` +} + +// OpenFgaExposeConfig publishes a locally deployed OpenFGA through the Codesphere gateway. +type OpenFgaExposeConfig struct { + Enabled bool `yaml:"enabled"` + // Host OpenFGA is served under. Must resolve to this data center's public IP and + // is what the other data centers put in their APIURL. + Host string `yaml:"host,omitempty"` +} + +// DeploysOpenFga reports whether pc-applications should deploy OpenFGA in this data center. +func (c *OpenFgaConfig) DeploysOpenFga() bool { + return c == nil || c.Deploy == nil || *c.Deploy +} + +// ExposesOpenFga reports whether the deployed OpenFGA is published through the gateway. +func (c *OpenFgaConfig) ExposesOpenFga() bool { + return c != nil && c.Expose != nil && c.Expose.Enabled +} + type OAuthProvidersConfig struct { Oidc *OidcOAuthProvider `yaml:"oidc,omitempty"` } From 4effac8ba761d7454241475e2011fa6088b7771b Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Thu, 13 Aug 2026 13:03:14 +0200 Subject: [PATCH 010/132] feat(oms): confirm secret changes in update install-config (#678) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two changes to `oms update install-config`: It now generates the secrets an existing vault is missing. A vault written by an older oms predates whatever the current one requires, and nothing on the upgrade path fills the gap: `oms install` never touches secrets and `oms init install-config` writes a fresh vault rather than extending one. Strictly additive — every entry the vault already holds is kept, including the ones EnsureSecrets would otherwise overwrite. And it asks before it changes anything in the vault, listing what it would regenerate or generate first. `-y`/`--yes` approves up front; a run without a terminal answers no, so an unattended upgrade never rewrites a secret by itself. Declining a regeneration aborts the update — the certificates cover values that would otherwise already be in the config — while declining a missing secret just skips it. --------- Signed-off-by: Jona Neef Signed-off-by: NJona <25478046+NJona@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) --- .../init_install_config_interactive_test.go | 3 +- cli/cmd/update_install_config.go | 146 +++++++- cli/cmd/update_install_config_test.go | 162 ++++++++- docs/oms_update_install-config.md | 1 + internal/installer/codesphere.go | 5 +- .../installer/config_generator_collector.go | 41 +-- .../config_generator_collector_test.go | 5 +- internal/installer/secrets/secrets.go | 17 +- internal/installer/secrets/secrets_test.go | 12 +- internal/prompt/mocks.go | 329 ++++++++++++++++++ internal/{installer => prompt}/prompt.go | 44 ++- internal/prompt/prompt_suite_test.go | 16 + internal/{installer => prompt}/prompt_test.go | 38 +- 13 files changed, 749 insertions(+), 70 deletions(-) create mode 100644 internal/prompt/mocks.go rename internal/{installer => prompt}/prompt.go (55%) create mode 100644 internal/prompt/prompt_suite_test.go rename internal/{installer => prompt}/prompt_test.go (94%) diff --git a/cli/cmd/init_install_config_interactive_test.go b/cli/cmd/init_install_config_interactive_test.go index 1be476802..c0e970ead 100644 --- a/cli/cmd/init_install_config_interactive_test.go +++ b/cli/cmd/init_install_config_interactive_test.go @@ -11,6 +11,7 @@ import ( "github.com/codesphere-cloud/oms/cli/cmd/util" "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/prompt" intutil "github.com/codesphere-cloud/oms/internal/util" . "github.com/codesphere-cloud/oms/internal/util/testing" ) @@ -74,7 +75,7 @@ var _ = Describe("Interactive profile usage", func() { // In non-interactive mode, CollectInteractively would use defaults // We simulate this by checking that the prompter returns defaults // when interactive=false - prompter := installer.NewPrompter(false) + prompter := prompt.NewPrompter(false) // Test that prompter returns defaults when not interactive Expect(prompter.String("Test", "default-value")).To(Equal("default-value")) diff --git a/cli/cmd/update_install_config.go b/cli/cmd/update_install_config.go index 26551adf4..6f0c63aa5 100644 --- a/cli/cmd/update_install_config.go +++ b/cli/cmd/update_install_config.go @@ -6,6 +6,7 @@ package cmd import ( "fmt" "log" + "sort" "strings" csio "github.com/codesphere-cloud/cs-go/pkg/io" @@ -13,6 +14,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" + "github.com/codesphere-cloud/oms/internal/prompt" intutil "github.com/codesphere-cloud/oms/internal/util" "github.com/spf13/cobra" ) @@ -21,6 +23,10 @@ type UpdateInstallConfigCmd struct { cmd *cobra.Command Opts *UpdateInstallConfigOpts FileWriter intutil.FileIO + + // Prompter asks the operator whether to go ahead with a change to the vault. + // --yes short-circuits it. + Prompter prompt.Prompter } type UpdateInstallConfigOpts struct { @@ -30,6 +36,7 @@ type UpdateInstallConfigOpts struct { VaultFile string WithComments bool + Yes bool // Fields that can be updated PostgresPrimaryIP string @@ -95,12 +102,16 @@ func AddUpdateInstallConfigCmd(update *cobra.Command, opts *util.GlobalOptions) }, Opts: &UpdateInstallConfigOpts{GlobalOptions: opts}, FileWriter: intutil.NewFilesystemWriter(), + // One prompter for the whole command: it buffers stdin, so a fresh one per + // question could drop what the operator already typed. + Prompter: prompt.NewPrompter(true), } c.cmd.Flags().StringVarP(&c.Opts.ConfigFile, "config", "c", "config.yaml", "Path to existing config.yaml file") c.cmd.Flags().StringVar(&c.Opts.VaultFile, "vault", "prod.vault.yaml", "Path to existing prod.vault.yaml file") c.cmd.Flags().BoolVar(&c.Opts.WithComments, "with-comments", false, "Add helpful comments to the generated YAML files") + c.cmd.Flags().BoolVarP(&c.Opts.Yes, "yes", "y", false, "Auto-approve every change to the vault (regenerated certificates and missing secrets)") // PostgreSQL update flags c.cmd.Flags().StringVar(&c.Opts.PostgresPrimaryIP, "postgres-primary-ip", "", "Primary PostgreSQL server IP") @@ -174,6 +185,13 @@ func (c *UpdateInstallConfigCmd) UpdateInstallConfig(icg installer.InstallConfig } if tracker.HasChanges() { + if !c.approve("Regenerate them?", "The changes above require these secrets to be regenerated:", tracker.Regenerates()) { + // The regenerated certificates cover values that were just written to the config, + // so keeping the old ones would leave the two inconsistent. Nothing has been + // written yet, so stopping here leaves the installation as it was. + return fmt.Errorf("aborted: the requested changes cannot be applied without regenerating the secrets above (pass --yes to approve up front)") + } + log.Println("\nRegenerating affected secrets and certificates...") if err := c.regenerateSecrets(config, vault, tracker); err != nil { return fmt.Errorf("failed to regenerate secrets: %w", err) @@ -182,6 +200,11 @@ func (c *UpdateInstallConfigCmd) UpdateInstallConfig(icg installer.InstallConfig log.Println("\nNo changes detected that require secret regeneration.") } + added, err := c.confirmAndAddMissingSecrets(config, vault) + if err != nil { + return err + } + if err := icg.WriteInstallConfig(c.Opts.ConfigFile, c.Opts.WithComments); err != nil { return fmt.Errorf("failed to write config file: %w", err) } @@ -190,7 +213,7 @@ func (c *UpdateInstallConfigCmd) UpdateInstallConfig(icg installer.InstallConfig return fmt.Errorf("failed to write vault file: %w", err) } - c.printSuccessMessage(tracker) + c.printSuccessMessage(tracker, added) return nil } @@ -398,6 +421,88 @@ func (c *UpdateInstallConfigCmd) applyCodesphereUpdates(config *files.RootConfig } } +// approve prints what is about to change and asks the operator to confirm it. --yes approves +// without asking; otherwise only an explicit yes counts, so a run without a terminal (an +// empty answer) declines. +func (c *UpdateInstallConfigCmd) approve(question, intro string, items []string) bool { + if c.Opts.Yes { + return true + } + + log.Printf("\n%s\n", intro) + + for _, item := range items { + log.Printf(" - %s\n", item) + } + + return c.Prompter.Bool(question, false) +} + +// confirmAndAddMissingSecrets asks about the secrets the vault is missing and adds them if +// the operator agrees. Returns the names of the ones that were added, none if the operator +// declined. +func (c *UpdateInstallConfigCmd) confirmAndAddMissingSecrets(config *files.RootConfig, vault *files.InstallVault) ([]string, error) { + missing, err := missingSecrets(config, vault) + if err != nil { + return nil, fmt.Errorf("failed to determine missing secrets: %w", err) + } + + if len(missing) == 0 { + return nil, nil + } + + if !c.approve("Generate them?", "The vault does not have these secrets yet:", missing) { + log.Printf("\nSkipped %d missing secret(s): %s\n", len(missing), strings.Join(missing, ", ")) + + return nil, nil + } + + added, err := addMissingSecrets(config, vault) + if err != nil { + return nil, fmt.Errorf("failed to add missing secrets: %w", err) + } + + log.Printf("\nAdded %d secret(s) missing from the vault: %s\n", len(added), strings.Join(added, ", ")) + + return added, nil +} + +// missingSecrets reports what addMissingSecrets would generate, without changing anything: +// it runs against copies, so only the names survive. +func missingSecrets(config *files.RootConfig, vault *files.InstallVault) ([]string, error) { + configCopy, err := config.Clone() + if err != nil { + return nil, fmt.Errorf("copy config: %w", err) + } + + return addMissingSecrets(configCopy, vault.Clone()) +} + +// addMissingSecrets generates the secrets the vault does not have yet and returns their +// names. EnsureSecrets keeps what is already there, so this only ever adds. +func addMissingSecrets(config *files.RootConfig, vault *files.InstallVault) ([]string, error) { + existing := make(map[string]bool, len(vault.Secrets)) + for _, secret := range vault.Secrets { + existing[secret.Name] = true + } + + if err := secrets.EnsureSecrets(vault, config); err != nil { + return nil, fmt.Errorf("ensure secrets: %w", err) + } + + added := []string{} + + for _, secret := range vault.Secrets { + if !existing[secret.Name] { + added = append(added, secret.Name) + } + } + + sort.Strings(added) + + return added, nil +} + func (c *UpdateInstallConfigCmd) regenerateSecrets(config *files.RootConfig, vault *files.InstallVault, tracker *SecretDependencyTracker) error { if tracker.NeedsPostgresPrimaryCertRegen() { log.Println(" - Regenerating PostgreSQL primary server certificate...") @@ -440,21 +545,24 @@ func (c *UpdateInstallConfigCmd) regenerateSecrets(config *files.RootConfig, vau return nil } -func (c *UpdateInstallConfigCmd) printSuccessMessage(tracker *SecretDependencyTracker) { +func (c *UpdateInstallConfigCmd) printSuccessMessage(tracker *SecretDependencyTracker, added []string) { log.Println("\n" + strings.Repeat("=", 70)) log.Println("Configuration successfully updated!") log.Println(strings.Repeat("=", 70)) if tracker.HasChanges() { log.Println("\nRegenerated secrets:") - if tracker.NeedsPostgresPrimaryCertRegen() { - log.Println(" ✓ PostgreSQL primary server certificate") - } - if tracker.NeedsPostgresReplicaCertRegen() { - log.Println(" ✓ PostgreSQL replica server certificate") + + for _, change := range tracker.Regenerates() { + log.Printf(" ✓ %s\n", change) } - if tracker.ACMEConfigChanged() { - log.Println(" ✓ ACME configuration updated") + } + + if len(added) > 0 { + log.Println("\nGenerated missing secrets:") + + for _, name := range added { + log.Printf(" ✓ %s\n", name) } } @@ -496,6 +604,26 @@ func (t *SecretDependencyTracker) ACMEConfigChanged() bool { return t.acmeConfigChanged } +// Regenerates describes, in operator-facing terms, what the tracked changes cause to be +// regenerated. Drives both the confirmation prompt and the summary, so the two cannot drift. +func (t *SecretDependencyTracker) Regenerates() []string { + changes := []string{} + + if t.postgresPrimaryCertNeedsRegen { + changes = append(changes, "PostgreSQL primary server certificate") + } + + if t.postgresReplicaCertNeedsRegen { + changes = append(changes, "PostgreSQL replica server certificate") + } + + if t.acmeConfigChanged { + changes = append(changes, "ACME configuration") + } + + return changes +} + func (t *SecretDependencyTracker) HasChanges() bool { return t.postgresPrimaryCertNeedsRegen || t.postgresReplicaCertNeedsRegen || t.acmeConfigChanged } diff --git a/cli/cmd/update_install_config_test.go b/cli/cmd/update_install_config_test.go index 8d078373f..f11632ebb 100644 --- a/cli/cmd/update_install_config_test.go +++ b/cli/cmd/update_install_config_test.go @@ -12,6 +12,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/stretchr/testify/mock" "github.com/codesphere-cloud/oms/cli/cmd/testutil" "github.com/codesphere-cloud/oms/cli/cmd/util" @@ -19,6 +20,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/prompt" ) func quoteYAMLString(s string) string { @@ -37,8 +39,11 @@ var _ = Describe("UpdateInstallConfig", func() { initialVault string cmd *UpdateInstallConfigCmd opts *UpdateInstallConfigOpts - testCAKeyPem string - testCACertPem string + confirmations []string + // Answer the stubbed prompts with. Reset to true for every spec. + approveConfirmations bool + testCAKeyPem string + testCACertPem string ) BeforeEach(func() { @@ -46,6 +51,8 @@ var _ = Describe("UpdateInstallConfig", func() { Skip("sops and age-keygen not available") } + approveConfirmations = true + var err error configFile, err = os.CreateTemp("", "config-*.yaml") Expect(err).NotTo(HaveOccurred()) @@ -213,8 +220,20 @@ codesphere: VaultFile: vaultFile.Name(), } + confirmations = nil + prompter := prompt.NewMockPrompter(GinkgoT()) + // Records what was asked and answers it the way the spec asked for. Optional, + // because a spec that passes --yes never gets to ask. + prompter.EXPECT().Bool(mock.Anything, false). + RunAndReturn(func(question string, _ bool) bool { + confirmations = append(confirmations, question) + + return approveConfirmations + }).Maybe() + cmd = &UpdateInstallConfigCmd{ - Opts: opts, + Opts: opts, + Prompter: prompter, } }) @@ -355,6 +374,67 @@ codesphere: }) }) + Context("confirming changes to the vault", func() { + // The fixture vault holds only some of the secrets EnsureSecrets knows about, + // so every run of the command finds something to generate. + It("asks before generating a secret the vault does not have", func() { + icg := installer.NewInstallConfigManager() + Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) + + Expect(confirmations).To(HaveLen(1)) + Expect(icg.GetVault().GetSecret(files.SecretMounterHmacSecret)).ToNot(BeNil()) + }) + + It("leaves the vault alone when the operator declines", func() { + approveConfirmations = false + + icg := installer.NewInstallConfigManager() + Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) + + Expect(icg.GetVault().GetSecret(files.SecretMounterHmacSecret)).To(BeNil()) + + writtenVault, err := vault.LoadVaultData(vaultFile.Name(), "") + Expect(err).NotTo(HaveOccurred()) + Expect(writtenVault.GetSecret(files.SecretMounterHmacSecret)).To(BeNil()) + }) + + It("asks nothing with --yes", func() { + opts.Yes = true + + icg := installer.NewInstallConfigManager() + Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) + + Expect(confirmations).To(BeEmpty()) + Expect(icg.GetVault().GetSecret(files.SecretMounterHmacSecret)).ToNot(BeNil()) + }) + + It("asks before regenerating certificates an update invalidates", func() { + opts.PostgresPrimaryIP = "10.10.0.4" + + icg := installer.NewInstallConfigManager() + Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) + + Expect(confirmations).To(HaveLen(2)) + }) + + // A declined regeneration would leave the config pointing at an IP the + // certificate does not cover, so the whole update is dropped instead. + It("writes nothing when the operator declines a regeneration", func() { + opts.PostgresPrimaryIP = "10.10.0.4" + approveConfirmations = false + + icg := installer.NewInstallConfigManager() + err := cmd.UpdateInstallConfig(icg) + + Expect(err).To(MatchError(ContainSubstring("aborted"))) + + written := installer.NewInstallConfigManager() + Expect(written.LoadInstallConfigFromFile(configFile.Name())).To(Succeed()) + Expect(written.GetInstallConfig().Postgres.Primary.IP).To(Equal("10.0.0.5")) + Expect(confirmations).To(HaveLen(1)) + }) + }) + Context("when loading invalid config file", func() { It("should return an error", func() { opts.ConfigFile = "/nonexistent/config.yaml" @@ -482,3 +562,79 @@ var _ = Describe("SecretDependencyTracker", func() { Expect(tracker.NeedsPostgresReplicaCertRegen()).To(BeTrue()) }) }) + +var _ = Describe("missingSecrets", func() { + It("reports what is missing without changing config or vault", func() { + config := &files.RootConfig{} + vault := &files.InstallVault{} + + missing, err := missingSecrets(config, vault) + + Expect(err).ToNot(HaveOccurred()) + Expect(missing).To(ContainElement(files.SecretMounterHmacSecret)) + Expect(vault.Secrets).To(BeEmpty()) + Expect(config.Cluster.Certificates.CA.CertPem).To(BeEmpty()) + }) + + It("reports nothing once the secrets are there", func() { + config := &files.RootConfig{} + vault := &files.InstallVault{} + _, err := addMissingSecrets(config, vault) + Expect(err).ToNot(HaveOccurred()) + + Expect(missingSecrets(config, vault)).To(BeEmpty()) + }) +}) + +var _ = Describe("addMissingSecrets", func() { + var config *files.RootConfig + + BeforeEach(func() { + config = &files.RootConfig{} + }) + + It("adds a secret the vault does not have", func() { + vault := &files.InstallVault{} + + added, err := addMissingSecrets(config, vault) + + Expect(err).ToNot(HaveOccurred()) + Expect(added).To(ContainElement(files.SecretMounterHmacSecret)) + Expect(vault.GetSecret(files.SecretMounterHmacSecret)).ToNot(BeNil()) + }) + + It("reports nothing on a second run and keeps the generated value", func() { + vault := &files.InstallVault{} + _, err := addMissingSecrets(config, vault) + Expect(err).ToNot(HaveOccurred()) + + secret := vault.GetSecret(files.SecretMounterHmacSecret).Fields.Password + + added, err := addMissingSecrets(config, vault) + + Expect(err).ToNot(HaveOccurred()) + Expect(added).To(BeEmpty()) + Expect(vault.GetSecret(files.SecretMounterHmacSecret).Fields.Password).To(Equal(secret)) + }) + + It("never modifies a secret the vault already holds", func() { + vault := &files.InstallVault{} + vault.SetSecret(files.SecretEntry{ + Name: files.SecretMounterHmacSecret, + Fields: &files.SecretFields{Password: "operator-supplied-secret"}, + }) + // EnsureDefaultSecrets overwrites this one unconditionally when it runs directly. + vault.SetSecret(files.SecretEntry{ + Name: files.SecretDigitalOceanApiToken, + Fields: &files.SecretFields{Password: "a-real-token"}, + }) + + added, err := addMissingSecrets(config, vault) + + Expect(err).ToNot(HaveOccurred()) + Expect(added).ToNot(ContainElement(files.SecretMounterHmacSecret)) + Expect(added).ToNot(ContainElement(files.SecretDigitalOceanApiToken)) + Expect(vault.GetSecret(files.SecretMounterHmacSecret).Fields.Password).To(Equal("operator-supplied-secret")) + Expect(vault.GetSecret(files.SecretDigitalOceanApiToken).Fields.Password).To(Equal("a-real-token")) + }) +}) diff --git a/docs/oms_update_install-config.md b/docs/oms_update_install-config.md index 54412d20c..8611644c3 100644 --- a/docs/oms_update_install-config.md +++ b/docs/oms_update_install-config.md @@ -69,6 +69,7 @@ $ oms update install-config --k8s-api-server 10.0.0.10 --config config.yaml --va --vault string Path to existing prod.vault.yaml file (default "prod.vault.yaml") --with-comments Add helpful comments to the generated YAML files --workspace-hosting-base-domain string Workspace hosting base domain + -y, --yes Auto-approve every change to the vault (regenerated certificates and missing secrets) ``` ### SEE ALSO diff --git a/internal/installer/codesphere.go b/internal/installer/codesphere.go index c61b1fa72..1a12c507e 100644 --- a/internal/installer/codesphere.go +++ b/internal/installer/codesphere.go @@ -16,6 +16,7 @@ import ( "strings" "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/prompt" "github.com/codesphere-cloud/oms/internal/system" "github.com/codesphere-cloud/oms/internal/util" ) @@ -401,9 +402,9 @@ func (ci *CodesphereInstaller) installerCommandArgs(pm PackageManager, config fi sort.Strings(executedSteps) - prompt := NewPrompter(!ci.AutoApprove) + prompter := prompt.NewPrompter(!ci.AutoApprove) msg := fmt.Sprintf("The following steps will be executed: %s. Type \"yes\" to continue.", strings.Join(executedSteps, ", ")) - if prompt.String(msg, "yes") != "yes" { + if prompter.String(msg, "yes") != "yes" { return nil, fmt.Errorf("installation aborted") } diff --git a/internal/installer/config_generator_collector.go b/internal/installer/config_generator_collector.go index 8d48eb92a..b731a45e3 100644 --- a/internal/installer/config_generator_collector.go +++ b/internal/installer/config_generator_collector.go @@ -8,10 +8,11 @@ import ( "log" "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/prompt" ) func (g *InstallConfig) CollectInteractively() error { - prompter := NewPrompter(true) + prompter := prompt.NewPrompter(true) g.collectDatacenterConfig(prompter) g.collectRegistryConfig(prompter) @@ -26,20 +27,20 @@ func (g *InstallConfig) CollectInteractively() error { return nil } -func (g *InstallConfig) collectString(prompter *Prompter, prompt, defaultVal string) string { - return prompter.String(prompt, defaultVal) +func (g *InstallConfig) collectString(prompter prompt.Prompter, question, defaultVal string) string { + return prompter.String(question, defaultVal) } -func (g *InstallConfig) collectInt(prompter *Prompter, prompt string, defaultVal int) int { - return prompter.Int(prompt, defaultVal) +func (g *InstallConfig) collectInt(prompter prompt.Prompter, question string, defaultVal int) int { + return prompter.Int(question, defaultVal) } -func (g *InstallConfig) collectStringSlice(prompter *Prompter, prompt string, defaultVal []string) []string { - return prompter.StringSlice(prompt, defaultVal) +func (g *InstallConfig) collectStringSlice(prompter prompt.Prompter, question string, defaultVal []string) []string { + return prompter.StringSlice(question, defaultVal) } -func (g *InstallConfig) collectChoice(prompter *Prompter, prompt string, options []string, defaultVal string) string { - return prompter.Choice(prompt, options, defaultVal) +func (g *InstallConfig) collectChoice(prompter prompt.Prompter, question string, options []string, defaultVal string) string { + return prompter.Choice(question, options, defaultVal) } func k8sNodesToStringSlice(nodes []files.K8sNode) []string { @@ -58,7 +59,7 @@ func stringSliceToK8sNodes(ips []string) []files.K8sNode { return nodes } -func (g *InstallConfig) collectDatacenterConfig(prompter *Prompter) { +func (g *InstallConfig) collectDatacenterConfig(prompter prompt.Prompter) { log.Println("=== Datacenter Configuration ===") g.Config.Datacenter.ID = g.collectInt(prompter, "Datacenter ID", g.Config.Datacenter.ID) g.Config.Datacenter.Name = g.collectString(prompter, "Datacenter name", g.Config.Datacenter.Name) @@ -67,7 +68,7 @@ func (g *InstallConfig) collectDatacenterConfig(prompter *Prompter) { g.Config.Secrets.BaseDir = g.collectString(prompter, "Secrets base directory", "/root/secrets") } -func (g *InstallConfig) collectRegistryConfig(prompter *Prompter) { +func (g *InstallConfig) collectRegistryConfig(prompter prompt.Prompter) { log.Println("\n=== Container Registry Configuration ===") g.Config.Registry.Server = g.collectString(prompter, "Container registry server (e.g., ghcr.io, leave empty to skip)", "") if g.Config.Registry.Server != "" { @@ -76,7 +77,7 @@ func (g *InstallConfig) collectRegistryConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectPostgresConfig(prompter *Prompter) { +func (g *InstallConfig) collectPostgresConfig(prompter prompt.Prompter) { log.Println("\n=== PostgreSQL Configuration ===") g.Config.Postgres.Mode = g.collectChoice(prompter, "PostgreSQL setup", []string{"install", "external"}, "install") @@ -110,7 +111,7 @@ func (g *InstallConfig) collectPostgresConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectCephConfig(prompter *Prompter) { +func (g *InstallConfig) collectCephConfig(prompter prompt.Prompter) { log.Println("\n=== Ceph Configuration ===") g.Config.Ceph.NodesSubnet = g.collectString(prompter, "Ceph nodes subnet (CIDR)", "10.53.101.0/24") @@ -132,7 +133,7 @@ func (g *InstallConfig) collectCephConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectK8sConfig(prompter *Prompter) { +func (g *InstallConfig) collectK8sConfig(prompter prompt.Prompter) { log.Println("\n=== Kubernetes Configuration ===") g.Config.Kubernetes.ManagedByCodesphere = prompter.Bool("Use Codesphere-managed Kubernetes (k0s)", g.Config.Kubernetes.ManagedByCodesphere) @@ -163,7 +164,7 @@ func (g *InstallConfig) collectK8sConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectGatewayConfig(prompter *Prompter) { +func (g *InstallConfig) collectGatewayConfig(prompter prompt.Prompter) { log.Println("\n=== Cluster Gateway Configuration ===") g.Config.Cluster.Gateway.ServiceType = g.collectChoice(prompter, "Gateway service type", []string{"LoadBalancer", "ExternalIP"}, "LoadBalancer") if g.Config.Cluster.Gateway.ServiceType == "ExternalIP" { @@ -176,7 +177,7 @@ func (g *InstallConfig) collectGatewayConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectMetalLBConfig(prompter *Prompter) { +func (g *InstallConfig) collectMetalLBConfig(prompter prompt.Prompter) { log.Println("\n=== MetalLB Configuration (Optional) ===") g.Config.MetalLB.Enabled = prompter.Bool("Enable MetalLB", g.Config.MetalLB.Enabled) @@ -212,7 +213,7 @@ func (g *InstallConfig) collectMetalLBConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectACMEConfig(prompter *Prompter) { +func (g *InstallConfig) collectACMEConfig(prompter prompt.Prompter) { log.Println("\n=== ACME Certificate Configuration (Optional) ===") certIssuer := g.Config.Codesphere.EnsureCertIssuer() @@ -293,7 +294,7 @@ func (g *InstallConfig) collectACMEConfig(prompter *Prompter) { log.Println("Provider config and secrets should be added manually after generation.") } -func (g *InstallConfig) collectCodesphereConfig(prompter *Prompter) { +func (g *InstallConfig) collectCodesphereConfig(prompter prompt.Prompter) { log.Println("\n=== Codesphere Application Configuration ===") defaultDomain := g.Config.Codesphere.Domain if defaultDomain == "" { @@ -366,7 +367,7 @@ func (g *InstallConfig) collectCodesphereConfig(prompter *Prompter) { g.collectOpenfgaBackupsConfig(prompter) } -func (g *InstallConfig) collectOpenfgaBackupsConfig(prompter *Prompter) { +func (g *InstallConfig) collectOpenfgaBackupsConfig(prompter prompt.Prompter) { log.Println("\n=== OpenFGA Database Backups (Optional) ===") hasBackups := prompter.Bool("Configure OpenFGA database backups", g.Config.Codesphere.OpenfgaBackups != nil && g.Config.Codesphere.OpenfgaBackups.Enabled) if !hasBackups { @@ -411,7 +412,7 @@ func (g *InstallConfig) collectOpenfgaBackupsConfig(prompter *Prompter) { } } -func (g *InstallConfig) collectOpenBaoConfig(prompter *Prompter) { +func (g *InstallConfig) collectOpenBaoConfig(prompter prompt.Prompter) { log.Println("\n=== OpenBao Configuration (Optional) ===") hasOpenBao := prompter.Bool("Configure OpenBao integration", g.Config.Codesphere.OpenBao != nil && g.Config.Codesphere.OpenBao.URI != "") if !hasOpenBao { diff --git a/internal/installer/config_generator_collector_test.go b/internal/installer/config_generator_collector_test.go index fc5c2829d..4511c0476 100644 --- a/internal/installer/config_generator_collector_test.go +++ b/internal/installer/config_generator_collector_test.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/gomega" "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/prompt" ) var _ = Describe("ConfigGeneratorCollector", func() { @@ -34,11 +35,11 @@ var _ = Describe("ConfigGeneratorCollector", func() { }) Describe("Prompter", func() { - var prompter *installer.Prompter + var prompter prompt.Prompter Context("Non-interactive mode", func() { BeforeEach(func() { - prompter = installer.NewPrompter(false) + prompter = prompt.NewPrompter(false) }) It("should return default string value", func() { diff --git a/internal/installer/secrets/secrets.go b/internal/installer/secrets/secrets.go index d7660c3e2..176f9762d 100644 --- a/internal/installer/secrets/secrets.go +++ b/internal/installer/secrets/secrets.go @@ -223,11 +223,10 @@ func EnsureNixSigningKeys(vault *files.InstallVault, host string) error { } // EnsureDefaultSecrets sets dummy defaults for all Helm chart secrets not managed by -// the installer config. Always overwrites digitalOceanApiToken; all others are only -// set when absent. +// the installer config. Idempotent: a value the vault already holds is kept. func EnsureDefaultSecrets(vault *files.InstallVault) error { - // Always overwrite — not used in private cloud but must not be empty. - setPassword(vault, files.SecretDigitalOceanApiToken, "dummy") + // Unused in private cloud, but the chart does not render without a value. + setPasswordIfEmpty(vault, files.SecretDigitalOceanApiToken, "dummy") for _, name := range optionalPasswordSecrets { setPasswordIfAbsent(vault, name, "dummy") @@ -300,6 +299,16 @@ func setPassword(vault *files.InstallVault, name, password string) { }) } +// setPasswordIfEmpty fills in a secret the vault does not have, or has without a value. +// Used for secrets the Helm chart needs a value for, where an empty entry is as good as none. +func setPasswordIfEmpty(vault *files.InstallVault, name, password string) { + if secret := vault.GetSecret(name); secret != nil && secret.Fields != nil && secret.Fields.Password != "" { + return + } + + setPassword(vault, name, password) +} + func setPasswordIfAbsent(vault *files.InstallVault, name, password string) { if vault.GetSecret(name) != nil { return diff --git a/internal/installer/secrets/secrets_test.go b/internal/installer/secrets/secrets_test.go index d19ee0f59..4bccfab54 100644 --- a/internal/installer/secrets/secrets_test.go +++ b/internal/installer/secrets/secrets_test.go @@ -177,10 +177,20 @@ var _ = Describe("EnsureNixSigningKeys", func() { }) var _ = Describe("EnsureDefaultSecrets", func() { - It("always overwrites digitalOceanApiToken", func() { + It("keeps a digitalOceanApiToken the vault already holds", func() { vault := newVault() vault.SetSecret(files.SecretEntry{Name: "digitalOceanApiToken", Fields: &files.SecretFields{Password: "real-token"}}) + Expect(secrets.EnsureDefaultSecrets(vault)).To(Succeed()) + Expect(vault.GetSecret("digitalOceanApiToken").Fields.Password).To(Equal("real-token")) + }) + + // The chart does not render without a value, so an entry that is there but empty is + // filled in like a missing one. + It("fills in an empty digitalOceanApiToken", func() { + vault := newVault() + vault.SetSecret(files.SecretEntry{Name: "digitalOceanApiToken", Fields: &files.SecretFields{Password: ""}}) + Expect(secrets.EnsureDefaultSecrets(vault)).To(Succeed()) Expect(vault.GetSecret("digitalOceanApiToken").Fields.Password).To(Equal("dummy")) }) diff --git a/internal/prompt/mocks.go b/internal/prompt/mocks.go new file mode 100644 index 000000000..1b5922a0e --- /dev/null +++ b/internal/prompt/mocks.go @@ -0,0 +1,329 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package prompt + +import ( + mock "github.com/stretchr/testify/mock" +) + +// NewMockPrompter creates a new instance of MockPrompter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockPrompter(t interface { + mock.TestingT + Cleanup(func()) +}) *MockPrompter { + mock := &MockPrompter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// MockPrompter is an autogenerated mock type for the Prompter type +type MockPrompter struct { + mock.Mock +} + +type MockPrompter_Expecter struct { + mock *mock.Mock +} + +func (_m *MockPrompter) EXPECT() *MockPrompter_Expecter { + return &MockPrompter_Expecter{mock: &_m.Mock} +} + +// Bool provides a mock function for the type MockPrompter +func (_mock *MockPrompter) Bool(prompt string, defaultValue bool) bool { + ret := _mock.Called(prompt, defaultValue) + + if len(ret) == 0 { + panic("no return value specified for Bool") + } + + var r0 bool + if returnFunc, ok := ret.Get(0).(func(string, bool) bool); ok { + r0 = returnFunc(prompt, defaultValue) + } else { + r0 = ret.Get(0).(bool) + } + return r0 +} + +// MockPrompter_Bool_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Bool' +type MockPrompter_Bool_Call struct { + *mock.Call +} + +// Bool is a helper method to define mock.On call +// - prompt string +// - defaultValue bool +func (_e *MockPrompter_Expecter) Bool(prompt any, defaultValue any) *MockPrompter_Bool_Call { + return &MockPrompter_Bool_Call{Call: _e.mock.On("Bool", prompt, defaultValue)} +} + +func (_c *MockPrompter_Bool_Call) Run(run func(prompt string, defaultValue bool)) *MockPrompter_Bool_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 bool + if args[1] != nil { + arg1 = args[1].(bool) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockPrompter_Bool_Call) Return(b bool) *MockPrompter_Bool_Call { + _c.Call.Return(b) + return _c +} + +func (_c *MockPrompter_Bool_Call) RunAndReturn(run func(prompt string, defaultValue bool) bool) *MockPrompter_Bool_Call { + _c.Call.Return(run) + return _c +} + +// Choice provides a mock function for the type MockPrompter +func (_mock *MockPrompter) Choice(prompt string, choices []string, defaultValue string) string { + ret := _mock.Called(prompt, choices, defaultValue) + + if len(ret) == 0 { + panic("no return value specified for Choice") + } + + var r0 string + if returnFunc, ok := ret.Get(0).(func(string, []string, string) string); ok { + r0 = returnFunc(prompt, choices, defaultValue) + } else { + r0 = ret.Get(0).(string) + } + return r0 +} + +// MockPrompter_Choice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Choice' +type MockPrompter_Choice_Call struct { + *mock.Call +} + +// Choice is a helper method to define mock.On call +// - prompt string +// - choices []string +// - defaultValue string +func (_e *MockPrompter_Expecter) Choice(prompt any, choices any, defaultValue any) *MockPrompter_Choice_Call { + return &MockPrompter_Choice_Call{Call: _e.mock.On("Choice", prompt, choices, defaultValue)} +} + +func (_c *MockPrompter_Choice_Call) Run(run func(prompt string, choices []string, defaultValue string)) *MockPrompter_Choice_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + run( + arg0, + arg1, + arg2, + ) + }) + return _c +} + +func (_c *MockPrompter_Choice_Call) Return(s string) *MockPrompter_Choice_Call { + _c.Call.Return(s) + return _c +} + +func (_c *MockPrompter_Choice_Call) RunAndReturn(run func(prompt string, choices []string, defaultValue string) string) *MockPrompter_Choice_Call { + _c.Call.Return(run) + return _c +} + +// Int provides a mock function for the type MockPrompter +func (_mock *MockPrompter) Int(prompt string, defaultValue int) int { + ret := _mock.Called(prompt, defaultValue) + + if len(ret) == 0 { + panic("no return value specified for Int") + } + + var r0 int + if returnFunc, ok := ret.Get(0).(func(string, int) int); ok { + r0 = returnFunc(prompt, defaultValue) + } else { + r0 = ret.Get(0).(int) + } + return r0 +} + +// MockPrompter_Int_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Int' +type MockPrompter_Int_Call struct { + *mock.Call +} + +// Int is a helper method to define mock.On call +// - prompt string +// - defaultValue int +func (_e *MockPrompter_Expecter) Int(prompt any, defaultValue any) *MockPrompter_Int_Call { + return &MockPrompter_Int_Call{Call: _e.mock.On("Int", prompt, defaultValue)} +} + +func (_c *MockPrompter_Int_Call) Run(run func(prompt string, defaultValue int)) *MockPrompter_Int_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 int + if args[1] != nil { + arg1 = args[1].(int) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockPrompter_Int_Call) Return(n int) *MockPrompter_Int_Call { + _c.Call.Return(n) + return _c +} + +func (_c *MockPrompter_Int_Call) RunAndReturn(run func(prompt string, defaultValue int) int) *MockPrompter_Int_Call { + _c.Call.Return(run) + return _c +} + +// String provides a mock function for the type MockPrompter +func (_mock *MockPrompter) String(prompt string, defaultValue string) string { + ret := _mock.Called(prompt, defaultValue) + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if returnFunc, ok := ret.Get(0).(func(string, string) string); ok { + r0 = returnFunc(prompt, defaultValue) + } else { + r0 = ret.Get(0).(string) + } + return r0 +} + +// MockPrompter_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type MockPrompter_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +// - prompt string +// - defaultValue string +func (_e *MockPrompter_Expecter) String(prompt any, defaultValue any) *MockPrompter_String_Call { + return &MockPrompter_String_Call{Call: _e.mock.On("String", prompt, defaultValue)} +} + +func (_c *MockPrompter_String_Call) Run(run func(prompt string, defaultValue string)) *MockPrompter_String_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockPrompter_String_Call) Return(s string) *MockPrompter_String_Call { + _c.Call.Return(s) + return _c +} + +func (_c *MockPrompter_String_Call) RunAndReturn(run func(prompt string, defaultValue string) string) *MockPrompter_String_Call { + _c.Call.Return(run) + return _c +} + +// StringSlice provides a mock function for the type MockPrompter +func (_mock *MockPrompter) StringSlice(prompt string, defaultValue []string) []string { + ret := _mock.Called(prompt, defaultValue) + + if len(ret) == 0 { + panic("no return value specified for StringSlice") + } + + var r0 []string + if returnFunc, ok := ret.Get(0).(func(string, []string) []string); ok { + r0 = returnFunc(prompt, defaultValue) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + return r0 +} + +// MockPrompter_StringSlice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StringSlice' +type MockPrompter_StringSlice_Call struct { + *mock.Call +} + +// StringSlice is a helper method to define mock.On call +// - prompt string +// - defaultValue []string +func (_e *MockPrompter_Expecter) StringSlice(prompt any, defaultValue any) *MockPrompter_StringSlice_Call { + return &MockPrompter_StringSlice_Call{Call: _e.mock.On("StringSlice", prompt, defaultValue)} +} + +func (_c *MockPrompter_StringSlice_Call) Run(run func(prompt string, defaultValue []string)) *MockPrompter_StringSlice_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockPrompter_StringSlice_Call) Return(strings []string) *MockPrompter_StringSlice_Call { + _c.Call.Return(strings) + return _c +} + +func (_c *MockPrompter_StringSlice_Call) RunAndReturn(run func(prompt string, defaultValue []string) []string) *MockPrompter_StringSlice_Call { + _c.Call.Return(run) + return _c +} diff --git a/internal/installer/prompt.go b/internal/prompt/prompt.go similarity index 55% rename from internal/installer/prompt.go rename to internal/prompt/prompt.go index 31d360d18..0538e6c07 100644 --- a/internal/installer/prompt.go +++ b/internal/prompt/prompt.go @@ -1,7 +1,10 @@ // Copyright (c) Codesphere Inc. // SPDX-License-Identifier: Apache-2.0 -package installer +// Package prompt asks the operator questions on stdin. A prompter can be non-interactive, +// in which case every question is answered with its default instead of being asked, which is +// what unattended runs (CI, --yes style flags) use. +package prompt import ( "bufio" @@ -11,19 +14,36 @@ import ( "strings" ) -type Prompter struct { +// Prompter asks the operator a question and returns their answer, falling back to the +// default whenever there is none: an empty line, a closed stdin, or a prompter that was +// created non-interactive. +// +//mockery:generate: true +type Prompter interface { + String(prompt, defaultValue string) string + Int(prompt string, defaultValue int) int + StringSlice(prompt string, defaultValue []string) []string + Bool(prompt string, defaultValue bool) bool + Choice(prompt string, choices []string, defaultValue string) string +} + +// StdinPrompter is the Prompter that asks on stdin. +type StdinPrompter struct { reader *bufio.Reader interactive bool } -func NewPrompter(interactive bool) *Prompter { - return &Prompter{ +// NewPrompter returns a prompter reading from stdin. A non-interactive one never asks +// and answers every question with its default. +func NewPrompter(interactive bool) *StdinPrompter { + return &StdinPrompter{ reader: bufio.NewReader(os.Stdin), interactive: interactive, } } -func (p *Prompter) String(prompt, defaultValue string) string { +// String asks for a line of text. +func (p *StdinPrompter) String(prompt, defaultValue string) string { if !p.interactive { return defaultValue } @@ -43,7 +63,8 @@ func (p *Prompter) String(prompt, defaultValue string) string { return input } -func (p *Prompter) Int(prompt string, defaultValue int) int { +// Int asks for a number, falling back to the default when the answer is not one. +func (p *StdinPrompter) Int(prompt string, defaultValue int) int { if !p.interactive { return defaultValue } @@ -65,7 +86,8 @@ func (p *Prompter) Int(prompt string, defaultValue int) int { return value } -func (p *Prompter) StringSlice(prompt string, defaultValue []string) []string { +// StringSlice asks for a comma-separated list. +func (p *StdinPrompter) StringSlice(prompt string, defaultValue []string) []string { if !p.interactive { return defaultValue } @@ -99,7 +121,9 @@ func (p *Prompter) StringSlice(prompt string, defaultValue []string) []string { return result } -func (p *Prompter) Bool(prompt string, defaultValue bool) bool { +// Bool asks a yes/no question. Only "y" and "yes" are a yes, only "n" and "no" a no; +// anything else falls back to the default. +func (p *StdinPrompter) Bool(prompt string, defaultValue bool) bool { if !p.interactive { return defaultValue } @@ -120,7 +144,9 @@ func (p *Prompter) Bool(prompt string, defaultValue bool) bool { return input == "y" || input == "yes" } -func (p *Prompter) Choice(prompt string, choices []string, defaultValue string) string { +// Choice asks for one of the given options, falling back to the default when the answer +// is not among them. +func (p *StdinPrompter) Choice(prompt string, choices []string, defaultValue string) string { if !p.interactive { return defaultValue } diff --git a/internal/prompt/prompt_suite_test.go b/internal/prompt/prompt_suite_test.go new file mode 100644 index 000000000..fdaf9d97b --- /dev/null +++ b/internal/prompt/prompt_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package prompt + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestPrompt(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Prompt Suite") +} diff --git a/internal/installer/prompt_test.go b/internal/prompt/prompt_test.go similarity index 94% rename from internal/installer/prompt_test.go rename to internal/prompt/prompt_test.go index 6b995cbf5..8caa79ef6 100644 --- a/internal/installer/prompt_test.go +++ b/internal/prompt/prompt_test.go @@ -1,7 +1,7 @@ // Copyright (c) Codesphere Inc. // SPDX-License-Identifier: Apache-2.0 -package installer +package prompt import ( "bufio" @@ -46,7 +46,7 @@ var _ = Describe("Prompter", func() { Context("interactive mode", func() { It("returns user input when provided", func() { input := "user-value\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -56,7 +56,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is empty", func() { input := "\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -66,7 +66,7 @@ var _ = Describe("Prompter", func() { It("trims whitespace from input", func() { input := " value with spaces \n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -88,7 +88,7 @@ var _ = Describe("Prompter", func() { Context("interactive mode", func() { It("returns parsed integer when valid input provided", func() { input := "123\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -98,7 +98,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is empty", func() { input := "\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -108,7 +108,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is invalid", func() { input := "not-a-number\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -118,7 +118,7 @@ var _ = Describe("Prompter", func() { It("handles negative numbers", func() { input := "-100\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -147,7 +147,7 @@ var _ = Describe("Prompter", func() { Context("interactive mode", func() { It("parses comma-separated values", func() { input := "one, two, three\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -158,7 +158,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is empty", func() { input := "\n" defaultVal := []string{"default1", "default2"} - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -168,7 +168,7 @@ var _ = Describe("Prompter", func() { It("trims whitespace from each value", func() { input := " one , two , three \n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -178,7 +178,7 @@ var _ = Describe("Prompter", func() { It("handles single value", func() { input := "single\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -188,7 +188,7 @@ var _ = Describe("Prompter", func() { It("filters out empty values", func() { input := "one, , two, , three\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -216,7 +216,7 @@ var _ = Describe("Prompter", func() { Context("interactive mode", func() { DescribeTable("boolean parsing", func(input string, expected bool) { - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input + "\n")), interactive: true, } @@ -236,7 +236,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is empty", func() { input := "\n" - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -260,7 +260,7 @@ var _ = Describe("Prompter", func() { It("returns matching choice case-insensitively", func() { input := "OPTION2\n" choices := []string{"option1", "option2", "option3"} - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -271,7 +271,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is empty", func() { input := "\n" choices := []string{"option1", "option2", "option3"} - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -282,7 +282,7 @@ var _ = Describe("Prompter", func() { It("returns default when input is invalid", func() { input := "invalid-option\n" choices := []string{"option1", "option2", "option3"} - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } @@ -293,7 +293,7 @@ var _ = Describe("Prompter", func() { It("handles exact match", func() { input := "option2\n" choices := []string{"option1", "option2", "option3"} - p := &Prompter{ + p := &StdinPrompter{ reader: bufio.NewReader(strings.NewReader(input)), interactive: true, } From ef278cfec6eef9985d2bcf2bbda28384d8e6cdc9 Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Thu, 13 Aug 2026 14:17:51 +0200 Subject: [PATCH 011/132] feat(openfga): derive the pc-applications values (#680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns the codesphere.openFga block into values for the openfga application: whether pc-applications deploys OpenFGA here, and the gateway that publishes it, with the certificate following the installation's own cert issuer. The derived values are the base — an explicit pcApps block in config.yaml and --pc-apps-values still win over them. Authentication is not configured but read off the vault: OpenFGA requires the preshared key exactly when the installation has one. An installation whose vault predates the key stays unauthenticated and keeps working, and the Codesphere services decide the same way from the same entry, so the two cannot disagree. Services that started before the key existed pick it up when their pods roll. --------- Signed-off-by: Jona Neef Co-authored-by: Claude Opus 5 (1M context) --- internal/installer/argocd/install_and_apps.go | 7 +- internal/installer/openfga_pc_apps.go | 116 +++++++++++++ internal/installer/openfga_pc_apps_test.go | 154 ++++++++++++++++++ 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 internal/installer/openfga_pc_apps.go create mode 100644 internal/installer/openfga_pc_apps_test.go diff --git a/internal/installer/argocd/install_and_apps.go b/internal/installer/argocd/install_and_apps.go index 035612f4c..77795cd52 100644 --- a/internal/installer/argocd/install_and_apps.go +++ b/internal/installer/argocd/install_and_apps.go @@ -11,6 +11,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/util" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -69,12 +70,16 @@ func (i *AppInstaller) SyncVaultSecret(ctx context.Context) error { // InstallPCApps creates or updates the pc-applications app-of-apps ArgoCD // Application using the chart version from the supplied installer BOM. func (i *AppInstaller) InstallPCApps(ctx context.Context, bomPath string) error { + // Values derived from the install config form the base; an explicit pcApps block in + // config.yaml wins over them, and the --pc-apps-values files win over both. + values := util.DeepMergeMaps(installer.OpenFgaPcAppsValues(&i.cfg.Config, i.cfg.Vault), i.cfg.Config.PcApps) + pcApps, err := installer.NewPcAppsFromBom( i.cfg.KubeClient, bomPath, DefaultNamespace, i.cfg.PCAppsValues, - i.cfg.Config.PcApps, + values, ) if err != nil { return fmt.Errorf("failed to initialize pc-apps installer: %w", err) diff --git a/internal/installer/openfga_pc_apps.go b/internal/installer/openfga_pc_apps.go new file mode 100644 index 000000000..00d29a863 --- /dev/null +++ b/internal/installer/openfga_pc_apps.go @@ -0,0 +1,116 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer + +import ( + "log" + + "github.com/codesphere-cloud/oms/internal/installer/files" +) + +// openFgaPresharedKeysSecret is the Secret the openfga chart reads the preshared key from. +// Its content is synced out of the installation vault by the chart's own ExternalSecret, so +// oms only has to name it. +const openFgaPresharedKeysSecret = "openfga-preshared-keys" + +// OpenFgaPcAppsValues derives the pc-applications values for OpenFGA. They are the *base* of +// the pc-apps values: an explicit `pcApps` block in config.yaml and any --pc-apps-values file +// still override them. Returns nil when there is nothing to say, leaving the chart defaults +// untouched. +func OpenFgaPcAppsValues(config *files.RootConfig, vault *files.InstallVault) files.ChartValues { + application := files.ChartValues{} + chartValues := files.ChartValues{} + + if fga := config.Codesphere.OpenFga; fga != nil { + application["enabled"] = fga.DeploysOpenFga() + + if fga.Expose != nil { + chartValues["gateway"] = gatewayValues(config, fga.Expose) + } + } + + if authn := authnValues(vault); authn != nil { + chartValues["openfga"] = files.ChartValues{"authn": authn} + } + + if len(chartValues) > 0 { + application["valuesObject"] = chartValues + } + + if len(application) == 0 { + return nil + } + + return files.ChartValues{ + "applications": files.ChartValues{ + "openfga": application, + }, + } +} + +// authnValues makes OpenFGA require the preshared key exactly when the installation has one, +// so it stays in step with the Codesphere services: they read the same vault entry and treat +// it as optional too. Returns nil for an installation without the key, which runs an +// unauthenticated OpenFGA. Services that started before the key existed only send it once +// their pods roll. +func authnValues(vault *files.InstallVault) files.ChartValues { + if !hasOpenFgaPresharedKey(vault) { + log.Printf( + "OpenFGA: %s is not in the vault, deploying OpenFGA without authentication."+ + " Add the key with `oms update install-config` — a future version will require it.\n", + files.SecretOpenFgaPresharedKey, + ) + + return nil + } + + return files.ChartValues{ + "method": "preshared", + "preshared": files.ChartValues{ + "keysSecret": openFgaPresharedKeysSecret, + }, + } +} + +// gatewayValues publishes a locally deployed OpenFGA through the Codesphere gateway, so the +// Codesphere services of the other data centers can reach it. +func gatewayValues(config *files.RootConfig, expose *files.OpenFgaExposeConfig) files.ChartValues { + gateway := files.ChartValues{"enabled": expose.Enabled} + if expose.Host != "" { + gateway["host"] = expose.Host + } + + // The cert-manager ClusterIssuer the cluster step creates is named after the + // configured issuer type, so the gateway certificate follows the same issuer as + // the Codesphere frontend gateway. + gateway["tls"] = files.ChartValues{ + "certificate": files.ChartValues{ + "issuerRef": files.ChartValues{"name": certIssuerName(config)}, + }, + } + + return gateway +} + +// hasOpenFgaPresharedKey reports whether the vault holds a usable preshared key. A vault +// written by an older oms has no entry at all; `oms update install-config` adds one. +func hasOpenFgaPresharedKey(vault *files.InstallVault) bool { + if vault == nil { + return false + } + + secret := vault.GetSecret(files.SecretOpenFgaPresharedKey) + + return secret != nil && secret.Fields != nil && secret.Fields.Password != "" +} + +// certIssuerName returns the name of the ClusterIssuer for this installation, matching the +// naming the cluster step uses (the issuer type is the issuer name). +func certIssuerName(config *files.RootConfig) string { + if issuer := config.Codesphere.CertIssuer; issuer != nil && issuer.Type != "" { + return string(issuer.Type) + } + + return string(files.CertIssuerTypeSelfSigned) +} diff --git a/internal/installer/openfga_pc_apps_test.go b/internal/installer/openfga_pc_apps_test.go new file mode 100644 index 000000000..bc502a269 --- /dev/null +++ b/internal/installer/openfga_pc_apps_test.go @@ -0,0 +1,154 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/files" +) + +var _ = Describe("OpenFgaPcAppsValues", func() { + configWith := func(fga *files.OpenFgaConfig, issuer files.CertIssuerType) *files.RootConfig { + config := &files.RootConfig{} + config.Codesphere.OpenFga = fga + config.Codesphere.CertIssuer = &files.CertIssuerConfig{Type: issuer} + + return config + } + + // A vault of an installation that has no preshared key, i.e. everything written + // before oms started generating one. + emptyVault := func() *files.InstallVault { + return &files.InstallVault{} + } + + vaultWithPresharedKey := func() *files.InstallVault { + return &files.InstallVault{Secrets: []files.SecretEntry{{ + Name: files.SecretOpenFgaPresharedKey, + Fields: &files.SecretFields{Password: "0123456789abcdef"}, + }}} + } + + // The application entry of the rendered values, or nil if there is none. + openfgaValues := func(values files.ChartValues) files.ChartValues { + apps, ok := values["applications"].(files.ChartValues) + Expect(ok).To(BeTrue(), "expected an applications map") + + return apps["openfga"].(files.ChartValues) + } + + // The authn block the openfga chart is configured with, or nil if there is none. + authnValues := func(values files.ChartValues) files.ChartValues { + chartValues, ok := openfgaValues(values)["valuesObject"].(files.ChartValues) + if !ok { + return nil + } + + openfga, ok := chartValues["openfga"].(files.ChartValues) + if !ok { + return nil + } + + return openfga["authn"].(files.ChartValues) + } + + It("leaves the chart defaults alone when the config says nothing", func() { + Expect(installer.OpenFgaPcAppsValues(configWith(nil, ""), emptyVault())).To(BeNil()) + }) + + It("disables the application for a data center that uses a remote OpenFGA", func() { + deploy := false + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{ + Deploy: &deploy, + APIURL: "https://openfga.1.cs.example.com", + }, files.CertIssuerTypeACME), emptyVault()) + + fga := openfgaValues(values) + Expect(fga["enabled"]).To(BeFalse()) + // Nothing to expose, so the gateway is not configured at all. + Expect(fga).NotTo(HaveKey("valuesObject")) + }) + + It("defaults to deploying when only the exposure is configured", func() { + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + }, files.CertIssuerTypeACME), emptyVault()) + + fga := openfgaValues(values) + Expect(fga["enabled"]).To(BeTrue()) + + gateway := fga["valuesObject"].(files.ChartValues)["gateway"].(files.ChartValues) + Expect(gateway["enabled"]).To(BeTrue()) + Expect(gateway["host"]).To(Equal("openfga.1.cs.example.com")) + }) + + It("issues the gateway certificate with the installation's cert issuer", func() { + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + }, files.CertIssuerTypeACME), emptyVault()) + + gateway := openfgaValues(values)["valuesObject"].(files.ChartValues)["gateway"].(files.ChartValues) + issuerRef := gateway["tls"].(files.ChartValues)["certificate"].(files.ChartValues)["issuerRef"].(files.ChartValues) + Expect(issuerRef["name"]).To(Equal("acme")) + }) + + It("falls back to the self-signed issuer when no cert issuer is configured", func() { + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + }, ""), emptyVault()) + + gateway := openfgaValues(values)["valuesObject"].(files.ChartValues)["gateway"].(files.ChartValues) + issuerRef := gateway["tls"].(files.ChartValues)["certificate"].(files.ChartValues)["issuerRef"].(files.ChartValues) + Expect(issuerRef["name"]).To(Equal("self-signed")) + }) + + It("falls back to the self-signed issuer when the cert issuer block is absent", func() { + config := configWith(&files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + }, "") + config.Codesphere.CertIssuer = nil + + values := installer.OpenFgaPcAppsValues(config, emptyVault()) + + gateway := openfgaValues(values)["valuesObject"].(files.ChartValues)["gateway"].(files.ChartValues) + issuerRef := gateway["tls"].(files.ChartValues)["certificate"].(files.ChartValues)["issuerRef"].(files.ChartValues) + Expect(issuerRef["name"]).To(Equal("self-signed")) + }) + + It("leaves OpenFGA unauthenticated while the vault has no preshared key", func() { + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{}, ""), emptyVault()) + + Expect(authnValues(values)).To(BeNil()) + }) + + It("requires the preshared key once the vault holds one", func() { + values := installer.OpenFgaPcAppsValues(configWith(nil, ""), vaultWithPresharedKey()) + + authn := authnValues(values) + Expect(authn["method"]).To(Equal("preshared")) + Expect(authn["preshared"].(files.ChartValues)["keysSecret"]).To(Equal("openfga-preshared-keys")) + }) + + It("keeps the gateway configuration when authentication is derived as well", func() { + values := installer.OpenFgaPcAppsValues(configWith(&files.OpenFgaConfig{ + Expose: &files.OpenFgaExposeConfig{Enabled: true, Host: "openfga.1.cs.example.com"}, + }, files.CertIssuerTypeACME), vaultWithPresharedKey()) + + Expect(authnValues(values)["method"]).To(Equal("preshared")) + gateway := openfgaValues(values)["valuesObject"].(files.ChartValues)["gateway"].(files.ChartValues) + Expect(gateway["host"]).To(Equal("openfga.1.cs.example.com")) + }) + + It("ignores an entry that is present but empty", func() { + vault := &files.InstallVault{Secrets: []files.SecretEntry{{ + Name: files.SecretOpenFgaPresharedKey, + Fields: &files.SecretFields{Password: ""}, + }}} + + Expect(installer.OpenFgaPcAppsValues(configWith(nil, ""), vault)).To(BeNil()) + }) +}) From 96dec98ea27683cbafc6978035f949d581e41cec Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:11:31 +0200 Subject: [PATCH 012/132] update(deps): update module helm.sh/helm/v4 to v4.2.4 (#689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [helm.sh/helm/v4](https://redirect.github.com/helm/helm) | `v4.2.3` → `v4.2.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/helm.sh%2fhelm%2fv4/v4.2.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/helm.sh%2fhelm%2fv4/v4.2.3/v4.2.4?slim=true) | --- ### Release Notes
helm/helm (helm.sh/helm/v4) ### [`v4.2.4`](https://redirect.github.com/helm/helm/releases/tag/v4.2.4): Helm v4.2.4 [Compare Source](https://redirect.github.com/helm/helm/compare/v4.2.3...v4.2.4) Helm v4.2.4 is a patch release. Users are encouraged to upgrade for the best experience. The community keeps growing, and we'd love to see you there! - Join the discussion in [Kubernetes Slack](https://kubernetes.slack.com): - for questions and just to hang out - for discussing PRs, code, and bugs - Hang out at the Public Developer Call: Thursday, 9:30 Pacific via [Zoom](https://zoom-lfx.platform.linuxfoundation.org/meeting/91295593969?password=17825db5-c698-44cc-9f00-ef1f61f5d3fb) - Test, debug, and contribute charts: [ArtifactHub/packages](https://artifacthub.io/packages/search?kind=0) #### Notable Changes - fix: Improve error reporting for helm template --debug with --show-only- [#​31185](https://redirect.github.com/helm/helm/issues/31185) by [@​kyokuping](https://redirect.github.com/kyokuping) - fix: fetch logs from all containers in test pods- [#​32099](https://redirect.github.com/helm/helm/issues/32099) by [@​SebTardif](https://redirect.github.com/SebTardif) - fix(provenance): check error return in Digest and encodeRelease- [#​32136](https://redirect.github.com/helm/helm/issues/32136) by [@​SebTardif](https://redirect.github.com/SebTardif) - fix panic on repeated IsReachable calls- [#​32184](https://redirect.github.com/helm/helm/issues/32184) by [@​atkrad](https://redirect.github.com/atkrad) - fix: set \[pull,push] scope when helm push to a registry(use token auth) - v4- [#​31211](https://redirect.github.com/helm/helm/issues/31211) by [@​kimsungmin1](https://redirect.github.com/kimsungmin1) - Fix missing conflict retry with server-side apply- [#​32088](https://redirect.github.com/helm/helm/issues/32088) by [@​Kajot-dev](https://redirect.github.com/Kajot-dev) - Properly format the extra field in gzipped packages- [#​31884](https://redirect.github.com/helm/helm/issues/31884) by [@​ouillie](https://redirect.github.com/ouillie) - Fix vanishing empty lines- [#​32327](https://redirect.github.com/helm/helm/issues/32327) by [@​matheuscscp](https://redirect.github.com/matheuscscp) - fix: pass registry client to downloader.Manager in upgrade- [#​32400](https://redirect.github.com/helm/helm/issues/32400) by [@​SetagGnaw](https://redirect.github.com/SetagGnaw) - chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.82.1- [#​32450](https://redirect.github.com/helm/helm/issues/32450) - fix: bump go.opentelemetry.io/otel to v1.44.0 for GO-2026-5158- [#​32521](https://redirect.github.com/helm/helm/issues/32521) by [@​TerryHowe](https://redirect.github.com/TerryHowe) #### Installation and Upgrading Download Helm v4.2.4. The common platform binaries are here: - [MacOS amd64](https://get.helm.sh/helm-v4.2.4-darwin-amd64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-darwin-amd64.tar.gz.sha256sum) / 6c163d687ca03c3b5c01928e53bbbcf9518278f47ce7a2f249a5a08e8bdaa2bc) - [MacOS arm64](https://get.helm.sh/helm-v4.2.4-darwin-arm64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-darwin-arm64.tar.gz.sha256sum) / d747eb4e28bd2727173d15b759fa0a17822291ec09db7ced3d55af290a3661a2) - [Linux amd64](https://get.helm.sh/helm-v4.2.4-linux-amd64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-amd64.tar.gz.sha256sum) / c306b46f719b0a4da32d0f78ee21bf90ce8d602f15b22ab753f0674d1670a7f3) - [Linux arm](https://get.helm.sh/helm-v4.2.4-linux-arm.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-arm.tar.gz.sha256sum) / 894e901f7daaf9b458baad7b5c685bfeef49070d7d53f99687bd5846a6c13639) - [Linux arm64](https://get.helm.sh/helm-v4.2.4-linux-arm64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-arm64.tar.gz.sha256sum) / 564de2191b881e9f71b5606b25345821ea1682f06ab90499d3ab22b530176da1) - [Linux i386](https://get.helm.sh/helm-v4.2.4-linux-386.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-386.tar.gz.sha256sum) / 45297aeac0c65173a89e8de832997f952ba5115c2db09b2e3f2c23a601e70583) - [Linux loong64](https://get.helm.sh/helm-v4.2.4-linux-loong64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-loong64.tar.gz.sha256sum) / faafbfecc1a06196e650c3ce0c74d5ac32cb1c0c0a855fa76e59dd100cb8d4c4) - [Linux ppc64le](https://get.helm.sh/helm-v4.2.4-linux-ppc64le.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-ppc64le.tar.gz.sha256sum) / 5c00073e9d493de201384bb7eb19d60615bd7c39db52148473e8ce6da84bc70a) - [Linux s390x](https://get.helm.sh/helm-v4.2.4-linux-s390x.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-s390x.tar.gz.sha256sum) / 5396a35fca5fa46e5614140363f389ce66f96886c1b25f256d9e3028299422fa) - [Linux riscv64](https://get.helm.sh/helm-v4.2.4-linux-riscv64.tar.gz) ([checksum](https://get.helm.sh/helm-v4.2.4-linux-riscv64.tar.gz.sha256sum) / d8532a3524ca842887b15ab794377dc9c8ced8f26264c84171b4b0aafff05411) - [Windows amd64](https://get.helm.sh/helm-v4.2.4-windows-amd64.zip) ([checksum](https://get.helm.sh/helm-v4.2.4-windows-amd64.zip.sha256sum) / e94d83a4706fd82078c98dade2079fa9d9680c1c2bfb93bfc304ee6bc2412a32) - [Windows arm64](https://get.helm.sh/helm-v4.2.4-windows-arm64.zip) ([checksum](https://get.helm.sh/helm-v4.2.4-windows-arm64.zip.sha256sum) / dbe8b49ea9877abe3d77354a792efb01920da9f65a492fcb8b4fce4e08bbae8f) This release was signed with `208D D36E D5BB 3745 A167 43A4 C7C6 FBB5 B91C 1155` and can be found at [@​scottrigby](https://redirect.github.com/scottrigby) [keybase account](https://keybase.io/r6by). Please use the attached signatures for verifying this release using `gpg`. The [Quickstart Guide](https://helm.sh/docs/intro/quickstart/) will get you going from there. For **upgrade instructions** or detailed installation notes, check the [install guide](https://helm.sh/docs/intro/install/). You can also use a [script to install](https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4) on any system with `bash`. #### What's Next - 4.3.0 and 3.22.0 are the next minor releases scheduled for September 9, 2026 #### Changelog - Minimal fix to build failure from [#​31211](https://redirect.github.com/helm/helm/issues/31211). [`3900f43`](https://redirect.github.com/helm/helm/commit/3900f434fd3ef2b84065dc04508df48f288dba00) (Scott Rigby) - fix: bump go.opentelemetry.io/otel to v1.44.0 for GO-2026-5158 ([#​32521](https://redirect.github.com/helm/helm/issues/32521)) [`f7c6e8f`](https://redirect.github.com/helm/helm/commit/f7c6e8f0f1e0e649e8d03b1535db4f3b8d0c9af2) (Terry Howe) - chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.82.1 [`035a2c3`](https://redirect.github.com/helm/helm/commit/035a2c38e9a75ca0988c8449c0b7257f30d04064) (dependabot\[bot]) - fix: pass registry client to downloader.Manager in upgrade [`f76a5f4`](https://redirect.github.com/helm/helm/commit/f76a5f46a952f731cc1543f348121297c8b3f6cc) (Gates Wang) - Apply suggestions [`5a7c6c7`](https://redirect.github.com/helm/helm/commit/5a7c6c7c732b04ad6517b452d538da9e18993d67) (Will Noble) - Properly format the extra field in gzipped packages [`2281848`](https://redirect.github.com/helm/helm/commit/22818486ce0fc18d92e01ba39faf65f70ffa8865) (Will Noble) - Fix missing conflict retry with server-side apply ([#​32088](https://redirect.github.com/helm/helm/issues/32088)) [`2c979a1`](https://redirect.github.com/helm/helm/commit/2c979a17ac6b6d7bfe2d6650b69fa9effe963d4d) (Jakub Jaruszewski) - Potential fix for pull request finding [`2bd2c66`](https://redirect.github.com/helm/helm/commit/2bd2c66544634e419ede3cfa18952cce5a5acd08) (kimsungmin1) - fix(registry): resolve golangci-lint issues in token-auth tests [`183a540`](https://redirect.github.com/helm/helm/commit/183a5402291c553898b9c404bc17c95c81ea1c6c) (kimsm28) - chore: go mod tidy after rebase on main [`08d8da1`](https://redirect.github.com/helm/helm/commit/08d8da1aa9080772e57ab5bf5b00b3c13364af00) (kimsm28) - fix(registry): use plain-http registry in token-auth scope test [`9655b5a`](https://redirect.github.com/helm/helm/commit/9655b5aecc0d36142d0620ff5ed762065a997739) (kimsm28) - Update pkg/registry/client.go [`430dfac`](https://redirect.github.com/helm/helm/commit/430dfac3eeab03886f511761e3969f738f760364) (Terry Howe) - test: improve client\_scope\_test.go to avoid data races and brittle assertions [`9569605`](https://redirect.github.com/helm/helm/commit/9569605eccf8318fe25bf78c46c4eb462ce8fc3f) (kimsm28) - fix typos in withScopeHint function comment [`63f2b68`](https://redirect.github.com/helm/helm/commit/63f2b6809919e5e8e3e04f52064a536a14f1ff9b) (kimsm28) - fix registry test failures by adjusting DockerRegistryHost and auth server listener management [`f7488c0`](https://redirect.github.com/helm/helm/commit/f7488c0be8c65dd16386c215cac4332900667278) (kimsm28) - fix variable naming requestUrl -> requestURL [`8fe78fb`](https://redirect.github.com/helm/helm/commit/8fe78fbe46eb2db5c75ab1cc89699c750017dca6) (kimsm28) - fix typo, remove unnecessary code, fix to avoid to use the assertion in http hanlder [`d0670d2`](https://redirect.github.com/helm/helm/commit/d0670d2fb2c3426cde4b41927b5e9b8b4370df93) (kimsm28) - change suite.Nil, suite.NotNill to more proper function(suite.NoError, suite.Error) [`804256e`](https://redirect.github.com/helm/helm/commit/804256ef659226f26b2222ccb8f9cf18ef1b1946) (kimsungmin1) - change client\_scope\_test.go to use httptest [`d79bceb`](https://redirect.github.com/helm/helm/commit/d79bceb807692512461d8007040c41bcd1547041) (kimsungmin1) - fix typo [`d34fcd9`](https://redirect.github.com/helm/helm/commit/d34fcd9264225a1e6296c4b0ee124dc69f3b3ecc) (kimsungmin1) - remove freeport dependency [`9fbd190`](https://redirect.github.com/helm/helm/commit/9fbd190c30addb4786e4fe930a0fe98bf354116a) (kimsungmin1) - add newline in license header [`9275661`](https://redirect.github.com/helm/helm/commit/9275661357afdfe12b8ce561e8103673f16cca8d) (kimsungmin1) - fix scope when helm push to a registry that use token auth [`fef91f3`](https://redirect.github.com/helm/helm/commit/fef91f3e6942a20148542461eaebfb24f2c09584) (kimsungmin1) - fix panic on repeated IsReachable calls [`e89ce68`](https://redirect.github.com/helm/helm/commit/e89ce68bc5fec430bc1e2f0aef1aca6a2e71f795) (Mohammad Abdolirad) - fix(provenance): check error return in Digest [`ff1ac83`](https://redirect.github.com/helm/helm/commit/ff1ac83bfb1246cdf1b57a4db0042085cc8b265d) (Sebastien Tardif) - fix: address review feedback [`4b4dedb`](https://redirect.github.com/helm/helm/commit/4b4dedb2bdcfac886c124a361a5126e3c5e3c5df) (Sebastien Tardif) - fix: fetch logs from all containers in test pods [`7c80103`](https://redirect.github.com/helm/helm/commit/7c8010322b8639cdf7844ac1ae5f8d444db43935) (Sebastien Tardif) - chore: rename savedErr to clear its specific purpose [`ecc9cd2`](https://redirect.github.com/helm/helm/commit/ecc9cd2f1b5b53dadcd12395c032bc5b3ca02937) (Jeaeun Kim) - chore: fix lint [`f6211ba`](https://redirect.github.com/helm/helm/commit/f6211ba49bfbf5768ea44be3a1402869a4709b37) (Jeaeun Kim) - chore: store err separately for clarity [`3507ea5`](https://redirect.github.com/helm/helm/commit/3507ea5bfdbad921684ac131896b6968c76e9ca6) (Jeaeun Kim) - chore: Improve error reporting for `helm template --debug` with `--show-only` [`211ffae`](https://redirect.github.com/helm/helm/commit/211ffae93d2d741a2dbcd74b4aa2a1bc2fc27d5f) (Jeaeun Kim) - Address review comments [`51a9837`](https://redirect.github.com/helm/helm/commit/51a9837ba177812c381515886c4f0cd0b7a633e6) (Matheus Pimenta) - Fix vanishing empty lines [`83a8b70`](https://redirect.github.com/helm/helm/commit/83a8b70ffc1bcf97bb293cf6b35bd3b5093e8c30) (Matheus Pimenta) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 12 ++++++------ go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/NOTICE b/NOTICE index 356c7ff32..33e78a843 100644 --- a/NOTICE +++ b/NOTICE @@ -199,7 +199,7 @@ License URL: https://github.com/beorn7/perks/blob/v1.0.1/LICENSE Module: github.com/blang/semver/v4 Version: v4.0.0 License: MIT -License URL: https://github.com/blang/semver/blob/v4.0.0/LICENSE +License URL: https://github.com/blang/semver/blob/v4.0.0/v4/LICENSE ---------- Module: github.com/bmatcuk/doublestar/v4 @@ -385,7 +385,7 @@ License URL: https://github.com/emirpasic/gods/blob/v1.18.1/LICENSE Module: github.com/evanphx/json-patch/v5 Version: v5.9.11 License: BSD-3-Clause -License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/LICENSE +License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/v5/LICENSE ---------- Module: github.com/exponent-io/jsonpath @@ -709,7 +709,7 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. Module: github.com/googleapis/gax-go/v2 Version: v2.23.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1471,7 +1471,7 @@ License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE Module: gomodules.xyz/jsonpatch/v2 Version: v2.5.0 License: Apache-2.0 -License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/LICENSE +License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api @@ -1553,9 +1553,9 @@ License URL: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE ---------- Module: helm.sh/helm/v4 -Version: v4.2.3 +Version: v4.2.4 License: Apache-2.0 -License URL: https://github.com/helm/helm/blob/v4.2.3/LICENSE +License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE ---------- Module: k8s.io/api diff --git a/go.mod b/go.mod index c50427bf0..8dbca4f39 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( google.golang.org/grpc v1.83.0 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v4 v4.2.3 + helm.sh/helm/v4 v4.2.4 k8s.io/api v0.36.3 k8s.io/apimachinery v0.36.3 k8s.io/client-go v12.0.0+incompatible diff --git a/go.sum b/go.sum index 9f3d7e64e..f76089060 100644 --- a/go.sum +++ b/go.sum @@ -6823,8 +6823,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -helm.sh/helm/v4 v4.2.3 h1:JEejtPE04+SvyRomOfgRXVxyJ/lude7eShio30oQr0Y= -helm.sh/helm/v4 v4.2.3/go.mod h1:azI2XpxowOGXAgzeXcqyfskUmIfILqIcJxiFw1M6PuM= +helm.sh/helm/v4 v4.2.4 h1:qIysMI0JpTC4WXf3AQ99V6rZGT0+gO0Ww8IOnnUnaZk= +helm.sh/helm/v4 v4.2.4/go.mod h1:ZP8nFdYe7jG1PTQelKzQXQ7m09/ruhMTrpDAf+OL5ms= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 356c7ff32..33e78a843 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -199,7 +199,7 @@ License URL: https://github.com/beorn7/perks/blob/v1.0.1/LICENSE Module: github.com/blang/semver/v4 Version: v4.0.0 License: MIT -License URL: https://github.com/blang/semver/blob/v4.0.0/LICENSE +License URL: https://github.com/blang/semver/blob/v4.0.0/v4/LICENSE ---------- Module: github.com/bmatcuk/doublestar/v4 @@ -385,7 +385,7 @@ License URL: https://github.com/emirpasic/gods/blob/v1.18.1/LICENSE Module: github.com/evanphx/json-patch/v5 Version: v5.9.11 License: BSD-3-Clause -License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/LICENSE +License URL: https://github.com/evanphx/json-patch/blob/v5.9.11/v5/LICENSE ---------- Module: github.com/exponent-io/jsonpath @@ -709,7 +709,7 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. Module: github.com/googleapis/gax-go/v2 Version: v2.23.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1471,7 +1471,7 @@ License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE Module: gomodules.xyz/jsonpatch/v2 Version: v2.5.0 License: Apache-2.0 -License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/LICENSE +License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api @@ -1553,9 +1553,9 @@ License URL: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE ---------- Module: helm.sh/helm/v4 -Version: v4.2.3 +Version: v4.2.4 License: Apache-2.0 -License URL: https://github.com/helm/helm/blob/v4.2.3/LICENSE +License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE ---------- Module: k8s.io/api From 8c5e88e2e145ed34dbf073b4e78bef717b84318c Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:12:01 +0200 Subject: [PATCH 013/132] update(deps): update github.com/rook/rook/pkg/apis digest to 9aed6d7 (#690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `efb7995` → `9aed6d7` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 33e78a843..13455b113 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812192858-efb799561cab +Version: v0.0.0-20260813163907-9aed6d79c17a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/efb799561cab/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/9aed6d79c17a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 8dbca4f39..00b2ec47d 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab + github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a ) require ( diff --git a/go.sum b/go.sum index f76089060..466d23935 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab h1:vbY6yfOHv89ngAHWnao66Qp937TxW/E55ACDEIycb48= -github.com/rook/rook/pkg/apis v0.0.0-20260812192858-efb799561cab/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a h1:6k8ogL7q9VOi+5b76L4qA6PYDxDxlvk6ewbjMsBH0Fk= +github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 33e78a843..13455b113 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260812192858-efb799561cab +Version: v0.0.0-20260813163907-9aed6d79c17a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/efb799561cab/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/9aed6d79c17a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 2506e2a1e3508ceffb1762ab7230c6de25713374 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Thu, 13 Aug 2026 21:10:53 +0200 Subject: [PATCH 014/132] update(deps): update go module directive to v1.26.6 (#691) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [go](https://go.dev/) ([source](https://redirect.github.com/golang/go)) | golang | patch | `1.26.5` → `1.26.6` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 00b2ec47d..e138d210c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/codesphere-cloud/oms -go 1.26.5 +go 1.26.6 replace ( // GoReleaser pulls github.com/chrismellard/docker-credential-acr-env, From 63e7dbfac6882cc927d15072669b7855685185f3 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Fri, 14 Aug 2026 02:19:57 +0200 Subject: [PATCH 015/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.22.0 (#692) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.21.0` → `v1.22.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.22.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.21.0/v1.22.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.22.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.22.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.21.0...v1.22.0) #### Changelog - [`4fc6cad`](https://redirect.github.com/codesphere-cloud/cs-go/commit/4fc6cade61d2ad1fbb206945ba5e0d987918f127) update(deps): update go module directive to v1.26.6 ([#​304](https://redirect.github.com/codesphere-cloud/cs-go/issues/304)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 13455b113..5d47e1456 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.21.0 +Version: v1.22.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.21.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.22.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index e138d210c..c211bce81 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( filippo.io/age v1.3.1 github.com/Masterminds/semver/v3 v3.5.0 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.21.0 + github.com/codesphere-cloud/cs-go v1.22.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/jedib0t/go-pretty/v6 v6.8.3 diff --git a/go.sum b/go.sum index 466d23935..5a6c9cb75 100644 --- a/go.sum +++ b/go.sum @@ -3219,8 +3219,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.21.0 h1:+9NQvhtGtQaZbTmV+/mSb/Dc9VwLTRZuNxXygnd9yeE= -github.com/codesphere-cloud/cs-go v1.21.0/go.mod h1:/l1HlPrs6jR93MUnMBOsFsrUUkoEB/U6Kn+kHKmqs98= +github.com/codesphere-cloud/cs-go v1.22.0 h1:jvLut2jr6qulKsNICUCSk03oCgCFAZGco+6JyYWmbx4= +github.com/codesphere-cloud/cs-go v1.22.0/go.mod h1:p8751a/hY3yONn3AcC7dPi/t43OpvYN+yUqwe9oPSyU= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 13455b113..5d47e1456 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.21.0 +Version: v1.22.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.21.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.22.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 9646effad4900aa29326de6bd5670e5f811c993a Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:17:43 +0200 Subject: [PATCH 016/132] update(deps): update module golang.org/x/mod to v0.40.0 (#693) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/mod](https://pkg.go.dev/golang.org/x/mod) | [`v0.39.0` → `v0.40.0`](https://cs.opensource.google/go/x/mod/+/refs/tags/v0.39.0...refs/tags/v0.40.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fmod/v0.40.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fmod/v0.39.0/v0.40.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 8 ++++---- go.mod | 6 +++--- go.sum | 12 ++++++------ internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/NOTICE b/NOTICE index 5d47e1456..7473a7a98 100644 --- a/NOTICE +++ b/NOTICE @@ -1421,15 +1421,15 @@ License URL: https://cs.opensource.google/go/x/crypto/+/v0.55.0:LICENSE ---------- Module: golang.org/x/mod/semver -Version: v0.39.0 +Version: v0.40.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.39.0:LICENSE +License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE ---------- Module: golang.org/x/net -Version: v0.57.0 +Version: v0.58.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/net/+/v0.57.0:LICENSE +License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 diff --git a/go.mod b/go.mod index c211bce81..c1a84edaf 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/stretchr/testify v1.11.1 go.yaml.in/yaml/v3 v3.0.5 golang.org/x/crypto v0.55.0 - golang.org/x/mod v0.39.0 + golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 google.golang.org/api v0.293.0 @@ -654,11 +654,11 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.yaml.in/yaml/v4 v4.0.0-rc.6 // indirect - golang.org/x/net v0.57.0 // indirect + golang.org/x/net v0.58.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.41.0 // indirect - golang.org/x/tools v0.48.0 // indirect + golang.org/x/tools v0.49.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 5a6c9cb75..2f01e55fe 100644 --- a/go.sum +++ b/go.sum @@ -5486,8 +5486,8 @@ golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= -golang.org/x/mod v0.39.0 h1:UF5zwQdCRRUpHfyPwr7d4UrGiVeldIsogtzWVnczL74= -golang.org/x/mod v0.39.0/go.mod h1:bvIbwjQ0HUFFf5AKukeeYQG4ZBUG9yxQbR9aEweIwYY= +golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -5600,8 +5600,8 @@ golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= -golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= -golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -6061,8 +6061,8 @@ golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= -golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= -golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 5d47e1456..7473a7a98 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1421,15 +1421,15 @@ License URL: https://cs.opensource.google/go/x/crypto/+/v0.55.0:LICENSE ---------- Module: golang.org/x/mod/semver -Version: v0.39.0 +Version: v0.40.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.39.0:LICENSE +License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE ---------- Module: golang.org/x/net -Version: v0.57.0 +Version: v0.58.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/net/+/v0.57.0:LICENSE +License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 From e65a2d062a72f1e51bbd8fad18d87a2e43100c75 Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Fri, 14 Aug 2026 09:15:11 +0200 Subject: [PATCH 017/132] refac(gcp): model the data centers of a bootstrap (#625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Until now a bootstrapped project was implicitly a single data center: its nodes, gateway IPs, config paths and domains all lived directly on `CodesphereEnvironment`. Multi-DC needs more than one of each, so this introduces the `DataCenter` type holding everything that must differ per data center, while project-level state (project, VPC, jumpbox, shared postgres node, registry) stays on the environment. `BuildDataCenters` derives the layout from the flags: one entry today, and with `--multi-dc` a second one that shares the first's PostgreSQL server. The primary data center keeps an empty resource-name suffix, so every name, path and domain a single-DC bootstrap produces is unchanged. ## Review notes Nothing consumes the layout yet — the callers are migrated in the following PRs. Two mechanisms keep that migration safe: - `ensureDataCenters` derives the layout on first use and adopts state a caller passed through the legacy top-level environment fields, so every entry point works whether or not `Bootstrap` ran first — including infra files written before multi-DC support. - `mirrorPrimaryDataCenter` projects the primary data center back onto those fields before the infra file is written, so `cleanup` and `restart-vms` keep reading what they always have. The projection is one-way and never read back. --- Part of the `oms beta bootstrap-gcp --multi-dc` stack (10 PRs). Merge in order; each PR is based on its predecessor. Signed-off-by: Jona Neef Co-authored-by: Claude Opus 5 (1M context) --- internal/bootstrap/datacenter/datacenter.go | 113 +++++++++++ .../datacenter/datacenter_suite_test.go | 16 ++ .../bootstrap/datacenter/datacenter_test.go | 28 +++ internal/bootstrap/gcp/datacenter.go | 177 ++++++++++++++++++ internal/bootstrap/gcp/datacenter_test.go | 106 +++++++++++ internal/bootstrap/gcp/gcp.go | 71 ++++--- internal/bootstrap/gcp/infrafile.go | 6 + 7 files changed, 494 insertions(+), 23 deletions(-) create mode 100644 internal/bootstrap/datacenter/datacenter.go create mode 100644 internal/bootstrap/datacenter/datacenter_suite_test.go create mode 100644 internal/bootstrap/datacenter/datacenter_test.go create mode 100644 internal/bootstrap/gcp/datacenter.go create mode 100644 internal/bootstrap/gcp/datacenter_test.go diff --git a/internal/bootstrap/datacenter/datacenter.go b/internal/bootstrap/datacenter/datacenter.go new file mode 100644 index 000000000..5b9a531ee --- /dev/null +++ b/internal/bootstrap/datacenter/datacenter.go @@ -0,0 +1,113 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package datacenter models one Codesphere data center of a bootstrapped installation: the nodes +// it runs on, the addresses it is reached through, and the paths of the config and vault that +// describe it. A multi-data-center installation has one of these per data center. +// +// The model deliberately carries no reference to the infrastructure a data center runs on, so the +// bootstrap flows can share it and derive it from their own environment. +package datacenter + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/installer/node" +) + +// PrimaryID is the ID of the first data center. It stays 1 in both single- and multi-DC mode, so +// single-DC installations keep their existing dataCenter.id. +const PrimaryID = 1 + +// DataCenter holds the state of one Codesphere data center. Everything that a bootstrap shares +// between its data centers (the cloud project, the network, the jumpbox, the PostgreSQL server +// and the container registry) stays with the bootstrap; everything that must differ between them +// lives here. +type DataCenter struct { + ID int `json:"id"` + Name string `json:"name"` + // Suffix is appended to data-center-scoped resource names. It is empty for the primary + // data center, so single-DC bootstraps keep the resource names they have always used. + Suffix string `json:"suffix"` + + ControlPlaneNodes []*node.Node `json:"control_plane_nodes"` + CephNodes []*node.Node `json:"ceph_nodes"` + + GatewayIP string `json:"gateway_ip"` + PublicGatewayIP string `json:"public_gateway_ip"` + SSHProxyIP string `json:"ssh_proxy_ip"` + + // Local paths of the generated config and vault. + InstallConfigPath string `json:"-"` + SecretsFilePath string `json:"-"` + // Paths on the shared jumpbox. + RemoteConfigPath string `json:"remote_config_path"` + SecretsDir string `json:"secrets_dir"` + + WorkspaceHostingBaseDomain string `json:"workspace_hosting_base_domain"` + SSHBaseDomain string `json:"ssh_base_domain"` + + // ExternalPostgres marks a data center that uses the primary data center's PostgreSQL + // server instead of installing its own. + ExternalPostgres bool `json:"external_postgres"` + + InstallConfig *files.RootConfig `json:"-"` + ExistingConfigUsed bool `json:"-"` + // ConfigManager owns this data center's config and vault. It is not serialised, so a data + // center restored from an infra file is given a fresh one. + ConfigManager installer.InstallConfigManager `json:"-"` +} + +// IsPrimary reports whether this is the first data center of the installation. The primary data +// center owns the shared PostgreSQL server and the platform gateway that codesphere.domain +// resolves to. +func (dc *DataCenter) IsPrimary() bool { + return dc.Suffix == "" +} + +// RemoteVaultPath returns the path of this data center's vault on the jumpbox. +func (dc *DataCenter) RemoteVaultPath() string { + return filepath.Join(dc.SecretsDir, "prod.vault.yaml") +} + +// RemoteAgeKeyPath returns the path of this data center's age identity on the jumpbox. +func (dc *DataCenter) RemoteAgeKeyPath() string { + return filepath.Join(dc.SecretsDir, "age_key.txt") +} + +// K0sConfigScriptPath returns the local filename of this data center's k0s configuration script. +func (dc *DataCenter) K0sConfigScriptPath() string { + return fmt.Sprintf("configure-k0s%s.sh", dc.Suffix) +} + +// StepName qualifies a bootstrap step name with the data center it applies to. Single-DC +// bootstraps keep their unqualified step names. +func (dc *DataCenter) StepName(name string) string { + if dc.Suffix == "" { + return name + } + + return fmt.Sprintf("%s (dc %d)", name, dc.ID) +} + +// SuffixedPath inserts a data-center suffix before the file extension, turning config.yaml into +// config-dc2.yaml and prod.vault.yaml into prod-dc2.vault.yaml. The primary data center's empty +// suffix leaves the path untouched. +func SuffixedPath(path, suffix string) string { + if suffix == "" { + return path + } + + dir, file := filepath.Split(path) + + base, ext := file, "" + if idx := strings.Index(file, "."); idx > 0 { + base, ext = file[:idx], file[idx:] + } + + return filepath.Join(dir, base+suffix+ext) +} diff --git a/internal/bootstrap/datacenter/datacenter_suite_test.go b/internal/bootstrap/datacenter/datacenter_suite_test.go new file mode 100644 index 000000000..a5e64966b --- /dev/null +++ b/internal/bootstrap/datacenter/datacenter_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package datacenter_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestDataCenter(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "DataCenter Suite") +} diff --git a/internal/bootstrap/datacenter/datacenter_test.go b/internal/bootstrap/datacenter/datacenter_test.go new file mode 100644 index 000000000..edaeaec17 --- /dev/null +++ b/internal/bootstrap/datacenter/datacenter_test.go @@ -0,0 +1,28 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package datacenter_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" +) + +// The methods of DataCenter are asserted against the real layout in the gcp package's +// BuildDataCenters test, so only the path derivation is covered here. +var _ = Describe("SuffixedPath", func() { + DescribeTable("inserts the suffix before the extension", + func(path, suffix, expected string) { + Expect(datacenter.SuffixedPath(path, suffix)).To(Equal(expected)) + }, + Entry("primary keeps its path", "config.yaml", "", "config.yaml"), + Entry("single extension", "config.yaml", "-dc2", "config-dc2.yaml"), + // prod.vault.yaml must become prod-dc2.vault.yaml, not prod.vault-dc2.yaml, so the + // suffix goes before the first dot rather than the last. + Entry("compound extension", "prod.vault.yaml", "-dc2", "prod-dc2.vault.yaml"), + Entry("no extension", "config", "-dc2", "config-dc2"), + Entry("absolute path", "/etc/codesphere/config.yaml", "-dc2", "/etc/codesphere/config-dc2.yaml"), + ) +}) diff --git a/internal/bootstrap/gcp/datacenter.go b/internal/bootstrap/gcp/datacenter.go new file mode 100644 index 000000000..b1380596e --- /dev/null +++ b/internal/bootstrap/gcp/datacenter.go @@ -0,0 +1,177 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package gcp + +import ( + "fmt" + + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" + "github.com/codesphere-cloud/oms/internal/installer" +) + +// BuildDataCenters derives the data center layout from the bootstrap environment: a single +// entry in single-DC mode, and two entries in multi-DC mode where the second one shares the +// first one's PostgreSQL server. +func BuildDataCenters(env *CodesphereEnvironment, newICG func() installer.InstallConfigManager) []*datacenter.DataCenter { + if !env.MultiDC { + // A single data center keeps honouring --datacenter-id. In multi-DC mode the IDs are + // derived instead, because they drive the per-data-center domains; validateMultiDC + // rejects the combination. + id := env.DatacenterID + if id == 0 { + id = datacenter.PrimaryID + } + + return []*datacenter.DataCenter{newDataCenter(env, id, "", newICG)} + } + + return []*datacenter.DataCenter{ + newDataCenter(env, datacenter.PrimaryID, "", newICG), + newDataCenter(env, datacenter.PrimaryID+1, "-dc2", newICG), + } +} + +// ensureDataCenters makes sure the environment has a usable data center layout. It derives the +// layout on first use and gives every data center an install config manager, so any entry point +// works whether or not Bootstrap ran first. +func (b *GCPBootstrapper) ensureDataCenters() { + if len(b.Env.DataCenters) > 0 { + b.ensureConfigManagers() + return + } + + b.Env.DataCenters = BuildDataCenters(b.Env, nil) + b.adoptLegacyEnvFields() + b.ensureConfigManagers() +} + +// ensureConfigManagers gives every data center an install config manager. The primary one reuses +// the bootstrapper's, so a single-DC bootstrap behaves exactly as it did before multi-DC support. +// Data centers restored from an infra file arrive without a manager, since it is not serialised. +func (b *GCPBootstrapper) ensureConfigManagers() { + newICG := b.NewConfigManager + if newICG == nil { + newICG = installer.NewInstallConfigManager + } + + for i, dc := range b.Env.DataCenters { + if dc.ConfigManager != nil { + continue + } + + if i == 0 && b.icg != nil { + dc.ConfigManager = b.icg + continue + } + + dc.ConfigManager = newICG() + } +} + +// adoptLegacyEnvFields moves state that a caller supplied through the deprecated top-level +// environment fields into the primary data center. Infra files written before multi-DC support +// carry the primary data center's nodes and IPs there. +func (b *GCPBootstrapper) adoptLegacyEnvFields() { + primary := b.Env.DataCenters[0] + if len(primary.ControlPlaneNodes) == 0 { + primary.ControlPlaneNodes = b.Env.ControlPlaneNodes + } + + if len(primary.CephNodes) == 0 { + primary.CephNodes = b.Env.CephNodes + } + + if primary.GatewayIP == "" { + primary.GatewayIP = b.Env.GatewayIP + } + + if primary.PublicGatewayIP == "" { + primary.PublicGatewayIP = b.Env.PublicGatewayIP + } + + if primary.SSHProxyIP == "" { + primary.SSHProxyIP = b.Env.SshProxyIP + } + + if primary.InstallConfig == nil { + primary.InstallConfig = b.Env.InstallConfig + } + // A caller that supplied a config through the environment also tells us whether it is an + // existing one, which decides between generating and regenerating secrets. + if b.Env.ExistingConfigUsed { + primary.ExistingConfigUsed = true + } +} + +// mirrorPrimaryDataCenter projects the primary data center's state back onto the top-level +// environment fields it lived in before multi-DC support. The steps that still read those fields +// keep working while they are migrated one by one, and the infra file keeps the shape an earlier +// OMS wrote. The projection is one-way and never read back into a DataCenter. +func (b *GCPBootstrapper) mirrorPrimaryDataCenter() { + if len(b.Env.DataCenters) == 0 { + return + } + + primary := b.primaryDC() + b.Env.ControlPlaneNodes = primary.ControlPlaneNodes + b.Env.CephNodes = primary.CephNodes + b.Env.GatewayIP = primary.GatewayIP + b.Env.PublicGatewayIP = primary.PublicGatewayIP + b.Env.SshProxyIP = primary.SSHProxyIP + b.Env.InstallConfig = primary.InstallConfig + b.Env.ExistingConfigUsed = primary.ExistingConfigUsed +} + +// newDataCenter builds one data center, deriving its resource names, file paths and domains +// from the environment and the data-center suffix. +func newDataCenter(env *CodesphereEnvironment, id int, suffix string, newICG func() installer.InstallConfigManager) *datacenter.DataCenter { + name := env.DatacenterName + if name == "" { + name = "dev" + } + + if suffix != "" { + // The k0s cluster is named codesphere-, so the names must differ. + name += suffix + } + + dc := &datacenter.DataCenter{ + ID: id, + Name: name, + Suffix: suffix, + InstallConfigPath: datacenter.SuffixedPath(env.InstallConfigPath, suffix), + SecretsFilePath: datacenter.SuffixedPath(env.SecretsFilePath, suffix), + RemoteConfigPath: datacenter.SuffixedPath(remoteInstallConfigPath, suffix), + SecretsDir: env.SecretsDir + suffix, + WorkspaceHostingBaseDomain: workspaceHostingBaseDomain(env, id), + SSHBaseDomain: sshBaseDomain(env, id), + ExternalPostgres: suffix != "", + } + if newICG != nil { + dc.ConfigManager = newICG() + } + + return dc +} + +// workspaceHostingBaseDomain returns the domain workspaces of the given data center are served +// from. Single-DC installations keep ws.; multi-DC installations prefix it with the +// data center ID so each data center's public gateway gets its own name. +func workspaceHostingBaseDomain(env *CodesphereEnvironment, id int) string { + if !env.MultiDC { + return "ws." + env.BaseDomain + } + + return fmt.Sprintf("%d.ws.%s", id, env.BaseDomain) +} + +// sshBaseDomain returns the domain the workspace SSH proxy of the given data center is served +// from, following the same scheme as workspaceHostingBaseDomain. +func sshBaseDomain(env *CodesphereEnvironment, id int) string { + if !env.MultiDC { + return "ssh.cs." + env.BaseDomain + } + + return fmt.Sprintf("%d.ssh.cs.%s", id, env.BaseDomain) +} diff --git a/internal/bootstrap/gcp/datacenter_test.go b/internal/bootstrap/gcp/datacenter_test.go new file mode 100644 index 000000000..c5837b36b --- /dev/null +++ b/internal/bootstrap/gcp/datacenter_test.go @@ -0,0 +1,106 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package gcp_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" + "github.com/codesphere-cloud/oms/internal/bootstrap/gcp" + "github.com/codesphere-cloud/oms/internal/installer" +) + +var _ = Describe("BuildDataCenters", func() { + newEnv := func(multiDC bool) *gcp.CodesphereEnvironment { + return &gcp.CodesphereEnvironment{ + MultiDC: multiDC, + BaseDomain: "example.com", + DatacenterName: "dev", + SecretsDir: "/etc/codesphere/secrets", + InstallConfigPath: "config.yaml", + SecretsFilePath: "prod.vault.yaml", + } + } + + Context("single data center", func() { + It("keeps the paths, secrets dir and domains a single-DC bootstrap has always used", func() { + dcs := gcp.BuildDataCenters(newEnv(false), installer.NewInstallConfigManager) + + Expect(dcs).To(HaveLen(1)) + dc := dcs[0] + Expect(dc.IsPrimary()).To(BeTrue()) + Expect(dc.ID).To(Equal(1)) + Expect(dc.Name).To(Equal("dev")) + Expect(dc.Suffix).To(BeEmpty()) + Expect(dc.InstallConfigPath).To(Equal("config.yaml")) + Expect(dc.SecretsFilePath).To(Equal("prod.vault.yaml")) + Expect(dc.RemoteConfigPath).To(Equal("/etc/codesphere/config.yaml")) + Expect(dc.SecretsDir).To(Equal("/etc/codesphere/secrets")) + Expect(dc.RemoteVaultPath()).To(Equal("/etc/codesphere/secrets/prod.vault.yaml")) + Expect(dc.RemoteAgeKeyPath()).To(Equal("/etc/codesphere/secrets/age_key.txt")) + Expect(dc.K0sConfigScriptPath()).To(Equal("configure-k0s.sh")) + Expect(dc.WorkspaceHostingBaseDomain).To(Equal("ws.example.com")) + Expect(dc.SSHBaseDomain).To(Equal("ssh.cs.example.com")) + Expect(dc.ExternalPostgres).To(BeFalse()) + Expect(dc.StepName("Encrypt vault")).To(Equal("Encrypt vault")) + }) + }) + + Context("multi data center", func() { + var dcs []*datacenter.DataCenter + + BeforeEach(func() { + dcs = gcp.BuildDataCenters(newEnv(true), installer.NewInstallConfigManager) + }) + + It("builds two data centers with the second sharing the first's postgres", func() { + Expect(dcs).To(HaveLen(2)) + Expect(dcs[0].ExternalPostgres).To(BeFalse()) + Expect(dcs[1].ExternalPostgres).To(BeTrue()) + }) + + It("leaves the primary data center's resource names unsuffixed", func() { + Expect(dcs[0].Suffix).To(BeEmpty()) + Expect(dcs[0].InstallConfigPath).To(Equal("config.yaml")) + Expect(dcs[0].SecretsDir).To(Equal("/etc/codesphere/secrets")) + }) + + It("gives the secondary data center its own name, paths and secrets dir", func() { + dc := dcs[1] + Expect(dc.IsPrimary()).To(BeFalse()) + Expect(dc.ID).To(Equal(2)) + // The k0s cluster is named codesphere-, so the names must differ. + Expect(dc.Name).To(Equal("dev-dc2")) + Expect(dc.InstallConfigPath).To(Equal("config-dc2.yaml")) + Expect(dc.SecretsFilePath).To(Equal("prod-dc2.vault.yaml")) + Expect(dc.RemoteConfigPath).To(Equal("/etc/codesphere/config-dc2.yaml")) + // A separate secrets dir, so the installer cannot overwrite the primary's kubeconfig + // and ceph credentials through config.secrets.baseDir. + Expect(dc.SecretsDir).To(Equal("/etc/codesphere/secrets-dc2")) + Expect(dc.RemoteVaultPath()).To(Equal("/etc/codesphere/secrets-dc2/prod.vault.yaml")) + Expect(dc.RemoteAgeKeyPath()).To(Equal("/etc/codesphere/secrets-dc2/age_key.txt")) + Expect(dc.K0sConfigScriptPath()).To(Equal("configure-k0s-dc2.sh")) + Expect(dc.StepName("Encrypt vault")).To(Equal("Encrypt vault (dc 2)")) + }) + + It("scopes the workspace and ssh domains per data center", func() { + Expect(dcs[0].WorkspaceHostingBaseDomain).To(Equal("1.ws.example.com")) + Expect(dcs[0].SSHBaseDomain).To(Equal("1.ssh.cs.example.com")) + Expect(dcs[1].WorkspaceHostingBaseDomain).To(Equal("2.ws.example.com")) + Expect(dcs[1].SSHBaseDomain).To(Equal("2.ssh.cs.example.com")) + }) + + It("gives each data center its own config manager", func() { + Expect(dcs[0].ConfigManager).NotTo(BeIdenticalTo(dcs[1].ConfigManager)) + }) + }) + + It("falls back to the dev datacenter name", func() { + env := newEnv(false) + env.DatacenterName = "" + + Expect(gcp.BuildDataCenters(env, installer.NewInstallConfigManager)[0].Name).To(Equal("dev")) + }) +}) diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index 8e8550d93..d012e84cd 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -15,6 +15,7 @@ import ( "cloud.google.com/go/compute/apiv1/computepb" "github.com/codesphere-cloud/oms/internal/bootstrap" + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" "github.com/codesphere-cloud/oms/internal/clusteradmin" "github.com/codesphere-cloud/oms/internal/env" "github.com/codesphere-cloud/oms/internal/github" @@ -98,18 +99,38 @@ type GCPBootstrapper struct { NodeClient node.NodeClient PortalClient portal.Portal GitHubClient github.GitHubClient + // NewConfigManager creates the install config manager of a data center. Each data center + // owns its own config and vault, so multi-DC bootstraps need more than one. + NewConfigManager func() installer.InstallConfigManager +} + +// primaryDC returns the first data center, which owns the shared PostgreSQL server and the +// platform gateway that codesphere.domain resolves to. +func (b *GCPBootstrapper) primaryDC() *datacenter.DataCenter { + return b.Env.DataCenters[0] } type CodesphereEnvironment struct { - ProjectID string `json:"project_id"` - ProjectTTL string `json:"project_ttl"` - ProjectName string `json:"project_name"` - DNSProjectID string `json:"dns_project_id"` - Jumpbox *node.Node `json:"jumpbox"` - PostgreSQLNode *node.Node `json:"postgres_node"` - ControlPlaneNodes []*node.Node `json:"control_plane_nodes"` - CephNodes []*node.Node `json:"ceph_nodes"` - ContainerRegistryURL string `json:"-"` + ProjectID string `json:"project_id"` + ProjectTTL string `json:"project_ttl"` + ProjectName string `json:"project_name"` + DNSProjectID string `json:"dns_project_id"` + Jumpbox *node.Node `json:"jumpbox"` + PostgreSQLNode *node.Node `json:"postgres_node"` + // MultiDC bootstraps two data centers that share the PostgreSQL server but run separate + // Kubernetes and Ceph clusters. + MultiDC bool `json:"multi_dc"` + // DataCenters holds the per-data-center state. It always has at least one entry. + DataCenters []*datacenter.DataCenter `json:"datacenters"` + // ControlPlaneNodes and CephNodes are where the primary data center's nodes lived before + // multi-DC support. The steps that have not been migrated to DataCenters yet still use + // them, and infra files written by an earlier OMS carry the nodes here. + ControlPlaneNodes []*node.Node `json:"control_plane_nodes"` + CephNodes []*node.Node `json:"ceph_nodes"` + // ContainerRegistryURL is the resolved registry server all data centers pull images from. + ContainerRegistryURL string `json:"container_registry_url,omitempty"` + RegistryUsername string `json:"-"` + RegistryPassword string `json:"-"` ExistingConfigUsed bool `json:"-"` InstallVersion string `json:"install_version"` InstallLocal string `json:"install_local"` @@ -183,10 +204,13 @@ type CodesphereEnvironment struct { SSHPrivateKeyPath string `json:"-"` DatacenterID int `json:"-"` DatacenterName string `json:"-"` - CustomPgIP string `json:"custom_pg_ip"` - Region string `json:"region"` - Zone string `json:"zone"` - DNSZoneName string `json:"dns_zone_name"` + // DatacenterIDExplicit records whether --datacenter-id was set on the command line. The + // value alone cannot distinguish the default 1 from an explicit 1. + DatacenterIDExplicit bool `json:"-"` + CustomPgIP string `json:"custom_pg_ip"` + Region string `json:"region"` + Zone string `json:"zone"` + DNSZoneName string `json:"dns_zone_name"` // Test user creation CreateTestUser bool `json:"-"` @@ -210,16 +234,17 @@ func NewGCPBootstrapper( gitHubClient github.GitHubClient, ) (*GCPBootstrapper, error) { return &GCPBootstrapper{ - ctx: ctx, - stlog: stlog, - fw: fw, - icg: icg, - GCPClient: gcpClient, - Env: CodesphereEnv, - NodeClient: sshRunner, - PortalClient: portalClient, - Time: time, - GitHubClient: gitHubClient, + ctx: ctx, + stlog: stlog, + fw: fw, + icg: icg, + GCPClient: gcpClient, + Env: CodesphereEnv, + NodeClient: sshRunner, + PortalClient: portalClient, + Time: time, + GitHubClient: gitHubClient, + NewConfigManager: installer.NewInstallConfigManager, }, nil } diff --git a/internal/bootstrap/gcp/infrafile.go b/internal/bootstrap/gcp/infrafile.go index 72378f9f8..e9e77bfd8 100644 --- a/internal/bootstrap/gcp/infrafile.go +++ b/internal/bootstrap/gcp/infrafile.go @@ -40,6 +40,12 @@ func LoadInfraFile(fw util.FileIO, infraFilePath string) (CodesphereEnvironment, // WriteInfraFile writes details about the bootstrapped codesphere environment into a file. func (b *GCPBootstrapper) WriteInfraFile() error { + b.ensureDataCenters() + + // The steps that still write the top-level node and IP fields are migrated to DataCenters + // one by one, so keep both in sync until the last one is. + b.mirrorPrimaryDataCenter() + envBytes, err := json.MarshalIndent(b.Env, "", " ") if err != nil { return fmt.Errorf("failed to marshal codesphere env: %w", err) From 186494949e3c356d36d83d0b477b4ca923fb22a9 Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Fri, 14 Aug 2026 09:15:12 +0200 Subject: [PATCH 018/132] feat(gcp): derive the VM definitions per data center (#626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The VM list was a package-level global describing one data center. It becomes a function of the environment: the project-shared jumpbox and postgres VMs plus each data center's three Ceph and three k0s nodes, whose names carry that data center's suffix. A single-DC bootstrap therefore still gets exactly `ceph-1..3` and `k0s-1..3`. `EnsureComputeInstances` routes each instance into its own data center by the definition's `DataCenterID` instead of inferring placement from the VM's tag, and sorts each data center's nodes independently — the install config assigns roles by index. `restart-vms` resolves the valid VM names from the infra file's layout, so a node of a second data center can be restarted by name (`--name k0s-1-dc2`). It now also reads the infra file when `--project-id` and `--zone` are given, best-effort, since only the file knows the layout. ## Review notes `VMDefsForEnv` falls back to a single unsuffixed data center when the environment carries none, which is what an infra file written by an older OMS looks like. --- Part of the `oms beta bootstrap-gcp --multi-dc` stack (10 PRs). Merge in order; each PR is based on its predecessor. Signed-off-by: Jona Neef Co-authored-by: Claude Opus 5 (1M context) --- cli/cmd/bootstrap_gcp_restart_vms.go | 57 ++++--- docs/oms_beta_bootstrap-gcp_restart-vms.md | 3 + internal/bootstrap/gcp/gce.go | 165 +++++++++++++++----- internal/bootstrap/gcp/gce_test.go | 55 +++++++ internal/bootstrap/gcp/test_helpers_test.go | 10 ++ 5 files changed, 228 insertions(+), 62 deletions(-) diff --git a/cli/cmd/bootstrap_gcp_restart_vms.go b/cli/cmd/bootstrap_gcp_restart_vms.go index 900b93535..1632d034b 100644 --- a/cli/cmd/bootstrap_gcp_restart_vms.go +++ b/cli/cmd/bootstrap_gcp_restart_vms.go @@ -28,32 +28,49 @@ type BootstrapGcpRestartVMsOpts struct { Name string } -// resolveProjectAndZone returns the project ID and zone from flags or the infra file. -// If both flags are set they are used directly; if neither is set, the infra file is read. -// Providing only one of --project-id / --zone is an error. -func (c *BootstrapGcpRestartVMsCmd) resolveProjectAndZone(fw intutil.FileIO) (string, string, error) { +// resolveEnvironment returns the environment to restart VMs in. Project ID and zone come from +// the flags or, when neither is set, from the infra file. Providing only one of +// --project-id / --zone is an error. +// +// The data center layout always comes from the infra file, since it determines the VM names. It +// is read best-effort when the flags supply project and zone, in which case a missing file just +// means single-data-center names. +func (c *BootstrapGcpRestartVMsCmd) resolveEnvironment(fw intutil.FileIO) (*gcp.CodesphereEnvironment, error) { projectID := c.Opts.ProjectID zone := c.Opts.Zone if (projectID == "") != (zone == "") { - return "", "", fmt.Errorf("--project-id and --zone must be provided together") - } - if projectID != "" { - return projectID, zone, nil + return nil, fmt.Errorf("--project-id and --zone must be provided together") } infraFilePath := gcp.GetInfraFilePath() infraEnv, exists, err := gcp.LoadInfraFile(fw, infraFilePath) if err != nil { - return "", "", fmt.Errorf("failed to load infra file: %w", err) - } - if !exists { - return "", "", fmt.Errorf("infra file not found at %s; use --project-id and --zone flags", infraFilePath) + if projectID == "" { + return nil, fmt.Errorf("failed to load infra file: %w", err) + } + + log.Printf("Warning: %v", err) } - if infraEnv.ProjectID == "" || infraEnv.Zone == "" { - return "", "", fmt.Errorf("infra file is missing project ID or zone; use --project-id and --zone flags") + + if projectID == "" { + if !exists { + return nil, fmt.Errorf("infra file not found at %s; use --project-id and --zone flags", infraFilePath) + } + + if infraEnv.ProjectID == "" || infraEnv.Zone == "" { + return nil, fmt.Errorf("infra file is missing project ID or zone; use --project-id and --zone flags") + } + + projectID, zone = infraEnv.ProjectID, infraEnv.Zone } - return infraEnv.ProjectID, infraEnv.Zone, nil + + return &gcp.CodesphereEnvironment{ + ProjectID: projectID, + Zone: zone, + MultiDC: infraEnv.MultiDC, + DataCenters: infraEnv.DataCenters, + }, nil } func (c *BootstrapGcpRestartVMsCmd) RunE(_ *cobra.Command, _ []string) error { @@ -61,17 +78,14 @@ func (c *BootstrapGcpRestartVMsCmd) RunE(_ *cobra.Command, _ []string) error { stlog := bootstrap.NewStepLogger(false) fw := intutil.NewFilesystemWriter() - projectID, zone, err := c.resolveProjectAndZone(fw) + csEnv, err := c.resolveEnvironment(fw) if err != nil { return err } - gcpClient := gcp.NewGCPClient(ctx, stlog, os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")) + projectID, zone := csEnv.ProjectID, csEnv.Zone - csEnv := &gcp.CodesphereEnvironment{ - ProjectID: projectID, - Zone: zone, - } + gcpClient := gcp.NewGCPClient(ctx, stlog, os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")) bs, err := gcp.NewGCPBootstrapper( ctx, @@ -112,6 +126,7 @@ func AddBootstrapGcpRestartVMsCmd(bootstrapGcp *cobra.Command, opts *util.Global {Desc: "Restart all VMs using project info from the local infra file"}, {Cmd: "--name jumpbox", Desc: "Restart only the jumpbox VM"}, {Cmd: "--name k0s-1", Desc: "Restart a specific k0s node"}, + {Cmd: "--name k0s-1-dc2", Desc: "Restart a node of the second data center of a --multi-dc bootstrap"}, {Cmd: "--project-id my-project --zone us-central1-a", Desc: "Restart all VMs with explicit project and zone"}, {Cmd: "--project-id my-project --zone us-central1-a --name ceph-1", Desc: "Restart a specific VM with explicit project and zone"}, }), diff --git a/docs/oms_beta_bootstrap-gcp_restart-vms.md b/docs/oms_beta_bootstrap-gcp_restart-vms.md index 9eeb152ef..0f7236245 100644 --- a/docs/oms_beta_bootstrap-gcp_restart-vms.md +++ b/docs/oms_beta_bootstrap-gcp_restart-vms.md @@ -26,6 +26,9 @@ $ oms beta bootstrap-gcp restart-vms --name jumpbox # Restart a specific k0s node $ oms beta bootstrap-gcp restart-vms --name k0s-1 +# Restart a node of the second data center of a --multi-dc bootstrap +$ oms beta bootstrap-gcp restart-vms --name k0s-1-dc2 + # Restart all VMs with explicit project and zone $ oms beta bootstrap-gcp restart-vms --project-id my-project --zone us-central1-a diff --git a/internal/bootstrap/gcp/gce.go b/internal/bootstrap/gcp/gce.go index 498bfe918..0d267be6a 100644 --- a/internal/bootstrap/gcp/gce.go +++ b/internal/bootstrap/gcp/gce.go @@ -13,6 +13,7 @@ import ( "time" "cloud.google.com/go/compute/apiv1/computepb" + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" "github.com/codesphere-cloud/oms/internal/github" "github.com/codesphere-cloud/oms/internal/installer/node" "github.com/codesphere-cloud/oms/internal/util" @@ -24,18 +25,71 @@ type VMDef struct { Tags []string AdditionalDisks []int64 ExternalIP bool + // DataCenterID is the data center the VM belongs to, or 0 for the project-shared VMs + // (jumpbox and postgres) that every data center uses. + DataCenterID int } -// Example VM definitions (expand as needed) -var vmDefs = []VMDef{ - {"jumpbox", "e2-medium", []string{"jumpbox", "ssh"}, []int64{}, true}, - {"postgres", "e2-standard-2", []string{"postgres"}, []int64{}, true}, - {"ceph-1", "e2-standard-8", []string{"ceph"}, []int64{10, 100}, false}, - {"ceph-2", "e2-standard-8", []string{"ceph"}, []int64{10, 100}, false}, - {"ceph-3", "e2-standard-8", []string{"ceph"}, []int64{10, 100}, false}, - {"k0s-1", "e2-standard-8", []string{"k0s"}, []int64{}, false}, - {"k0s-2", "e2-standard-8", []string{"k0s"}, []int64{}, false}, - {"k0s-3", "e2-standard-8", []string{"k0s"}, []int64{}, false}, +// cephNodesPerDataCenter and k0sNodesPerDataCenter are the per-data-center node counts. Three +// Ceph nodes are the minimum for replication; three k0s nodes give one control plane and three +// workers, as written into the install config. +const ( + cephNodesPerDataCenter = 3 + k0sNodesPerDataCenter = 3 +) + +// sharedVMDefs returns the VMs that exist once per project, regardless of how many data centers +// are bootstrapped. The postgres node hosts the database both data centers share. +func sharedVMDefs() []VMDef { + return []VMDef{ + {Name: "jumpbox", MachineType: "e2-medium", Tags: []string{"jumpbox", "ssh"}, AdditionalDisks: []int64{}, ExternalIP: true}, + {Name: "postgres", MachineType: "e2-standard-2", Tags: []string{"postgres"}, AdditionalDisks: []int64{}, ExternalIP: true}, + } +} + +// dataCenterVMDefs returns the Ceph and k0s VMs of one data center. The suffix is empty for the +// primary data center, so single-DC bootstraps keep the names ceph-1..3 and k0s-1..3. +func dataCenterVMDefs(dcID int, suffix string) []VMDef { + defs := make([]VMDef, 0, cephNodesPerDataCenter+k0sNodesPerDataCenter) + for i := 1; i <= cephNodesPerDataCenter; i++ { + defs = append(defs, VMDef{ + Name: fmt.Sprintf("ceph-%d%s", i, suffix), + MachineType: "e2-standard-8", + Tags: []string{"ceph"}, + AdditionalDisks: []int64{10, 100}, + DataCenterID: dcID, + }) + } + + for i := 1; i <= k0sNodesPerDataCenter; i++ { + defs = append(defs, VMDef{ + Name: fmt.Sprintf("k0s-%d%s", i, suffix), + MachineType: "e2-standard-8", + Tags: []string{"k0s"}, + AdditionalDisks: []int64{}, + DataCenterID: dcID, + }) + } + + return defs +} + +// VMDefsForEnv returns every VM definition of the environment: the project-shared VMs plus the +// Ceph and k0s VMs of each data center. When the environment carries no data centers — as with +// an infra file written before multi-DC support — it falls back to a single unsuffixed one. +func VMDefsForEnv(env *CodesphereEnvironment) []VMDef { + defs := sharedVMDefs() + + dcs := env.DataCenters + if len(dcs) == 0 { + dcs = []*datacenter.DataCenter{{ID: datacenter.PrimaryID}} + } + + for _, dc := range dcs { + defs = append(defs, dataCenterVMDefs(dc.ID, dc.Suffix)...) + } + + return defs } // validateVMProvisioningOptions checks that spot and preemptible options are not both set @@ -51,20 +105,25 @@ type vmResult struct { name string externalIP string internalIP string + dcID int } // EnsureComputeInstances ensures that all required compute instances are present and running. func (b *GCPBootstrapper) EnsureComputeInstances() error { - wg := sync.WaitGroup{} - errCh := make(chan error, len(vmDefs)) - resultCh := make(chan vmResult, len(vmDefs)) - logCh := make(chan string, len(vmDefs)) + b.ensureDataCenters() + sshKeys, err := b.getSSHKeys() if err != nil { return fmt.Errorf("failed to determine SSH keys: %w", err) } - for _, vm := range vmDefs { + vms := VMDefsForEnv(b.Env) + wg := sync.WaitGroup{} + errCh := make(chan error, len(vms)) + resultCh := make(chan vmResult, len(vms)) + logCh := make(chan string, len(vms)) + + for _, vm := range vms { wg.Add(1) go func(vm VMDef) { defer wg.Done() @@ -99,6 +158,13 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { NodeClient: b.NodeClient, FileIO: b.fw, } + dcByID := map[int]*datacenter.DataCenter{} + + for _, dc := range b.Env.DataCenters { + dc.CephNodes = nil + dc.ControlPlaneNodes = nil + dcByID[dc.ID] = dc + } for result := range resultCh { switch result.vmType { case "jumpbox": @@ -106,22 +172,34 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { case "postgres": b.Env.PostgreSQLNode = b.Env.Jumpbox.CreateSubNode(result.name, result.externalIP, result.internalIP) case "ceph": - node := b.Env.Jumpbox.CreateSubNode(result.name, result.externalIP, result.internalIP) - b.Env.CephNodes = append(b.Env.CephNodes, node) + dc, ok := dcByID[result.dcID] + if !ok { + return fmt.Errorf("instance %s belongs to unknown data center %d", result.name, result.dcID) + } + + dc.CephNodes = append(dc.CephNodes, b.Env.Jumpbox.CreateSubNode(result.name, result.externalIP, result.internalIP)) case "k0s": - node := b.Env.Jumpbox.CreateSubNode(result.name, result.externalIP, result.internalIP) - b.Env.ControlPlaneNodes = append(b.Env.ControlPlaneNodes, node) + dc, ok := dcByID[result.dcID] + if !ok { + return fmt.Errorf("instance %s belongs to unknown data center %d", result.name, result.dcID) + } + + dc.ControlPlaneNodes = append(dc.ControlPlaneNodes, b.Env.Jumpbox.CreateSubNode(result.name, result.externalIP, result.internalIP)) } } - //sort ceph nodes by name to ensure consistent ordering - sort.Slice(b.Env.CephNodes, func(i, j int) bool { - return b.Env.CephNodes[i].GetName() < b.Env.CephNodes[j].GetName() - }) - //sort control plane nodes by name to ensure consistent ordering - sort.Slice(b.Env.ControlPlaneNodes, func(i, j int) bool { - return b.Env.ControlPlaneNodes[i].GetName() < b.Env.ControlPlaneNodes[j].GetName() - }) + // Sort each data center's nodes by name to ensure consistent ordering, since the install + // config assigns roles by index. + for _, dc := range b.Env.DataCenters { + sort.Slice(dc.CephNodes, func(i, j int) bool { + return dc.CephNodes[i].GetName() < dc.CephNodes[j].GetName() + }) + sort.Slice(dc.ControlPlaneNodes, func(i, j int) bool { + return dc.ControlPlaneNodes[i].GetName() < dc.ControlPlaneNodes[j].GetName() + }) + } + + b.mirrorPrimaryDataCenter() return nil } @@ -186,6 +264,7 @@ func (b *GCPBootstrapper) ensureVM(vm VMDef, rootDiskSize int64, sshKeys string, name: vm.Name, externalIP: externalIP, internalIP: internalIP, + dcID: vm.DataCenterID, }, nil } @@ -369,30 +448,33 @@ func (b *GCPBootstrapper) waitForInstanceRunning(projectID, zone, name string, n name, pollInterval*time.Duration(maxAttempts)) } -// findVMDef looks up a VM definition by name. Returns nil if not found. -func findVMDef(name string) *VMDef { - for _, vm := range vmDefs { - if vm.Name == name { - return &vm +// findVMDef looks up a VM definition by name among the given definitions. Returns nil if not +// found. +func findVMDef(defs []VMDef, name string) *VMDef { + for i := range defs { + if defs[i].Name == name { + return &defs[i] } } return nil } -// validVMNames returns the list of known VM names from vmDefs. -func validVMNames() []string { - names := make([]string, len(vmDefs)) - for i, vm := range vmDefs { +// validVMNames returns the names of the given VM definitions. +func validVMNames(defs []VMDef) []string { + names := make([]string, len(defs)) + for i, vm := range defs { names[i] = vm.Name } return names } -// RestartVM restarts a single stopped or terminated VM by a name that is defined in vmDefs. +// RestartVM restarts a single stopped or terminated VM by a name defined for this environment. func (b *GCPBootstrapper) RestartVM(name string) error { - vm := findVMDef(name) + defs := VMDefsForEnv(b.Env) + + vm := findVMDef(defs, name) if vm == nil { - return fmt.Errorf("unknown VM name %q; valid names are: %s", name, strings.Join(validVMNames(), ", ")) + return fmt.Errorf("unknown VM name %q; valid names are: %s", name, strings.Join(validVMNames(defs), ", ")) } projectID := b.Env.ProjectID @@ -431,10 +513,11 @@ func (b *GCPBootstrapper) RestartVM(name string) error { return nil } -// RestartVMs restarts all stopped or terminated VMs defined in vmDefs. +// RestartVMs restarts all stopped or terminated VMs of the environment, across every data center. func (b *GCPBootstrapper) RestartVMs() error { var errs []error - for _, vm := range vmDefs { + + for _, vm := range VMDefsForEnv(b.Env) { if err := b.RestartVM(vm.Name); err != nil { errs = append(errs, err) } diff --git a/internal/bootstrap/gcp/gce_test.go b/internal/bootstrap/gcp/gce_test.go index 5767dc78e..3ef77bd20 100644 --- a/internal/bootstrap/gcp/gce_test.go +++ b/internal/bootstrap/gcp/gce_test.go @@ -23,6 +23,61 @@ import ( var _ = Describe("GCE", func() { + Describe("VMDefsForEnv", func() { + It("keeps the names a single-data-center bootstrap has always used", func() { + env := &gcp.CodesphereEnvironment{} + env.DataCenters = gcp.BuildDataCenters(env, nil) + + defs := gcp.VMDefsForEnv(env) + + Expect(vmNames(defs)).To(Equal([]string{ + "jumpbox", "postgres", + "ceph-1", "ceph-2", "ceph-3", + "k0s-1", "k0s-2", "k0s-3", + })) + }) + + It("adds suffixed ceph and k0s nodes per additional data center", func() { + env := &gcp.CodesphereEnvironment{MultiDC: true} + env.DataCenters = gcp.BuildDataCenters(env, nil) + + defs := gcp.VMDefsForEnv(env) + + Expect(vmNames(defs)).To(Equal([]string{ + "jumpbox", "postgres", + "ceph-1", "ceph-2", "ceph-3", + "k0s-1", "k0s-2", "k0s-3", + "ceph-1-dc2", "ceph-2-dc2", "ceph-3-dc2", + "k0s-1-dc2", "k0s-2-dc2", "k0s-3-dc2", + })) + }) + + It("assigns the shared VMs to no data center and the rest to theirs", func() { + env := &gcp.CodesphereEnvironment{MultiDC: true} + env.DataCenters = gcp.BuildDataCenters(env, nil) + + byName := map[string]int{} + for _, def := range gcp.VMDefsForEnv(env) { + byName[def.Name] = def.DataCenterID + } + + Expect(byName["jumpbox"]).To(BeZero()) + Expect(byName["postgres"]).To(BeZero()) + Expect(byName["ceph-1"]).To(Equal(1)) + Expect(byName["k0s-3"]).To(Equal(1)) + Expect(byName["ceph-1-dc2"]).To(Equal(2)) + Expect(byName["k0s-3-dc2"]).To(Equal(2)) + }) + + // Infra files written before multi-DC support carry no data center list. + It("falls back to a single unsuffixed data center when the environment has none", func() { + defs := gcp.VMDefsForEnv(&gcp.CodesphereEnvironment{}) + + Expect(vmNames(defs)).To(ContainElement("k0s-1")) + Expect(vmNames(defs)).To(HaveLen(8)) + }) + }) + Describe("IsNotFoundError", func() { Context("when error is nil", func() { It("should return false", func() { diff --git a/internal/bootstrap/gcp/test_helpers_test.go b/internal/bootstrap/gcp/test_helpers_test.go index e7131a4ba..c09804361 100644 --- a/internal/bootstrap/gcp/test_helpers_test.go +++ b/internal/bootstrap/gcp/test_helpers_test.go @@ -24,6 +24,16 @@ import ( func protoString(s string) *string { return &s } +// vmNames returns the names of the given VM definitions, in order. +func vmNames(defs []gcp.VMDef) []string { + names := make([]string, len(defs)) + for i, def := range defs { + names[i] = def.Name + } + + return names +} + // makeInstance creates a computepb.Instance with the given status and IPs. func makeInstance(status, internalIP, externalIP string) *computepb.Instance { inst := &computepb.Instance{ From 8b79412ba9c928df727943826b8b3b9b16e68700 Mon Sep 17 00:00:00 2001 From: Manuel Dewald Date: Fri, 14 Aug 2026 16:09:49 +0200 Subject: [PATCH 019/132] Refactor vault handling (#642) Refactor vault handling to abstract the encryption handling. This will unify handling of vaults and allow to add new vault types in the future. The TS installer requires an encrypted SOPS vault, so `oms install codesphere` only supports the `sops` type. `oms init install-config` respects the vault type so allows to output an encrypted vault directly. --------- Signed-off-by: NautiluX <2600004+NautiluX@users.noreply.github.com> Co-authored-by: NautiluX <2600004+NautiluX@users.noreply.github.com> --- cli/cmd/beta_vault_secret.go | 24 +- cli/cmd/bootstrap_gcp.go | 6 +- cli/cmd/bootstrap_gcp_postconfig.go | 5 +- cli/cmd/bootstrap_local.go | 6 +- cli/cmd/codesphere/codesphere_suite_test.go | 16 ++ cli/cmd/codesphere/install_codesphere.go | 37 ++- .../install_codesphere_config_test.go | 16 +- .../install_codesphere_dependencies.go | 11 +- .../codesphere/install_codesphere_infra.go | 3 + .../codesphere/install_codesphere_platform.go | 5 +- cli/cmd/codesphere/install_codesphere_test.go | 3 + cli/cmd/init_install_config.go | 22 +- .../init_install_config_interactive_test.go | 12 +- cli/cmd/init_install_config_test.go | 15 +- cli/cmd/install_config_test_helpers_test.go | 23 ++ cli/cmd/install_openbao.go | 4 +- .../k0s/install_config_test_helpers_test.go | 17 ++ cli/cmd/k0s/install_k0s.go | 49 ++-- cli/cmd/k0s/install_k0s_integration_test.go | 10 +- cli/cmd/k0s/install_k0s_test.go | 27 +- cli/cmd/template_config.go | 20 +- cli/cmd/template_config_test.go | 4 +- cli/cmd/update_install_config.go | 9 +- cli/cmd/update_install_config_test.go | 55 ++-- docs/oms_beta.md | 2 +- docs/oms_beta_vault-secret.md | 11 +- docs/oms_init_install-config.md | 2 + docs/oms_install_codesphere.md | 4 +- docs/oms_install_codesphere_dependencies.md | 4 +- docs/oms_install_codesphere_infra.md | 4 +- docs/oms_install_codesphere_platform.md | 4 +- docs/oms_install_k0s.md | 1 + docs/oms_template_config.md | 9 +- docs/oms_update_install-config.md | 2 + internal/bootstrap/gcp/datacenter.go | 41 ++- internal/bootstrap/gcp/datacenter_test.go | 11 +- internal/bootstrap/gcp/gce.go | 4 +- internal/bootstrap/gcp/gce_test.go | 6 +- internal/bootstrap/gcp/gcp.go | 24 +- internal/bootstrap/gcp/gcp_test.go | 15 +- internal/bootstrap/gcp/infrafile.go | 4 +- internal/bootstrap/gcp/install_config.go | 15 +- internal/bootstrap/gcp/install_config_test.go | 95 ++++--- .../gcp/install_config_test_helpers_test.go | 16 ++ internal/bootstrap/local/local.go | 35 ++- .../installer/argocd/install_and_apps_test.go | 5 +- internal/installer/cluster_admin.go | 22 +- internal/installer/cluster_admin_test.go | 29 ++- .../config_generator_collector_test.go | 2 +- internal/installer/config_manager.go | 161 ++++-------- .../installer/config_manager_ansible_test.go | 2 +- .../installer/config_manager_profile_test.go | 14 +- .../installer/config_manager_secrets_test.go | 12 +- internal/installer/config_manager_test.go | 77 ++---- .../config_manager_test_helpers_test.go | 16 ++ internal/installer/config_template_test.go | 7 +- internal/installer/mocks.go | 57 ----- internal/installer/openbao.go | 6 +- .../vault/internal/filebackend/file.go | 130 ++++++++++ .../vault/internal/filebackend/file_test.go | 35 +++ internal/installer/vault/mocks.go | 198 --------------- internal/installer/vault/plain/plain.go | 87 +++++++ internal/installer/vault/sops/encryption.go | 185 ++++++++++++++ internal/installer/vault/sops/sops.go | 212 ++++++++++++++++ internal/installer/vault/vault.go | 106 ++++++++ internal/installer/vault/vault_encryption.go | 237 ------------------ .../installer/vault/vault_encryption_test.go | 99 +++----- .../vault/vault_encryption_unexported_test.go | 47 ---- .../installer/vault/vault_secret_creator.go | 20 +- internal/installer/vault/vault_store_test.go | 99 ++++++++ internal/installer/vault/vault_suite_test.go | 2 +- .../vault/vault_templating_secret_store.go | 136 ++-------- 72 files changed, 1488 insertions(+), 1223 deletions(-) create mode 100644 cli/cmd/codesphere/codesphere_suite_test.go create mode 100644 cli/cmd/install_config_test_helpers_test.go create mode 100644 cli/cmd/k0s/install_config_test_helpers_test.go create mode 100644 internal/bootstrap/gcp/install_config_test_helpers_test.go create mode 100644 internal/installer/config_manager_test_helpers_test.go create mode 100644 internal/installer/vault/internal/filebackend/file.go create mode 100644 internal/installer/vault/internal/filebackend/file_test.go delete mode 100644 internal/installer/vault/mocks.go create mode 100644 internal/installer/vault/plain/plain.go create mode 100644 internal/installer/vault/sops/encryption.go create mode 100644 internal/installer/vault/sops/sops.go create mode 100644 internal/installer/vault/vault.go delete mode 100644 internal/installer/vault/vault_encryption.go delete mode 100644 internal/installer/vault/vault_encryption_unexported_test.go create mode 100644 internal/installer/vault/vault_store_test.go diff --git a/cli/cmd/beta_vault_secret.go b/cli/cmd/beta_vault_secret.go index 2a5d8dd75..0751f599a 100644 --- a/cli/cmd/beta_vault_secret.go +++ b/cli/cmd/beta_vault_secret.go @@ -27,6 +27,7 @@ type BetaVaultSecretOpts struct { AgeKeyPath string Namespace string SecretName string + VaultType string } func (c *BetaVaultSecretCmd) RunE(_ *cobra.Command, _ []string) error { @@ -47,16 +48,26 @@ func (c *BetaVaultSecretCmd) RunE(_ *cobra.Command, _ []string) error { creator := vault.NewVaultSecretCreator(kubeClient) - return creator.CreateSecretFromFile(c.cmd.Context(), c.Opts.VaultFile, c.Opts.AgeKeyPath, c.Opts.Namespace, c.Opts.SecretName) + store, err := vault.NewFromString(c.Opts.VaultType, vault.Options{Path: c.Opts.VaultFile, AgeKey: c.Opts.AgeKeyPath}) + if err != nil { + return fmt.Errorf("failed to load vault: %w", err) + } + + err = creator.CreateSecretFromStore(c.cmd.Context(), store, c.Opts.Namespace, c.Opts.SecretName) + if err != nil { + return fmt.Errorf("failed to create secret: %w", err) + } + + return nil } func AddBetaVaultSecretCmd(parentCmd *cobra.Command, opts *util.GlobalOptions) { cmd := BetaVaultSecretCmd{ cmd: &cobra.Command{ Use: "vault-secret", - Short: "Create a Kubernetes secret from a SOPS-encrypted vault file", - Long: packageio.Long(`Create a Kubernetes secret from a SOPS-encrypted prod.vault.yaml file. - Reads the encrypted vault file, decrypts it using the age key, and creates a Kubernetes secret + Short: "Create a Kubernetes secret from a vault file", + Long: packageio.Long(`Create a Kubernetes secret from a prod.vault.yaml file. + Loads the selected vault type and creates a Kubernetes secret with all the vault entries as key-value pairs in the target cluster.`), Example: util.FormatExamples("vault-secret", []packageio.Example{ {Cmd: "--vault-file prod.vault.yaml --namespace default --secret-name vault-secrets", Desc: "Create secret using default age key location"}, @@ -66,8 +77,9 @@ func AddBetaVaultSecretCmd(parentCmd *cobra.Command, opts *util.GlobalOptions) { Opts: BetaVaultSecretOpts{GlobalOptions: opts}, } - cmd.cmd.Flags().StringVar(&cmd.Opts.VaultFile, "vault-file", "", "Path to the SOPS-encrypted vault file (required)") - cmd.cmd.Flags().StringVar(&cmd.Opts.AgeKeyPath, "age-key", "", "Path to the age key file (optional, will use defaults if not provided)") + cmd.cmd.Flags().StringVar(&cmd.Opts.VaultFile, "vault-file", "", "Path to the vault file (required)") + cmd.cmd.Flags().StringVar(&cmd.Opts.AgeKeyPath, "age-key", "", "Path to the age key file (required for sops unless an age key environment variable is set)") + cmd.cmd.Flags().StringVar(&cmd.Opts.VaultType, "vault-type", "sops", "Vault storage type (sops or plain)") cmd.cmd.Flags().StringVar(&cmd.Opts.Namespace, "namespace", "codesphere", "Kubernetes namespace where the secret will be created") cmd.cmd.Flags().StringVar(&cmd.Opts.SecretName, "secret-name", "cs-vault", "Name of the Kubernetes secret to create") diff --git a/cli/cmd/bootstrap_gcp.go b/cli/cmd/bootstrap_gcp.go index 8f87eae55..ab657f855 100644 --- a/cli/cmd/bootstrap_gcp.go +++ b/cli/cmd/bootstrap_gcp.go @@ -149,7 +149,11 @@ func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { func (c *BootstrapGcpCmd) BootstrapGcp() error { ctx := c.cmd.Context() stlog := bootstrap.NewStepLogger(false) - icg := installer.NewInstallConfigManager() + + icg, err := installer.NewInstallConfigManager("plain", "") + if err != nil { + return fmt.Errorf("failed to initialize conig manager: %w", err) + } gcpClient := gcp.NewGCPClient(ctx, stlog, os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")) fw := intutil.NewFilesystemWriter() portalClient := portal.NewPortalClient() diff --git a/cli/cmd/bootstrap_gcp_postconfig.go b/cli/cmd/bootstrap_gcp_postconfig.go index d0eb064b9..7f8941292 100644 --- a/cli/cmd/bootstrap_gcp_postconfig.go +++ b/cli/cmd/bootstrap_gcp_postconfig.go @@ -31,7 +31,10 @@ type BootstrapGcpPostconfigOpts struct { func (c *BootstrapGcpPostconfigCmd) RunE(_ *cobra.Command, args []string) error { log.Printf("running post-configuration steps...") - icg := installer.NewInstallConfigManager() + icg, err := installer.NewInstallConfigManager("plain", "") + if err != nil { + return fmt.Errorf("failed to initialize config manager: %w", err) + } fw := intutil.NewFilesystemWriter() infraFilePath := gcp.GetInfraFilePath() diff --git a/cli/cmd/bootstrap_local.go b/cli/cmd/bootstrap_local.go index 19c4fb9fd..e3b6a7744 100644 --- a/cli/cmd/bootstrap_local.go +++ b/cli/cmd/bootstrap_local.go @@ -141,7 +141,11 @@ func (c *BootstrapLocalCmd) BootstrapLocal() error { } stlog := bootstrap.NewStepLogger(false) - icg := installer.NewInstallConfigManager() + + icg, err := installer.NewInstallConfigManager("plain", "") + if err != nil { + return fmt.Errorf("failed to initialize config manager: %w", err) + } fw := intutil.NewFilesystemWriter() kubeClient, restConfig, err := c.GetKubeClient(ctx) if err != nil { diff --git a/cli/cmd/codesphere/codesphere_suite_test.go b/cli/cmd/codesphere/codesphere_suite_test.go new file mode 100644 index 000000000..b34e884ff --- /dev/null +++ b/cli/cmd/codesphere/codesphere_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestCodesphere(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Codesphere Command Suite") +} diff --git a/cli/cmd/codesphere/install_codesphere.go b/cli/cmd/codesphere/install_codesphere.go index 141bf27b9..96c8c23e0 100644 --- a/cli/cmd/codesphere/install_codesphere.go +++ b/cli/cmd/codesphere/install_codesphere.go @@ -41,6 +41,7 @@ type InstallCodesphereOpts struct { ConfigPath string Vault string PrivKey string + VaultType string SkipSteps []string CodesphereOnly bool DirectConnection bool @@ -55,6 +56,9 @@ type InstallCodesphereOpts struct { } func (c *InstallCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { + if err := validateInstallCodesphereVault(c.Opts); err != nil { + return err + } ctx := cmd.Context() effectiveOpts, cfg, cleanup, err := prepareInstallConfig(c.Opts, installer.NewConfig()) if err != nil { @@ -116,14 +120,14 @@ func AddInstallCmd(install *cobra.Command, opts *util.GlobalOptions) { }, }), }, - Opts: &InstallCodesphereOpts{GlobalOptions: opts}, + Opts: &InstallCodesphereOpts{GlobalOptions: opts, VaultType: string(vault.TypeSOPS)}, Env: env.NewEnv(), } codesphere.cmd.PersistentFlags().StringVarP(&codesphere.Opts.Package, "package", "p", "", "Package file (e.g. codesphere-v1.2.3-installer-lite.tar.gz) to load binaries, installer etc. from") codesphere.cmd.PersistentFlags().BoolVarP(&codesphere.Opts.Force, "force", "f", false, "Enforce package extraction") codesphere.cmd.PersistentFlags().StringArrayVarP(&codesphere.Opts.Configs, "config", "c", nil, "Path to a Codesphere Private Cloud configuration file (yaml). Can be specified multiple times and merged in order") - codesphere.cmd.PersistentFlags().StringVar(&codesphere.Opts.Vault, "vault", "", "Path to the SOPS-encrypted prod.vault.yaml file used for config templating") - codesphere.cmd.PersistentFlags().StringVarP(&codesphere.Opts.PrivKey, "priv-key", "k", "", "Path to the private key to encrypt/decrypt secrets") + codesphere.cmd.PersistentFlags().StringVar(&codesphere.Opts.Vault, "vault", "", "Path to the prod.vault.yaml file used for config templating") + codesphere.cmd.PersistentFlags().StringVarP(&codesphere.Opts.PrivKey, "priv-key", "k", "", "Path to the age private key (required for sops unless an age key environment variable is set)") codesphere.cmd.PersistentFlags().StringSliceVarP(&codesphere.Opts.SkipSteps, "skip-steps", "s", []string{}, "Steps to be skipped. E.g. copy-dependencies, extract-dependencies, load-container-images, ceph, postgres, kubernetes, docker, argocd") codesphere.cmd.PersistentFlags().BoolVar(&codesphere.Opts.DirectConnection, "direct-connection", false, "Use direct connection for installation, requires having access to the cluster nodes from your machine") codesphere.cmd.PersistentFlags().BoolVar(&codesphere.Opts.AutoApprove, "auto-approve", true, "Auto approve confirmation prompts with default values") @@ -137,7 +141,6 @@ func AddInstallCmd(install *cobra.Command, opts *util.GlobalOptions) { util.MarkPersistentFlagRequired(codesphere.cmd, "package") util.MarkPersistentFlagRequired(codesphere.cmd, "config") - util.MarkPersistentFlagRequired(codesphere.cmd, "priv-key") util.AddCmd(install, codesphere.cmd) @@ -148,6 +151,21 @@ func AddInstallCmd(install *cobra.Command, opts *util.GlobalOptions) { AddInstallCodespherePlatformCmd(codesphere.cmd, codesphere.Opts) } +// validateInstallCodesphereVault enforces the current TypeScript installer +// contract without changing the selected type on the command options. +func validateInstallCodesphereVault(opts *InstallCodesphereOpts) error { + if opts.VaultType != string(vault.TypeSOPS) { + return fmt.Errorf("install codesphere requires vault type %q", vault.TypeSOPS) + } + + err := vault.ValidateConfiguration(vault.TypeSOPS, opts.PrivKey) + if err != nil { + return fmt.Errorf("failed to validate install config: %w", err) + } + + return nil +} + func sharedInstallCodesphereSteps() []string { return []string{"copy-dependencies", "extract-dependencies"} } @@ -168,7 +186,16 @@ func prepareInstallConfig(opts *InstallCodesphereOpts, cm installer.ConfigManage return nil, files.RootConfig{}, func() {}, fmt.Errorf("no config.yaml input provided: at least one config file is required") } - store := vault.NewLazyVaultTemplatingSecretStore(opts.Vault, opts.PrivKey) + var store *vault.VaultTemplatingSecretStore + + if opts.Vault != "" { + backend, err := vault.NewFromString(opts.VaultType, vault.Options{Path: opts.Vault, AgeKey: opts.PrivKey}) + if err != nil { + return nil, files.RootConfig{}, func() {}, fmt.Errorf("failed to load vault: %w", err) + } + + store = vault.NewLazyVaultTemplatingSecretStoreWithVault(backend) + } cleanupFns := []func(){} cleanup := func() { for i := len(cleanupFns) - 1; i >= 0; i-- { diff --git a/cli/cmd/codesphere/install_codesphere_config_test.go b/cli/cmd/codesphere/install_codesphere_config_test.go index f26872d34..73c69da78 100644 --- a/cli/cmd/codesphere/install_codesphere_config_test.go +++ b/cli/cmd/codesphere/install_codesphere_config_test.go @@ -13,6 +13,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -164,7 +165,7 @@ pcApps: Expect(exec.Command("age-keygen", "-o", ageKeyPath).Run()).To(Succeed()) recipient, err := exec.Command("age-keygen", "-y", ageKeyPath).Output() Expect(err).ToNot(HaveOccurred()) - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) opts := &InstallCodesphereOpts{ Configs: []string{basePath, overlayPath}, @@ -232,3 +233,16 @@ func installCodesphereSopsAndAgeAvailable() bool { } return true } + +var _ = Describe("install codesphere vault type", func() { + It("accepts sops", func() { + opts := &InstallCodesphereOpts{VaultType: string(vault.TypeSOPS), PrivKey: "age-key.txt"} + Expect(validateInstallCodesphereVault(opts)).To(Succeed()) + }) + + It("rejects plain vaults at the command boundary", func() { + opts := &InstallCodesphereOpts{VaultType: string(vault.TypePlain), PrivKey: "age-key.txt"} + err := validateInstallCodesphereVault(opts) + Expect(err).To(MatchError(`install codesphere requires vault type "sops"`)) + }) +}) diff --git a/cli/cmd/codesphere/install_codesphere_dependencies.go b/cli/cmd/codesphere/install_codesphere_dependencies.go index 62f47ac8d..46d656eec 100644 --- a/cli/cmd/codesphere/install_codesphere_dependencies.go +++ b/cli/cmd/codesphere/install_codesphere_dependencies.go @@ -33,6 +33,9 @@ type InstallCodesphereDepenciesCmd struct { } func (c *InstallCodesphereDepenciesCmd) RunE(_ *cobra.Command, _ []string) error { + if err := validateInstallCodesphereVault(c.Opts); err != nil { + return err + } effectiveOpts, cfg, cleanup, err := prepareInstallConfig(c.Opts, installer.NewConfig()) if err != nil { return err @@ -60,7 +63,7 @@ func installCodesphereDepencies(opts *InstallCodesphereOpts, cfg files.RootConfi AutoApprove: opts.AutoApprove, } - installVault, restConfig, err := installer.VaultAndRESTConfig(opts.Vault, opts.PrivKey, cfg) + installVault, restConfig, err := installer.VaultAndRESTConfig(opts.Vault, opts.PrivKey, opts.VaultType, cfg) if err != nil { return fmt.Errorf("failed to get vault and Kubernetes config: %w", err) } @@ -111,7 +114,11 @@ func installCodesphereDepencies(opts *InstallCodesphereOpts, cfg files.RootConfi func installArgoCDAndApps(opts *InstallCodesphereOpts, cfg files.RootConfig, pm installer.PackageManager, installVault *files.InstallVault, restConfig *rest.Config, kubeClient ctrlclient.Client, stlog *bootstrap.StepLogger) error { var install *argocdinstaller.AppInstaller - if err := stlog.Substep("Initialize ArgoCD installer", func() error { + if err := stlog.Substep("Load vault data", func() error { + installVault, restConfig, err := installer.VaultAndRESTConfig(opts.Vault, opts.PrivKey, opts.VaultType, cfg) + if err != nil { + return fmt.Errorf("failed to load vault data and REST config: %w", err) + } registryPassword := "" if secret := installVault.GetSecret(files.SecretRegistryPassword); secret != nil && secret.Fields != nil { registryPassword = secret.Fields.Password diff --git a/cli/cmd/codesphere/install_codesphere_infra.go b/cli/cmd/codesphere/install_codesphere_infra.go index 70274e9bf..a18b0bbdc 100644 --- a/cli/cmd/codesphere/install_codesphere_infra.go +++ b/cli/cmd/codesphere/install_codesphere_infra.go @@ -24,6 +24,9 @@ type InstallCodesphereInfraCmd struct { } func (c *InstallCodesphereInfraCmd) RunE(_ *cobra.Command, _ []string) error { + if err := validateInstallCodesphereVault(c.Opts); err != nil { + return err + } effectiveOpts, _, cleanup, err := prepareInstallConfig(c.Opts, installer.NewConfig()) if err != nil { return err diff --git a/cli/cmd/codesphere/install_codesphere_platform.go b/cli/cmd/codesphere/install_codesphere_platform.go index 7b9a7c3e8..39b400ae9 100644 --- a/cli/cmd/codesphere/install_codesphere_platform.go +++ b/cli/cmd/codesphere/install_codesphere_platform.go @@ -25,6 +25,9 @@ type InstallCodespherePlatformCmd struct { } func (c *InstallCodespherePlatformCmd) RunE(cmd *cobra.Command, _ []string) error { + if err := validateInstallCodesphereVault(c.Opts); err != nil { + return err + } effectiveOpts, cfg, cleanup, err := prepareInstallConfig(c.Opts, installer.NewConfig()) if err != nil { return err @@ -35,7 +38,7 @@ func (c *InstallCodespherePlatformCmd) RunE(cmd *cobra.Command, _ []string) erro } func installCodespherePlatform(ctx context.Context, opts *InstallCodesphereOpts, cfg files.RootConfig, env env.Env) error { - if err := installer.EnsureClusterAdminSecret(ctx, opts.Vault, opts.PrivKey, cfg); err != nil { + if err := installer.EnsureClusterAdminSecret(ctx, opts.Vault, opts.PrivKey, opts.VaultType, cfg); err != nil { return fmt.Errorf("failed to set cluster admin email: %w", err) } diff --git a/cli/cmd/codesphere/install_codesphere_test.go b/cli/cmd/codesphere/install_codesphere_test.go index 2e3623200..d2970d830 100644 --- a/cli/cmd/codesphere/install_codesphere_test.go +++ b/cli/cmd/codesphere/install_codesphere_test.go @@ -32,6 +32,8 @@ var _ = Describe("InstallCodesphereCmd", func() { GlobalOptions: globalOpts, Package: "codesphere-v1.66.0-installer-lite.tar.gz", Force: false, + VaultType: "sops", + PrivKey: "age-key.txt", } c = codesphere.InstallCodesphereCmd{ Opts: opts, @@ -124,6 +126,7 @@ var _ = Describe("AddInstallCodesphereCmd", func() { vaultFlag := codesphereCmd.PersistentFlags().Lookup("vault") Expect(vaultFlag).NotTo(BeNil()) Expect(vaultFlag.DefValue).To(Equal("")) + Expect(codesphereCmd.PersistentFlags().Lookup("vault-type")).To(BeNil()) skipStepFlag := codesphereCmd.PersistentFlags().Lookup("skip-steps") Expect(skipStepFlag).NotTo(BeNil()) diff --git a/cli/cmd/init_install_config.go b/cli/cmd/init_install_config.go index 202f054be..ab23e8a0b 100644 --- a/cli/cmd/init_install_config.go +++ b/cli/cmd/init_install_config.go @@ -27,6 +27,8 @@ type InitInstallConfigOpts struct { ConfigFile string VaultFile string + VaultType string + AgeKey string Profile string AnsibleInventoryFile string @@ -108,7 +110,10 @@ type InitInstallConfigOpts struct { } func (c *InitInstallConfigCmd) RunE(_ *cobra.Command, args []string) error { - icg := installer.NewInstallConfigManager() + icg, err := installer.NewInstallConfigManager(c.Opts.VaultType, c.Opts.AgeKey) + if err != nil { + return fmt.Errorf("failed to initialize config manager: %w", err) + } return c.InitInstallConfig(icg) } @@ -150,6 +155,8 @@ func AddInitInstallConfigCmd(init *cobra.Command, opts *util.GlobalOptions) { c.cmd.Flags().StringVarP(&c.Opts.ConfigFile, "config", "c", "config.yaml", "Output file path for config.yaml") c.cmd.Flags().StringVar(&c.Opts.VaultFile, "vault", "prod.vault.yaml", "Output file path for prod.vault.yaml") + c.cmd.Flags().StringVar(&c.Opts.VaultType, "vault-type", "sops", "Vault storage type (sops or plain)") + c.cmd.Flags().StringVar(&c.Opts.AgeKey, "age-key", "", "Path to the age private key (required for sops unless SOPS_AGE_KEY or SOPS_AGE_KEY_FILE is set)") c.cmd.Flags().StringVar(&c.Opts.Profile, "profile", "", "Use a predefined configuration profile (dev, production, minimal)") c.cmd.Flags().StringVar(&c.Opts.AnsibleInventoryFile, "ansible-inventory", "", "Path to Ansible inventory file to import host information from") @@ -261,7 +268,7 @@ func (c *InitInstallConfigCmd) InitInstallConfig(icg installer.InstallConfigMana return fmt.Errorf("failed to write config file: %w", err) } - if err := icg.WriteUnencryptedVault(c.Opts.VaultFile, c.Opts.WithComments); err != nil { + if err := icg.WriteVault(c.Opts.VaultFile, c.Opts.WithComments); err != nil { return fmt.Errorf("failed to write vault file: %w", err) } @@ -297,16 +304,7 @@ func (c *InitInstallConfigCmd) printSuccessMessage(warningCount int) { log.Println(strings.Repeat("=", 70)) log.Println("\nIMPORTANT: Keys and certificates have been generated and embedded in the vault file.") - log.Println(" Keep the vault file secure and encrypt it with SOPS before storing.") - - log.Println("\nNext steps:") - log.Println("1. Review the generated config.yaml and prod.vault.yaml") - log.Println("2. Install SOPS and Age: brew install sops age") - log.Println("3. Generate an Age keypair: age-keygen -o age_key.txt") - log.Println("4. Encrypt the vault file:") - log.Printf(" age-keygen -y age_key.txt # Get public key\n") - log.Printf(" sops --encrypt --age --in-place %s\n", c.Opts.VaultFile) - log.Println("5. Run the Codesphere installer with these configuration files") + log.Println(" Keep the vault file and its decryption key secure.") log.Println() } diff --git a/cli/cmd/init_install_config_interactive_test.go b/cli/cmd/init_install_config_interactive_test.go index c0e970ead..a8b774619 100644 --- a/cli/cmd/init_install_config_interactive_test.go +++ b/cli/cmd/init_install_config_interactive_test.go @@ -19,7 +19,7 @@ import ( var _ = Describe("Interactive profile usage", func() { Context("when using profile with interactive mode", func() { It("should use profile values as defaults", func() { - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() // Apply dev profile first (like the command does) err := icg.ApplyProfile("dev") @@ -66,7 +66,7 @@ var _ = Describe("Interactive profile usage", func() { }) It("should allow non-interactive collection to use profile defaults", func() { - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() // Apply dev profile err := icg.ApplyProfile("dev") @@ -109,7 +109,7 @@ var _ = Describe("Interactive profile usage", func() { FileWriter: intutil.NewFilesystemWriter(), } - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = c.InitInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -132,7 +132,7 @@ var _ = Describe("Interactive profile usage", func() { Context("when using production profile", func() { It("should set production-specific defaults", func() { - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err := icg.ApplyProfile("production") Expect(err).NotTo(HaveOccurred()) @@ -154,7 +154,7 @@ var _ = Describe("Interactive profile usage", func() { mockIcg.EXPECT().ValidateInstallConfig().Return([]string{"configuration validation failed"}) mockIcg.EXPECT().GenerateSecrets().Return(nil) mockIcg.EXPECT().WriteInstallConfig("config.yaml", false).Return(nil) - mockIcg.EXPECT().WriteUnencryptedVault("vault.yaml", false).Return(nil) + mockIcg.EXPECT().WriteVault("vault.yaml", false).Return(nil) c := &InitInstallConfigCmd{ Opts: &InitInstallConfigOpts{ @@ -196,7 +196,7 @@ var _ = Describe("Interactive profile usage", func() { FileWriter: intutil.NewFilesystemWriter(), } - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = c.InitInstallConfig(icg) Expect(err).To(HaveOccurred()) diff --git a/cli/cmd/init_install_config_test.go b/cli/cmd/init_install_config_test.go index 4512acbef..435ecffbc 100644 --- a/cli/cmd/init_install_config_test.go +++ b/cli/cmd/init_install_config_test.go @@ -13,16 +13,15 @@ import ( . "github.com/onsi/gomega" "github.com/codesphere-cloud/oms/cli/cmd/testutil" - "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" - "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" "github.com/codesphere-cloud/oms/internal/util" ) var _ = Describe("ApplyProfile", func() { DescribeTable("profile application", func(profile string, wantErr bool, checkDatacenterName string) { - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err := icg.ApplyProfile(profile) if wantErr { @@ -43,7 +42,7 @@ var _ = Describe("ApplyProfile", func() { Context("dev profile details", func() { It("sets correct dev profile configuration", func() { - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err := icg.ApplyProfile("dev") Expect(err).NotTo(HaveOccurred()) @@ -276,7 +275,7 @@ codesphere: Expect(exec.Command("age-keygen", "-o", ageKeyPath).Run()).To(Succeed()) recipient, err := exec.Command("age-keygen", "-y", ageKeyPath).Output() Expect(err).NotTo(HaveOccurred()) - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultFile.Name(), strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultFile.Name(), strings.TrimSpace(string(recipient)))).To(Succeed()) previousAgeKeyFile, hadPreviousAgeKeyFile := os.LookupEnv("SOPS_AGE_KEY_FILE") Expect(os.Setenv("SOPS_AGE_KEY_FILE", ageKeyPath)).To(Succeed()) DeferCleanup(func() { @@ -296,7 +295,7 @@ codesphere: FileWriter: util.NewFilesystemWriter(), } - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err = c.validateOnly(icg) Expect(err).NotTo(HaveOccurred()) }) @@ -347,7 +346,7 @@ codesphere: FileWriter: util.NewFilesystemWriter(), } - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = c.validateOnly(icg) Expect(err).To(HaveOccurred()) }) @@ -409,7 +408,7 @@ codesphere: FileWriter: util.NewFilesystemWriter(), } - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = c.validateOnly(icg) Expect(err).To(HaveOccurred()) }) diff --git a/cli/cmd/install_config_test_helpers_test.go b/cli/cmd/install_config_test_helpers_test.go new file mode 100644 index 000000000..7d320d4b2 --- /dev/null +++ b/cli/cmd/install_config_test_helpers_test.go @@ -0,0 +1,23 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/codesphere-cloud/oms/internal/installer" + . "github.com/onsi/gomega" +) + +func newPlainInstallConfigManager() installer.InstallConfigManager { + manager, err := installer.NewInstallConfigManager("plain", "") + Expect(err).NotTo(HaveOccurred()) + + return manager +} + +func newSOPSInstallConfigManager() installer.InstallConfigManager { + manager, err := installer.NewInstallConfigManager("sops", "") + Expect(err).NotTo(HaveOccurred()) + + return manager +} diff --git a/cli/cmd/install_openbao.go b/cli/cmd/install_openbao.go index 262a22ee7..915415c80 100644 --- a/cli/cmd/install_openbao.go +++ b/cli/cmd/install_openbao.go @@ -23,7 +23,7 @@ import ( "github.com/codesphere-cloud/oms/cli/cmd/util" "github.com/codesphere-cloud/oms/internal/installer" - "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" ) // InstallOpenBaoCmd wraps the cobra command and options for 'oms install openbao'. @@ -60,7 +60,7 @@ func (c *InstallOpenBaoCmd) RunE(_ *cobra.Command, _ []string) error { // Pass --age-key-file explicitly so ResolveAgeKey prefers it without // mutating the process environment. When empty, the normal // auto-discovery chain (env vars, default location, generation) applies. - recipient, keyPath, err := vault.ResolveAgeKey(c.Opts.AgeKeyFile, fallbackDir) + recipient, keyPath, err := sops.ResolveAgeKey(c.Opts.AgeKeyFile, fallbackDir) if err != nil { return fmt.Errorf("resolving age key: %w", err) } diff --git a/cli/cmd/k0s/install_config_test_helpers_test.go b/cli/cmd/k0s/install_config_test_helpers_test.go new file mode 100644 index 000000000..eeb6aa7e7 --- /dev/null +++ b/cli/cmd/k0s/install_config_test_helpers_test.go @@ -0,0 +1,17 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +//go:build integration + +package k0s_test + +import ( + "github.com/codesphere-cloud/oms/internal/installer" + . "github.com/onsi/gomega" +) + +func newPlainInstallConfigManager() installer.InstallConfigManager { + manager, err := installer.NewInstallConfigManager("plain", "") + Expect(err).NotTo(HaveOccurred()) + return manager +} diff --git a/cli/cmd/k0s/install_k0s.go b/cli/cmd/k0s/install_k0s.go index 56a28fdec..f67257fcd 100644 --- a/cli/cmd/k0s/install_k0s.go +++ b/cli/cmd/k0s/install_k0s.go @@ -40,6 +40,7 @@ type InstallK0sOpts struct { NoDownload bool Vault string VaultPrivKey string + VaultType string } func (c *InstallK0sCmd) RunE(_ *cobra.Command, args []string) error { @@ -88,6 +89,7 @@ func AddInstallCmd(install *cobra.Command, opts *util.GlobalOptions) { k0s.cmd.Flags().StringVar(&k0s.Opts.Vault, "vault", "", "Path to prod.vault.yaml to save the kubeconfig into (optional)") k0s.cmd.Flags().StringVar(&k0s.Opts.VaultPrivKey, "vault-priv-key", "", "Path to the age private key to decrypt the vault (optional, for SOPS-encrypted vaults)") + k0s.cmd.Flags().StringVar(&k0s.Opts.VaultType, "vault-type", "sops", "Vault storage type (sops or plain)") _ = k0s.cmd.MarkFlagRequired("install-config") @@ -145,18 +147,16 @@ func (c *InstallK0sCmd) InstallK0s(pm installer.PackageManager, k0s installer.K0 } func (c *InstallK0sCmd) loadInstallConfig() (*files.RootConfig, error) { - icg := installer.NewInstallConfigManager() - if err := icg.LoadInstallConfigFromFile(c.Opts.InstallConfig); err != nil { + config, err := installer.NewConfig().ParseConfigYaml(c.Opts.InstallConfig) + if err != nil { return nil, fmt.Errorf("failed to load install-config: %w", err) } - config := icg.GetInstallConfig() - if !config.Kubernetes.ManagedByCodesphere { return nil, fmt.Errorf("install-config specifies external Kubernetes, k0s installation is only supported for Codesphere-managed Kubernetes") } - return config, nil + return &config, nil } func (c *InstallK0sCmd) determineK0sVersion(k0s installer.K0sManager) (string, error) { @@ -261,12 +261,12 @@ func (c *InstallK0sCmd) saveKubeconfigToVault(k0sctl installer.K0sctlManager, k0 }, }) - vaultYAML, err := vault.Marshal() + store, err := c.vaultStore() if err != nil { - return fmt.Errorf("failed to marshal vault: %w", err) + return err } - if err := c.writeEncryptedVault(vaultYAML); err != nil { + if err := store.Save(vault); err != nil { return err } @@ -274,39 +274,24 @@ func (c *InstallK0sCmd) saveKubeconfigToVault(k0sctl installer.K0sctlManager, k0 return nil } -// writeEncryptedVault writes vaultYAML to the vault path, encrypting it with SOPS. -// Uses a temporary file so the original vault is left untouched on failure. -func (c *InstallK0sCmd) writeEncryptedVault(vaultYAML []byte) error { - tmpPath := c.Opts.Vault + ".tmp" - - if err := c.FileWriter.WriteFile(tmpPath, vaultYAML, 0600); err != nil { - return fmt.Errorf("failed to write temporary vault file: %w", err) - } - - recipient, _, err := vault.ResolveAgeKey(c.Opts.VaultPrivKey, "") +func (c *InstallK0sCmd) loadOrCreateVault() (*files.InstallVault, error) { + store, err := c.vaultStore() if err != nil { - _ = c.FileWriter.Remove(tmpPath) - return fmt.Errorf("failed to resolve age key for vault rencryption: %w", err) + return nil, err } - if err := vault.EncryptFileWithSOPS(tmpPath, c.Opts.Vault, recipient); err != nil { - _ = c.FileWriter.Remove(tmpPath) - return fmt.Errorf("failed to encrypt vault file: %w", err) + data, err := store.LoadOrCreate() + if err != nil { + return nil, fmt.Errorf("failed to load vault: %w", err) } - _ = c.FileWriter.Remove(tmpPath) - return nil + return data, nil } -func (c *InstallK0sCmd) loadOrCreateVault() (*files.InstallVault, error) { - if !c.FileWriter.Exists(c.Opts.Vault) { - return &files.InstallVault{}, nil - } - - vault, err := vault.LoadVaultData(c.Opts.Vault, c.Opts.VaultPrivKey) +func (c *InstallK0sCmd) vaultStore() (vault.Vault, error) { + vault, err := vault.NewFromString(c.Opts.VaultType, vault.Options{Path: c.Opts.Vault, AgeKey: c.Opts.VaultPrivKey}) if err != nil { return nil, fmt.Errorf("failed to load vault: %w", err) } - return vault, nil } diff --git a/cli/cmd/k0s/install_k0s_integration_test.go b/cli/cmd/k0s/install_k0s_integration_test.go index c949116cf..7e5ec40b3 100644 --- a/cli/cmd/k0s/install_k0s_integration_test.go +++ b/cli/cmd/k0s/install_k0s_integration_test.go @@ -80,7 +80,7 @@ var _ = Describe("K0s Install-Config Integration", func() { err = os.WriteFile(configPath, configData, 0644) Expect(err).NotTo(HaveOccurred()) - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = icg.LoadInstallConfigFromFile(configPath) Expect(err).NotTo(HaveOccurred()) @@ -254,7 +254,7 @@ var _ = Describe("K0s Install-Config Integration", func() { Describe("Error Handling", func() { It("should fail when loading non-existent file", func() { nonExistentPath := filepath.Join(tempDir, "does-not-exist.yaml") - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err := icg.LoadInstallConfigFromFile(nonExistentPath) Expect(err).To(HaveOccurred()) }) @@ -270,7 +270,7 @@ var _ = Describe("K0s Install-Config Integration", func() { err := os.WriteFile(configPath, invalidYAML, 0644) Expect(err).NotTo(HaveOccurred()) - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = icg.LoadInstallConfigFromFile(configPath) Expect(err).To(HaveOccurred()) }) @@ -279,7 +279,7 @@ var _ = Describe("K0s Install-Config Integration", func() { err := os.WriteFile(configPath, []byte{}, 0644) Expect(err).NotTo(HaveOccurred()) - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = icg.LoadInstallConfigFromFile(configPath) // Empty file loads successfully but returns empty config Expect(err).NotTo(HaveOccurred()) @@ -386,7 +386,7 @@ var _ = Describe("K0s Install-Config Integration", func() { Expect(err).NotTo(HaveOccurred()) // Reload install-config - icg := installer.NewInstallConfigManager() + icg := newPlainInstallConfigManager() err = icg.LoadInstallConfigFromFile(configPath) Expect(err).NotTo(HaveOccurred()) reloadedInstallConfig := icg.GetInstallConfig() diff --git a/cli/cmd/k0s/install_k0s_test.go b/cli/cmd/k0s/install_k0s_test.go index 0c46fe437..7a4bf2c03 100644 --- a/cli/cmd/k0s/install_k0s_test.go +++ b/cli/cmd/k0s/install_k0s_test.go @@ -274,11 +274,9 @@ var _ = Describe("InstallK0sCmd", func() { err = c.InstallK0s(mockPM, mockK0s, mockK0sctl) Expect(err).NotTo(HaveOccurred()) - encrypted, err := vault.IsSOPSEncryptedFile(c.Opts.Vault) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: c.Opts.Vault, AgeKey: ageKeyPath}) Expect(err).NotTo(HaveOccurred()) - Expect(encrypted).To(BeTrue(), "new vault should be SOPS-encrypted") - - loaded, err := vault.LoadVaultData(c.Opts.Vault, ageKeyPath) + loaded, err := backend.Load() Expect(err).NotTo(HaveOccurred()) secret := loaded.GetSecret(files.SecretKubeConfig) Expect(secret).NotTo(BeNil()) @@ -328,7 +326,9 @@ var _ = Describe("InstallK0sCmd", func() { err = c.InstallK0s(mockPM, mockK0s, mockK0sctl) Expect(err).NotTo(HaveOccurred()) - loaded, err := vault.LoadVaultData(c.Opts.Vault, ageKeyPath) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: c.Opts.Vault, AgeKey: ageKeyPath}) + Expect(err).NotTo(HaveOccurred()) + loaded, err := backend.Load() Expect(err).NotTo(HaveOccurred()) Expect(loaded.GetSecret("domainAuthPrivateKey")).NotTo(BeNil(), "pre-existing secret should be preserved") secret := loaded.GetSecret(files.SecretKubeConfig) @@ -378,7 +378,9 @@ var _ = Describe("InstallK0sCmd", func() { err = c.InstallK0s(mockPM, mockK0s, mockK0sctl) Expect(err).NotTo(HaveOccurred()) - loaded, err := vault.LoadVaultData(c.Opts.Vault, ageKeyPath) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: c.Opts.Vault, AgeKey: ageKeyPath}) + Expect(err).NotTo(HaveOccurred()) + loaded, err := backend.Load() Expect(err).NotTo(HaveOccurred()) secret := loaded.GetSecret(files.SecretKubeConfig) Expect(secret).NotTo(BeNil()) @@ -405,7 +407,9 @@ var _ = Describe("InstallK0sCmd", func() { err = c.InstallK0s(mockPM, mockK0s, mockK0sctl) Expect(err).NotTo(HaveOccurred()) - loaded, err := vault.LoadVaultData(c.Opts.Vault, ageKeyPath) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: c.Opts.Vault, AgeKey: ageKeyPath}) + Expect(err).NotTo(HaveOccurred()) + loaded, err := backend.Load() Expect(err).NotTo(HaveOccurred()) secret := loaded.GetSecret(files.SecretKubeConfig) Expect(secret).NotTo(BeNil()) @@ -463,10 +467,6 @@ var _ = Describe("InstallK0sCmd", func() { Expect(err).NotTo(HaveOccurred(), string(encryptOut)) Expect(os.Remove(plainPath)).To(Succeed()) - encrypted, err := vault.IsSOPSEncryptedFile(vaultPath) - Expect(err).NotTo(HaveOccurred()) - Expect(encrypted).To(BeTrue()) - c.Opts.InstallConfig = writeTestConfig(createTestConfig(true)) c.Opts.Package = "test-package.tar.gz" c.Opts.Version = "v1.30.0+k0s.0" @@ -479,11 +479,6 @@ var _ = Describe("InstallK0sCmd", func() { err = c.InstallK0s(mockPM, mockK0s, mockK0sctl) Expect(err).NotTo(HaveOccurred()) - // Verify the vault was re-encrypted after saving kubeconfig. - encrypted, err = vault.IsSOPSEncryptedFile(vaultPath) - Expect(err).NotTo(HaveOccurred()) - Expect(encrypted).To(BeTrue(), "vault should be re-encrypted after saving kubeconfig") - // Verify the temporary file was cleaned up. tmpPath := vaultPath + ".tmp" Expect(tmpPath).NotTo(BeAnExistingFile()) diff --git a/cli/cmd/template_config.go b/cli/cmd/template_config.go index 48d1010c3..e2744a19c 100644 --- a/cli/cmd/template_config.go +++ b/cli/cmd/template_config.go @@ -21,9 +21,10 @@ type TemplateConfigCmd struct { type TemplateConfigOpts struct { *util.GlobalOptions - Config string - Vault string - AgeKey string + Config string + Vault string + AgeKey string + VaultType string } func (c *TemplateConfigCmd) RunE(cmd *cobra.Command, _ []string) error { @@ -77,12 +78,12 @@ Secret names and selectors must match entries in the prod.vault.yaml file.`), } configCmd.cmd.Flags().StringVarP(&configCmd.Opts.Config, "config", "c", "", "Path to the config.yaml template to render (required)") - configCmd.cmd.Flags().StringVarP(&configCmd.Opts.Vault, "vault", "v", "", "Path to the SOPS-encrypted prod.vault.yaml file (required)") - configCmd.cmd.Flags().StringVarP(&configCmd.Opts.AgeKey, "age-key", "k", "", "Path to the age key file used to decrypt the vault (required)") + configCmd.cmd.Flags().StringVarP(&configCmd.Opts.Vault, "vault", "v", "", "Path to the prod.vault.yaml file (required)") + configCmd.cmd.Flags().StringVarP(&configCmd.Opts.AgeKey, "age-key", "k", "", "Path to the age key file (required for sops unless an age key environment variable is set)") + configCmd.cmd.Flags().StringVar(&configCmd.Opts.VaultType, "vault-type", "sops", "Vault storage type (sops or plain)") util.MarkFlagRequired(configCmd.cmd, "config") util.MarkFlagRequired(configCmd.cmd, "vault") - util.MarkFlagRequired(configCmd.cmd, "age-key") util.AddCmd(parentCmd, configCmd.cmd) @@ -95,7 +96,12 @@ func (c *TemplateConfigCmd) Render() ([]byte, error) { return nil, fmt.Errorf("failed to read config file %s: %w", c.Opts.Config, err) } - store := vault.NewLazyVaultTemplatingSecretStore(c.Opts.Vault, c.Opts.AgeKey) + backend, err := vault.NewFromString(c.Opts.VaultType, vault.Options{Path: c.Opts.Vault, AgeKey: c.Opts.AgeKey}) + if err != nil { + return nil, fmt.Errorf("failed to load vault: %w", err) + } + + store := vault.NewLazyVaultTemplatingSecretStoreWithVault(backend) rendered, err := configtemplating.RenderInstallConfigTemplate(data, store) if err != nil { return nil, fmt.Errorf("failed to render config template: %w", err) diff --git a/cli/cmd/template_config_test.go b/cli/cmd/template_config_test.go index 8e611f0ac..160ff5350 100644 --- a/cli/cmd/template_config_test.go +++ b/cli/cmd/template_config_test.go @@ -13,7 +13,7 @@ import ( "github.com/codesphere-cloud/oms/cli/cmd" "github.com/codesphere-cloud/oms/cli/cmd/testutil" "github.com/codesphere-cloud/oms/internal/installer/files" - "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -64,7 +64,7 @@ postgres: Expect(os.WriteFile(plaintextVaultPath, vaultYaml, 0600)).To(Succeed()) recipient, err := exec.Command("age-keygen", "-y", ageKeyPath).Output() Expect(err).NotTo(HaveOccurred()) - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) rootCmd := cmd.GetRootCmd() var output bytes.Buffer diff --git a/cli/cmd/update_install_config.go b/cli/cmd/update_install_config.go index 6f0c63aa5..3260e1deb 100644 --- a/cli/cmd/update_install_config.go +++ b/cli/cmd/update_install_config.go @@ -34,6 +34,8 @@ type UpdateInstallConfigOpts struct { ConfigFile string VaultFile string + VaultType string + AgeKey string WithComments bool Yes bool @@ -73,7 +75,10 @@ type UpdateInstallConfigOpts struct { } func (c *UpdateInstallConfigCmd) RunE(_ *cobra.Command, args []string) error { - icg := installer.NewInstallConfigManager() + icg, err := installer.NewInstallConfigManager(c.Opts.VaultType, c.Opts.AgeKey) + if err != nil { + return fmt.Errorf("failed to initialize config manager: %w", err) + } return c.UpdateInstallConfig(icg) } @@ -109,6 +114,8 @@ func AddUpdateInstallConfigCmd(update *cobra.Command, opts *util.GlobalOptions) c.cmd.Flags().StringVarP(&c.Opts.ConfigFile, "config", "c", "config.yaml", "Path to existing config.yaml file") c.cmd.Flags().StringVar(&c.Opts.VaultFile, "vault", "prod.vault.yaml", "Path to existing prod.vault.yaml file") + c.cmd.Flags().StringVar(&c.Opts.VaultType, "vault-type", "sops", "Vault storage type (sops or plain)") + c.cmd.Flags().StringVar(&c.Opts.AgeKey, "age-key", "", "Path to the age private key (required for sops unless SOPS_AGE_KEY or SOPS_AGE_KEY_FILE is set)") c.cmd.Flags().BoolVar(&c.Opts.WithComments, "with-comments", false, "Add helpful comments to the generated YAML files") c.cmd.Flags().BoolVarP(&c.Opts.Yes, "yes", "y", false, "Auto-approve every change to the vault (regenerated certificates and missing secrets)") diff --git a/cli/cmd/update_install_config_test.go b/cli/cmd/update_install_config_test.go index f11632ebb..8c62cbe62 100644 --- a/cli/cmd/update_install_config_test.go +++ b/cli/cmd/update_install_config_test.go @@ -16,10 +16,10 @@ import ( "github.com/codesphere-cloud/oms/cli/cmd/testutil" "github.com/codesphere-cloud/oms/cli/cmd/util" - "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" "github.com/codesphere-cloud/oms/internal/prompt" ) @@ -203,7 +203,7 @@ codesphere: Expect(exec.Command("age-keygen", "-o", ageKeyPath).Run()).To(Succeed()) recipient, err := exec.Command("age-keygen", "-y", ageKeyPath).Output() Expect(err).NotTo(HaveOccurred()) - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultFile.Name(), strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultFile.Name(), strings.TrimSpace(string(recipient)))).To(Succeed()) previousAgeKeyFile, hadPreviousAgeKeyFile := os.LookupEnv("SOPS_AGE_KEY_FILE") Expect(os.Setenv("SOPS_AGE_KEY_FILE", ageKeyPath)).To(Succeed()) DeferCleanup(func() { @@ -247,7 +247,7 @@ codesphere: opts.PostgresPrimaryIP = "10.10.0.4" opts.PostgresServer = "new-postgres-primary" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -257,10 +257,9 @@ codesphere: Expect(icg.GetVault().GetSecret(files.SecretPostgresPrimaryServerKeyPem)).NotTo(BeNil()) Expect(config.Postgres.Primary.SSLConfig.ServerCertPem).NotTo(BeEmpty()) - encrypted, err := vault.IsSOPSEncryptedFile(vaultFile.Name()) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultFile.Name()}) Expect(err).NotTo(HaveOccurred()) - Expect(encrypted).To(BeTrue()) - updatedVault, err := vault.LoadVaultData(vaultFile.Name(), "") + updatedVault, err := backend.Load() Expect(err).NotTo(HaveOccurred()) Expect(updatedVault.GetSecret(files.SecretPostgresPrimaryServerKeyPem)).NotTo(BeNil()) }) @@ -269,7 +268,7 @@ codesphere: opts.PostgresReplicaIP = "10.10.0.7" opts.PostgresReplicaName = "new_replica" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -289,7 +288,7 @@ codesphere: opts.CodespherePublicIP = "203.0.113.100" opts.KubernetesPodCIDR = "10.244.0.0/16" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -311,7 +310,7 @@ codesphere: opts.KubernetesPodCIDR = "100.96.0.0/11" opts.KubernetesServiceCIDR = "100.64.0.0/13" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -327,7 +326,7 @@ codesphere: opts.ClusterGatewayServiceType = "NodePort" opts.ClusterGatewayIPAddresses = []string{"192.168.1.200", "192.168.1.201"} - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -343,7 +342,7 @@ codesphere: opts.CodesphereDNSServers = []string{"1.1.1.1", "1.0.0.1"} opts.CodesphereWorkspaceHostingBaseDomain = "workspaces.updated.example.com" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -358,7 +357,7 @@ codesphere: It("should update Ceph nodes subnet", func() { opts.CephNodesSubnet = "10.53.102.0/24" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) @@ -378,7 +377,7 @@ codesphere: // The fixture vault holds only some of the secrets EnsureSecrets knows about, // so every run of the command finds something to generate. It("asks before generating a secret the vault does not have", func() { - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) Expect(confirmations).To(HaveLen(1)) @@ -388,12 +387,14 @@ codesphere: It("leaves the vault alone when the operator declines", func() { approveConfirmations = false - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) Expect(icg.GetVault().GetSecret(files.SecretMounterHmacSecret)).To(BeNil()) - writtenVault, err := vault.LoadVaultData(vaultFile.Name(), "") + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultFile.Name()}) + Expect(err).NotTo(HaveOccurred()) + writtenVault, err := backend.Load() Expect(err).NotTo(HaveOccurred()) Expect(writtenVault.GetSecret(files.SecretMounterHmacSecret)).To(BeNil()) }) @@ -401,7 +402,7 @@ codesphere: It("asks nothing with --yes", func() { opts.Yes = true - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) Expect(confirmations).To(BeEmpty()) @@ -411,7 +412,7 @@ codesphere: It("asks before regenerating certificates an update invalidates", func() { opts.PostgresPrimaryIP = "10.10.0.4" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() Expect(cmd.UpdateInstallConfig(icg)).To(Succeed()) Expect(confirmations).To(HaveLen(2)) @@ -423,12 +424,12 @@ codesphere: opts.PostgresPrimaryIP = "10.10.0.4" approveConfirmations = false - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).To(MatchError(ContainSubstring("aborted"))) - written := installer.NewInstallConfigManager() + written := newSOPSInstallConfigManager() Expect(written.LoadInstallConfigFromFile(configFile.Name())).To(Succeed()) Expect(written.GetInstallConfig().Postgres.Primary.IP).To(Equal("10.0.0.5")) Expect(confirmations).To(HaveLen(1)) @@ -439,7 +440,7 @@ codesphere: It("should return an error", func() { opts.ConfigFile = "/nonexistent/config.yaml" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("failed to load config file")) @@ -450,7 +451,7 @@ codesphere: It("should return an error", func() { opts.VaultFile = "/nonexistent/vault.yaml" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err := cmd.UpdateInstallConfig(icg) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("failed to load vault file")) @@ -476,11 +477,13 @@ codesphere: } opts.CodesphereDomain = "updated.example.com" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err = cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) - updatedVault, err := vault.LoadVaultData(vaultFile.Name(), "") + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultFile.Name()}) + Expect(err).NotTo(HaveOccurred()) + updatedVault, err := backend.Load() Expect(err).NotTo(HaveOccurred()) // Verify all initial secrets are still present with the same values @@ -507,11 +510,13 @@ codesphere: } opts.PostgresPrimaryIP = "10.20.0.10" - icg := installer.NewInstallConfigManager() + icg := newSOPSInstallConfigManager() err = cmd.UpdateInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) - updatedVault, err := vault.LoadVaultData(vaultFile.Name(), "") + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultFile.Name()}) + Expect(err).NotTo(HaveOccurred()) + updatedVault, err := backend.Load() Expect(err).NotTo(HaveOccurred()) // Verify all initial secrets are still present with the same values diff --git a/docs/oms_beta.md b/docs/oms_beta.md index 3e19c4f21..4c0386d56 100644 --- a/docs/oms_beta.md +++ b/docs/oms_beta.md @@ -20,5 +20,5 @@ Be aware that that usage and behavior may change as the features are developed. * [oms beta bootstrap-local](oms_beta_bootstrap-local.md) - Bootstrap a local Codesphere environment * [oms beta extend](oms_beta_extend.md) - Extend Codesphere ressources such as base images. * [oms beta install](oms_beta_install.md) - Install beta components -* [oms beta vault-secret](oms_beta_vault-secret.md) - Create a Kubernetes secret from a SOPS-encrypted vault file +* [oms beta vault-secret](oms_beta_vault-secret.md) - Create a Kubernetes secret from a vault file diff --git a/docs/oms_beta_vault-secret.md b/docs/oms_beta_vault-secret.md index 268a8d0d4..d05e1257d 100644 --- a/docs/oms_beta_vault-secret.md +++ b/docs/oms_beta_vault-secret.md @@ -1,11 +1,11 @@ ## oms beta vault-secret -Create a Kubernetes secret from a SOPS-encrypted vault file +Create a Kubernetes secret from a vault file ### Synopsis -Create a Kubernetes secret from a SOPS-encrypted prod.vault.yaml file. -Reads the encrypted vault file, decrypts it using the age key, and creates a Kubernetes secret +Create a Kubernetes secret from a prod.vault.yaml file. +Loads the selected vault type and creates a Kubernetes secret with all the vault entries as key-value pairs in the target cluster. ``` @@ -26,11 +26,12 @@ $ oms vault-secret --vault-file prod.vault.yaml --age-key /path/to/age_key.txt - ### Options ``` - --age-key string Path to the age key file (optional, will use defaults if not provided) + --age-key string Path to the age key file (required for sops unless an age key environment variable is set) -h, --help help for vault-secret --namespace string Kubernetes namespace where the secret will be created (default "codesphere") --secret-name string Name of the Kubernetes secret to create (default "cs-vault") - --vault-file string Path to the SOPS-encrypted vault file (required) + --vault-file string Path to the vault file (required) + --vault-type string Vault storage type (sops or plain) (default "sops") ``` ### SEE ALSO diff --git a/docs/oms_init_install-config.md b/docs/oms_init_install-config.md index ee0db9690..1000442a8 100644 --- a/docs/oms_init_install-config.md +++ b/docs/oms_init_install-config.md @@ -57,6 +57,7 @@ $ oms init install-config --validate -c config.yaml --vault prod.vault.yaml --acme-enabled Enable ACME certificate issuer --acme-issuer-name string Name for the ACME ClusterIssuer (default "acme-issuer") --acme-server string ACME server URL (default "https://acme-v02.api.letsencrypt.org/directory") + --age-key string Path to the age private key (required for sops unless SOPS_AGE_KEY or SOPS_AGE_KEY_FILE is set) --ansible-inventory string Path to Ansible inventory file to import host information from --ceph-csi-kubelet-dir string Directory of kubelet for ceph csi. Required for some cloud providers --ceph-nodes-subnet string CIDR subnet for ceph nodes @@ -90,6 +91,7 @@ $ oms init install-config --validate -c config.yaml --vault prod.vault.yaml --secrets-dir string Secrets base directory (default "/root/secrets") --validate Validate existing config files instead of creating new ones --vault string Output file path for prod.vault.yaml (default "prod.vault.yaml") + --vault-type string Vault storage type (sops or plain) (default "sops") --with-comments Add helpful comments to the generated YAML files ``` diff --git a/docs/oms_install_codesphere.md b/docs/oms_install_codesphere.md index dcf6c2148..8c6488ce6 100644 --- a/docs/oms_install_codesphere.md +++ b/docs/oms_install_codesphere.md @@ -38,9 +38,9 @@ $ oms install codesphere -p codesphere-v1.2.3-installer-lite.tar.gz -k 0 { - b.ensureConfigManagers() - return + return b.ensureConfigManagers() } - b.Env.DataCenters = BuildDataCenters(b.Env, nil) + b.Env.DataCenters = BuildDataCenters(b.Env) b.adoptLegacyEnvFields() - b.ensureConfigManagers() + + return b.ensureConfigManagers() } // ensureConfigManagers gives every data center an install config manager. The primary one reuses // the bootstrapper's, so a single-DC bootstrap behaves exactly as it did before multi-DC support. // Data centers restored from an infra file arrive without a manager, since it is not serialised. -func (b *GCPBootstrapper) ensureConfigManagers() { - newICG := b.NewConfigManager - if newICG == nil { - newICG = installer.NewInstallConfigManager - } - +func (b *GCPBootstrapper) ensureConfigManagers() error { for i, dc := range b.Env.DataCenters { if dc.ConfigManager != nil { continue @@ -65,8 +61,15 @@ func (b *GCPBootstrapper) ensureConfigManagers() { continue } - dc.ConfigManager = newICG() + manager, err := installer.NewInstallConfigManager(string(vault.TypePlain), "") + if err != nil { + return fmt.Errorf("failed to initialize config manager for data center %d: %w", dc.ID, err) + } + + dc.ConfigManager = manager } + + return nil } // adoptLegacyEnvFields moves state that a caller supplied through the deprecated top-level @@ -125,7 +128,7 @@ func (b *GCPBootstrapper) mirrorPrimaryDataCenter() { // newDataCenter builds one data center, deriving its resource names, file paths and domains // from the environment and the data-center suffix. -func newDataCenter(env *CodesphereEnvironment, id int, suffix string, newICG func() installer.InstallConfigManager) *datacenter.DataCenter { +func newDataCenter(env *CodesphereEnvironment, id int, suffix string) *datacenter.DataCenter { name := env.DatacenterName if name == "" { name = "dev" @@ -148,10 +151,6 @@ func newDataCenter(env *CodesphereEnvironment, id int, suffix string, newICG fun SSHBaseDomain: sshBaseDomain(env, id), ExternalPostgres: suffix != "", } - if newICG != nil { - dc.ConfigManager = newICG() - } - return dc } diff --git a/internal/bootstrap/gcp/datacenter_test.go b/internal/bootstrap/gcp/datacenter_test.go index c5837b36b..fd44e48f9 100644 --- a/internal/bootstrap/gcp/datacenter_test.go +++ b/internal/bootstrap/gcp/datacenter_test.go @@ -9,7 +9,6 @@ import ( "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" "github.com/codesphere-cloud/oms/internal/bootstrap/gcp" - "github.com/codesphere-cloud/oms/internal/installer" ) var _ = Describe("BuildDataCenters", func() { @@ -26,7 +25,7 @@ var _ = Describe("BuildDataCenters", func() { Context("single data center", func() { It("keeps the paths, secrets dir and domains a single-DC bootstrap has always used", func() { - dcs := gcp.BuildDataCenters(newEnv(false), installer.NewInstallConfigManager) + dcs := gcp.BuildDataCenters(newEnv(false)) Expect(dcs).To(HaveLen(1)) dc := dcs[0] @@ -52,7 +51,7 @@ var _ = Describe("BuildDataCenters", func() { var dcs []*datacenter.DataCenter BeforeEach(func() { - dcs = gcp.BuildDataCenters(newEnv(true), installer.NewInstallConfigManager) + dcs = gcp.BuildDataCenters(newEnv(true)) }) It("builds two data centers with the second sharing the first's postgres", func() { @@ -91,16 +90,12 @@ var _ = Describe("BuildDataCenters", func() { Expect(dcs[1].WorkspaceHostingBaseDomain).To(Equal("2.ws.example.com")) Expect(dcs[1].SSHBaseDomain).To(Equal("2.ssh.cs.example.com")) }) - - It("gives each data center its own config manager", func() { - Expect(dcs[0].ConfigManager).NotTo(BeIdenticalTo(dcs[1].ConfigManager)) - }) }) It("falls back to the dev datacenter name", func() { env := newEnv(false) env.DatacenterName = "" - Expect(gcp.BuildDataCenters(env, installer.NewInstallConfigManager)[0].Name).To(Equal("dev")) + Expect(gcp.BuildDataCenters(env)[0].Name).To(Equal("dev")) }) }) diff --git a/internal/bootstrap/gcp/gce.go b/internal/bootstrap/gcp/gce.go index 0d267be6a..e71f7927d 100644 --- a/internal/bootstrap/gcp/gce.go +++ b/internal/bootstrap/gcp/gce.go @@ -110,7 +110,9 @@ type vmResult struct { // EnsureComputeInstances ensures that all required compute instances are present and running. func (b *GCPBootstrapper) EnsureComputeInstances() error { - b.ensureDataCenters() + if err := b.ensureDataCenters(); err != nil { + return err + } sshKeys, err := b.getSSHKeys() if err != nil { diff --git a/internal/bootstrap/gcp/gce_test.go b/internal/bootstrap/gcp/gce_test.go index 3ef77bd20..033a11aab 100644 --- a/internal/bootstrap/gcp/gce_test.go +++ b/internal/bootstrap/gcp/gce_test.go @@ -26,7 +26,7 @@ var _ = Describe("GCE", func() { Describe("VMDefsForEnv", func() { It("keeps the names a single-data-center bootstrap has always used", func() { env := &gcp.CodesphereEnvironment{} - env.DataCenters = gcp.BuildDataCenters(env, nil) + env.DataCenters = gcp.BuildDataCenters(env) defs := gcp.VMDefsForEnv(env) @@ -39,7 +39,7 @@ var _ = Describe("GCE", func() { It("adds suffixed ceph and k0s nodes per additional data center", func() { env := &gcp.CodesphereEnvironment{MultiDC: true} - env.DataCenters = gcp.BuildDataCenters(env, nil) + env.DataCenters = gcp.BuildDataCenters(env) defs := gcp.VMDefsForEnv(env) @@ -54,7 +54,7 @@ var _ = Describe("GCE", func() { It("assigns the shared VMs to no data center and the rest to theirs", func() { env := &gcp.CodesphereEnvironment{MultiDC: true} - env.DataCenters = gcp.BuildDataCenters(env, nil) + env.DataCenters = gcp.BuildDataCenters(env) byName := map[string]int{} for _, def := range gcp.VMDefsForEnv(env) { diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index d012e84cd..2902070ca 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -99,9 +99,6 @@ type GCPBootstrapper struct { NodeClient node.NodeClient PortalClient portal.Portal GitHubClient github.GitHubClient - // NewConfigManager creates the install config manager of a data center. Each data center - // owns its own config and vault, so multi-DC bootstraps need more than one. - NewConfigManager func() installer.InstallConfigManager } // primaryDC returns the first data center, which owns the shared PostgreSQL server and the @@ -234,17 +231,16 @@ func NewGCPBootstrapper( gitHubClient github.GitHubClient, ) (*GCPBootstrapper, error) { return &GCPBootstrapper{ - ctx: ctx, - stlog: stlog, - fw: fw, - icg: icg, - GCPClient: gcpClient, - Env: CodesphereEnv, - NodeClient: sshRunner, - PortalClient: portalClient, - Time: time, - GitHubClient: gitHubClient, - NewConfigManager: installer.NewInstallConfigManager, + ctx: ctx, + stlog: stlog, + fw: fw, + icg: icg, + GCPClient: gcpClient, + Env: CodesphereEnv, + NodeClient: sshRunner, + PortalClient: portalClient, + Time: time, + GitHubClient: gitHubClient, }, nil } diff --git a/internal/bootstrap/gcp/gcp_test.go b/internal/bootstrap/gcp/gcp_test.go index 62ba6c8c8..43edc3ccd 100644 --- a/internal/bootstrap/gcp/gcp_test.go +++ b/internal/bootstrap/gcp/gcp_test.go @@ -166,7 +166,7 @@ var _ = Describe("GCP Bootstrapper", func() { icg.EXPECT().ApplyProfile("minimal").Return(nil) // Returning a real install config to avoid nil pointer dereferences later icg.EXPECT().GetInstallConfig().RunAndReturn(func() *files.RootConfig { - realIcm := installer.NewInstallConfigManager() + realIcm := newPlainInstallConfigManager() _ = realIcm.ApplyProfile("minimal") return realIcm.GetInstallConfig() }) @@ -174,7 +174,7 @@ var _ = Describe("GCP Bootstrapper", func() { projectId := "test-project-12345" // EnsureSecrets - fw.EXPECT().Exists("fake-secret").Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile("fake-secret").Return(nil) icg.EXPECT().GetVault().Return(&files.InstallVault{}) // EnsureProject @@ -235,7 +235,7 @@ var _ = Describe("GCP Bootstrapper", func() { icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, "fake-config-file", "/etc/codesphere/config.yaml").Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, "fake-secret", "/etc/codesphere/secrets/prod.vault.yaml").Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) // Enable Root Login nodeClient.EXPECT().WaitReady(mock.Anything, mock.Anything).Return(nil).Return(nil) @@ -727,7 +727,7 @@ var _ = Describe("GCP Bootstrapper", func() { }) It("uses existing when config file exists", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(nil) icg.EXPECT().GetInstallConfig().Return(&files.RootConfig{}) @@ -737,7 +737,6 @@ var _ = Describe("GCP Bootstrapper", func() { It("loads existing vault before existing config for templating", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(nil) icg.EXPECT().GetInstallConfig().Return(&files.RootConfig{}) @@ -760,7 +759,7 @@ var _ = Describe("GCP Bootstrapper", func() { Describe("Invalid cases", func() { It("returns error when config file exists but fails to load", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(fmt.Errorf("bad format")) err := bs.EnsureInstallConfig() @@ -784,7 +783,6 @@ var _ = Describe("GCP Bootstrapper", func() { Describe("EnsureSecrets", func() { Describe("Valid EnsureSecrets", func() { It("loads existing secrets file", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().GetVault().Return(&files.InstallVault{}) @@ -793,7 +791,7 @@ var _ = Describe("GCP Bootstrapper", func() { }) It("skips when secrets file missing", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().GetVault().Return(&files.InstallVault{}) err := bs.EnsureSecrets() @@ -803,7 +801,6 @@ var _ = Describe("GCP Bootstrapper", func() { Describe("Invalid cases", func() { It("returns error when secrets file load fails", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(fmt.Errorf("load error")) err := bs.EnsureSecrets() diff --git a/internal/bootstrap/gcp/infrafile.go b/internal/bootstrap/gcp/infrafile.go index e9e77bfd8..1c86eedf5 100644 --- a/internal/bootstrap/gcp/infrafile.go +++ b/internal/bootstrap/gcp/infrafile.go @@ -40,7 +40,9 @@ func LoadInfraFile(fw util.FileIO, infraFilePath string) (CodesphereEnvironment, // WriteInfraFile writes details about the bootstrapped codesphere environment into a file. func (b *GCPBootstrapper) WriteInfraFile() error { - b.ensureDataCenters() + if err := b.ensureDataCenters(); err != nil { + return err + } // The steps that still write the top-level node and IP fields are migrated to DataCenters // one by one, so keep both in sync until the last one is. diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 774dbdc0c..19c73ddc8 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -51,15 +51,9 @@ func (b *GCPBootstrapper) EnsureInstallConfig() error { } func (b *GCPBootstrapper) loadVaultForConfigTemplating() error { - if !b.fw.Exists(b.Env.SecretsFilePath) { - return nil - } - - // during bootstrapping, the vault is not yet encrpyted if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { return fmt.Errorf("failed to load vault from file: %w", err) } - return nil } @@ -416,7 +410,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { return fmt.Errorf("failed to write config file: %w", err) } - if err := b.icg.WriteUnencryptedVault(b.Env.SecretsFilePath, true); err != nil { + if err := b.icg.WriteVault(b.Env.SecretsFilePath, true); err != nil { return fmt.Errorf("failed to write vault file: %w", err) } @@ -567,11 +561,8 @@ func (b *GCPBootstrapper) EnsureAgeKey() error { } func (b *GCPBootstrapper) EnsureSecrets() error { - if b.fw.Exists(b.Env.SecretsFilePath) { - err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath) - if err != nil { - return fmt.Errorf("failed to load vault file: %w", err) - } + if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { + return fmt.Errorf("failed to load vault file: %w", err) } b.Env.Secrets = b.icg.GetVault() return nil diff --git a/internal/bootstrap/gcp/install_config_test.go b/internal/bootstrap/gcp/install_config_test.go index 383989631..9655fc1c4 100644 --- a/internal/bootstrap/gcp/install_config_test.go +++ b/internal/bootstrap/gcp/install_config_test.go @@ -115,7 +115,7 @@ var _ = Describe("Installconfig & Secrets", func() { }) It("uses existing when config file exists", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(nil) icg.EXPECT().GetInstallConfig().Return(&files.RootConfig{}) @@ -125,7 +125,6 @@ var _ = Describe("Installconfig & Secrets", func() { It("loads existing vault before existing config for templating", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(nil) icg.EXPECT().GetInstallConfig().Return(&files.RootConfig{}) @@ -158,7 +157,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("overwrites an existing config", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(nil) icg.EXPECT().GetInstallConfig().Return(&files.RootConfig{}) @@ -171,7 +170,7 @@ var _ = Describe("Installconfig & Secrets", func() { Describe("Invalid cases", func() { It("returns error when config file exists but fails to load", func() { fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(fmt.Errorf("bad format")) err := bs.EnsureInstallConfig() @@ -266,7 +265,7 @@ var _ = Describe("Installconfig & Secrets", func() { nodeClient.EXPECT().RunCommand(mock.Anything, mock.Anything, mock.Anything).Return(nil) fw.EXPECT().Exists(csEnv.InstallConfigPath).Return(true) - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().LoadInstallConfigFromFile(csEnv.InstallConfigPath).Return(fmt.Errorf("bad format")) err := bs.EnsureInstallConfig() @@ -281,7 +280,6 @@ var _ = Describe("Installconfig & Secrets", func() { Describe("EnsureSecrets", func() { Describe("Valid EnsureSecrets", func() { It("loads existing secrets file", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().GetVault().Return(&files.InstallVault{}) @@ -290,7 +288,7 @@ var _ = Describe("Installconfig & Secrets", func() { }) It("skips when secrets file missing", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(false) + icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(nil) icg.EXPECT().GetVault().Return(&files.InstallVault{}) err := bs.EnsureSecrets() @@ -300,7 +298,6 @@ var _ = Describe("Installconfig & Secrets", func() { Describe("Invalid cases", func() { It("returns error when secrets file load fails", func() { - fw.EXPECT().Exists(csEnv.SecretsFilePath).Return(true) icg.EXPECT().LoadVaultFromUnecryptedFile(csEnv.SecretsFilePath).Return(fmt.Errorf("load error")) err := bs.EnsureSecrets() @@ -324,7 +321,7 @@ var _ = Describe("Installconfig & Secrets", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -372,7 +369,7 @@ var _ = Describe("Installconfig & Secrets", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -388,7 +385,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("uses those internal flags instead of defaults", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -405,7 +402,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("uses those preview flags instead of defaults", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -422,7 +419,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("uses those feature flags", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -439,7 +436,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("writes the email to the install config", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -456,7 +453,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("keeps the value of an existing config", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -473,7 +470,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting GitHub OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -492,7 +489,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets GitLab OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -516,7 +513,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting GitLab OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -534,7 +531,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets Bitbucket OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -558,7 +555,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting Bitbucket OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -576,7 +573,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets Azure DevOps OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -601,7 +598,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting Azure DevOps OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -621,7 +618,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets OIDC OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -648,7 +645,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("defaults OIDC provider name to OIDC", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -662,7 +659,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting OIDC OAuth configuration", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -680,7 +677,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets CentralOtel credentials in install config with Enabled true", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -696,7 +693,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("stores CentralOtel username and password in the vault", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -718,7 +715,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting CentralOtel credentials", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -736,7 +733,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("skips setting CentralOtel credentials", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -750,7 +747,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("leaves Monitoring.CentralOtel nil", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -768,7 +765,7 @@ var _ = Describe("Installconfig & Secrets", func() { gc.EXPECT().CreatePublicCAExternalAccountKey(mock.Anything).Return("fake-eab-key-id", "fake-eab-mac-key", nil) icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -800,7 +797,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("uses the Let's Encrypt staging directory", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -820,7 +817,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets OpenBao config in install config", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -842,7 +839,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets Grafana Alloy Loki config", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -858,7 +855,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("stores External Loki credentials in the vault", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -877,7 +874,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets Grafana Alloy Loki config without a password secret", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() @@ -900,7 +897,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets Prometheus remote write config", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -920,7 +917,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("leaves Prometheus remote write nil", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -939,7 +936,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets TelemetryExport with RemoteExport true", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -962,7 +959,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets TelemetryExport with Traces true and RemoteExport false", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -987,7 +984,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("sets TelemetryExport with both RemoteExport and Traces true", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -1006,7 +1003,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("leaves TelemetryExport nil", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -1035,10 +1032,10 @@ var _ = Describe("Installconfig & Secrets", func() { Expect(err.Error()).To(ContainSubstring("failed to write config file")) }) - It("fails when WriteUnencryptedVault fails", func() { + It("fails when WriteVault fails", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(fmt.Errorf("vault write error")) + icg.EXPECT().WriteVault("fake-secret", true).Return(fmt.Errorf("vault write error")) err := bs.UpdateInstallConfig() Expect(err).To(HaveOccurred()) @@ -1048,7 +1045,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("fails when CopyFile config fails", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("copy error")).Once() @@ -1060,7 +1057,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("fails when CopyFile secrets fails", func() { icg.EXPECT().GenerateSecrets().Return(nil) icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, "fake-config-file", mock.Anything).Return(nil).Once() nodeClient.EXPECT().CopyFile(mock.Anything, "fake-secret", mock.Anything).Return(fmt.Errorf("copy error")).Once() @@ -1099,7 +1096,7 @@ var _ = Describe("Installconfig & Secrets", func() { origCert := csEnv.InstallConfig.Postgres.Primary.SSLConfig.ServerCertPem icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -1130,7 +1127,7 @@ var _ = Describe("Installconfig & Secrets", func() { origKey := vault.GetSecret(files.SecretPostgresPrimaryServerKeyPem).File.Content icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() @@ -1164,7 +1161,7 @@ var _ = Describe("Installconfig & Secrets", func() { It("generates new cert/key pair", func() { icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) - icg.EXPECT().WriteUnencryptedVault("fake-secret", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() err := bs.UpdateInstallConfig() diff --git a/internal/bootstrap/gcp/install_config_test_helpers_test.go b/internal/bootstrap/gcp/install_config_test_helpers_test.go new file mode 100644 index 000000000..632675706 --- /dev/null +++ b/internal/bootstrap/gcp/install_config_test_helpers_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package gcp_test + +import ( + "github.com/codesphere-cloud/oms/internal/installer" + . "github.com/onsi/gomega" +) + +func newPlainInstallConfigManager() installer.InstallConfigManager { + manager, err := installer.NewInstallConfigManager("plain", "") + Expect(err).NotTo(HaveOccurred()) + + return manager +} diff --git a/internal/bootstrap/local/local.go b/internal/bootstrap/local/local.go index 4dad4255a..994620fc4 100644 --- a/internal/bootstrap/local/local.go +++ b/internal/bootstrap/local/local.go @@ -17,6 +17,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer/argocd" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" "github.com/codesphere-cloud/oms/internal/util" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -509,34 +510,22 @@ func (b *LocalBootstrapper) EnsureInstallConfig() error { } func (b *LocalBootstrapper) loadVaultForConfigTemplating() error { - if !b.fw.Exists(b.Env.SecretsFilePath) { - return nil - } - - // The local prod.vault.yaml file itn eh secrets dir is always unecrpyted. - // The encrypted version is in the "secrets" dir. if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { return fmt.Errorf("failed to load vault file for config templating: %w", err) } - return nil } func (b *LocalBootstrapper) EnsureSecrets() error { - if b.fw.Exists(b.Env.SecretsFilePath) { - err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath) - if err != nil { - return fmt.Errorf("failed to load vault file: %w", err) - } + if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { + return fmt.Errorf("failed to load vault file: %w", err) } - b.Env.Vault = b.icg.GetVault() - return nil } func (b *LocalBootstrapper) ResolveAgeKey() error { - recipient, keyPath, err := vault.ResolveAgeKey("", filepath.Dir(b.Env.SecretsFilePath)) + recipient, keyPath, err := sops.ResolveAgeKey("", filepath.Dir(b.Env.SecretsFilePath)) if err != nil { return fmt.Errorf("failed to resolve age key: %w", err) } @@ -669,11 +658,21 @@ func (b *LocalBootstrapper) UpdateInstallConfig() (err error) { return fmt.Errorf("failed to write config file: %w", err) } - if err := b.icg.WriteUnencryptedVault(b.Env.SecretsFilePath, true); err != nil { + if err := b.icg.WriteVault(b.Env.SecretsFilePath, true); err != nil { return fmt.Errorf("failed to write vault file: %w", err) } - if err := vault.EncryptFileWithSOPS(b.Env.SecretsFilePath, filepath.Join(b.Env.InstallConfig.Secrets.BaseDir, "prod.vault.yaml"), b.ageRecipient); err != nil { - return fmt.Errorf("failed to encrypt vault file: %w", err) + + installerVault, err := vault.New(vault.TypeSOPS, vault.Options{ + Path: filepath.Join(b.Env.InstallConfig.Secrets.BaseDir, "prod.vault.yaml"), + AgeKey: b.ageKeyPath, + WithComments: true, + }) + if err != nil { + return fmt.Errorf("failed to load installer vault: %w", err) + } + + if err := installerVault.Save(b.Env.Vault); err != nil { + return fmt.Errorf("failed to save installer vault: %w", err) } return nil diff --git a/internal/installer/argocd/install_and_apps_test.go b/internal/installer/argocd/install_and_apps_test.go index 66bbec087..7e6814c45 100644 --- a/internal/installer/argocd/install_and_apps_test.go +++ b/internal/installer/argocd/install_and_apps_test.go @@ -13,6 +13,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer/argocd" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -97,7 +98,7 @@ users: Expect(err).ToNot(HaveOccurred()) vaultPath := filepath.Join(secretsDir, "prod.vault.yaml") - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) config := files.RootConfig{ Secrets: files.SecretsConfig{ @@ -105,7 +106,7 @@ users: }, } - loadedVault, restConfig, err := installer.VaultAndRESTConfig("", ageKeyPath, config) + loadedVault, restConfig, err := installer.VaultAndRESTConfig("", ageKeyPath, string(vault.TypeSOPS), config) Expect(err).ToNot(HaveOccurred()) Expect(loadedVault).ToNot(BeNil()) Expect(restConfig).ToNot(BeNil()) diff --git a/internal/installer/cluster_admin.go b/internal/installer/cluster_admin.go index 448d07a65..5642d3714 100644 --- a/internal/installer/cluster_admin.go +++ b/internal/installer/cluster_admin.go @@ -31,21 +31,25 @@ func ResolveVaultPath(vaultPath string, config files.RootConfig) (string, error) return filepath.Join(config.Secrets.BaseDir, "prod.vault.yaml"), nil } -// VaultAndRESTConfig loads the vault at vaultPath (or the config's secrets -// baseDir fallback) and builds a Kubernetes REST config from the kubeconfig -// stored in it. -func VaultAndRESTConfig(vaultPath, privKey string, cfg files.RootConfig) (*files.InstallVault, *rest.Config, error) { +// VaultAndRESTConfig loads the selected vault implementation and builds +// a Kubernetes REST config from its kubeconfig secret. +func VaultAndRESTConfig(vaultPath, privKey, vaultType string, cfg files.RootConfig) (*files.InstallVault, *rest.Config, error) { resolvedPath, err := ResolveVaultPath(vaultPath, cfg) if err != nil { return nil, nil, err } - vault, err := vault.LoadVaultData(resolvedPath, privKey) + store, err := vault.NewFromString(vaultType, vault.Options{Path: resolvedPath, AgeKey: privKey}) + if err != nil { + return nil, nil, fmt.Errorf("failed to initialize vault backend: %w", err) + } + + data, err := store.Load() if err != nil { return nil, nil, fmt.Errorf("failed to load vault %s: %w", resolvedPath, err) } - kubeConfigContent, err := kubeConfigContentFromVault(vault) + kubeConfigContent, err := kubeConfigContentFromVault(data) if err != nil { return nil, nil, err } @@ -55,7 +59,7 @@ func VaultAndRESTConfig(vaultPath, privKey string, cfg files.RootConfig) (*files return nil, nil, fmt.Errorf("failed to load kubernetes config from vault: %w", err) } - return vault, restConfig, nil + return data, restConfig, nil } func kubeConfigContentFromVault(vault *files.InstallVault) (string, error) { @@ -75,13 +79,13 @@ func kubeConfigContentFromVault(vault *files.InstallVault) (string, error) { // codesphere.clusterAdminEmail to the cluster-admin-email secret before the // platform is installed, so the auth-service finds it on first start. // It is a no-op when the config does not set an email. -func EnsureClusterAdminSecret(ctx context.Context, vaultPath, privKey string, cfg files.RootConfig) error { +func EnsureClusterAdminSecret(ctx context.Context, vaultPath, privKey, vaultType string, cfg files.RootConfig) error { email := cfg.Codesphere.ClusterAdminEmail if email == "" { return nil } - _, restConfig, err := VaultAndRESTConfig(vaultPath, privKey, cfg) + _, restConfig, err := VaultAndRESTConfig(vaultPath, privKey, vaultType, cfg) if err != nil { return err } diff --git a/internal/installer/cluster_admin_test.go b/internal/installer/cluster_admin_test.go index d30e618ba..8dd2c0920 100644 --- a/internal/installer/cluster_admin_test.go +++ b/internal/installer/cluster_admin_test.go @@ -16,6 +16,7 @@ import ( "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" ) const testKubeConfig = `apiVersion: v1 @@ -56,7 +57,7 @@ func writeVaultFile(dir string, installVault *files.InstallVault) (vaultPath, ag Expect(err).ToNot(HaveOccurred()) vaultPath = filepath.Join(dir, "prod.vault.yaml") - Expect(vault.EncryptFileWithSOPS(plaintextPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) return vaultPath, ageKeyPath } @@ -110,7 +111,7 @@ var _ = Describe("VaultAndRESTConfig", func() { It("loads the vault and builds a REST config from the kubeconfig secret", func() { vaultPath, ageKeyPath := writeVaultFile(GinkgoT().TempDir(), vaultWithKubeConfig()) - vault, restConfig, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, files.RootConfig{}) + vault, restConfig, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, string(vault.TypeSOPS), files.RootConfig{}) Expect(err).ToNot(HaveOccurred()) Expect(vault).ToNot(BeNil()) Expect(vault.GetSecret(files.SecretKubeConfig)).ToNot(BeNil()) @@ -123,7 +124,7 @@ var _ = Describe("VaultAndRESTConfig", func() { secretsDir := GinkgoT().TempDir() _, ageKeyPath := writeVaultFile(secretsDir, vaultWithKubeConfig()) - vault, restConfig, err := installer.VaultAndRESTConfig("", ageKeyPath, files.RootConfig{ + vault, restConfig, err := installer.VaultAndRESTConfig("", ageKeyPath, string(vault.TypeSOPS), files.RootConfig{ Secrets: files.SecretsConfig{BaseDir: secretsDir}, }) Expect(err).ToNot(HaveOccurred()) @@ -132,14 +133,15 @@ var _ = Describe("VaultAndRESTConfig", func() { }) It("fails when the vault path cannot be resolved", func() { - _, _, err := installer.VaultAndRESTConfig("", "", files.RootConfig{}) + _, _, err := installer.VaultAndRESTConfig("", "", string(vault.TypeSOPS), files.RootConfig{}) Expect(err).To(MatchError(ContainSubstring("vault path is not set"))) }) It("fails when the vault file does not exist", func() { - vaultPath := filepath.Join(GinkgoT().TempDir(), "missing.vault.yaml") + tempDir := GinkgoT().TempDir() + vaultPath := filepath.Join(tempDir, "missing.vault.yaml") - _, _, err := installer.VaultAndRESTConfig(vaultPath, "", files.RootConfig{}) + _, _, err := installer.VaultAndRESTConfig(vaultPath, filepath.Join(tempDir, "unused-age-key"), string(vault.TypeSOPS), files.RootConfig{}) Expect(err).To(MatchError(ContainSubstring("failed to load vault"))) }) @@ -153,7 +155,7 @@ var _ = Describe("VaultAndRESTConfig", func() { }, }) - _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, files.RootConfig{}) + _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, string(vault.TypeSOPS), files.RootConfig{}) Expect(err).To(MatchError(ContainSubstring("kubeconfig not found in vault"))) }) @@ -167,7 +169,7 @@ var _ = Describe("VaultAndRESTConfig", func() { }, }) - _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, files.RootConfig{}) + _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, string(vault.TypeSOPS), files.RootConfig{}) Expect(err).To(MatchError(ContainSubstring("kubeconfig not found in vault"))) }) @@ -181,7 +183,7 @@ var _ = Describe("VaultAndRESTConfig", func() { }, }) - _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, files.RootConfig{}) + _, _, err := installer.VaultAndRESTConfig(vaultPath, ageKeyPath, string(vault.TypeSOPS), files.RootConfig{}) Expect(err).To(MatchError(ContainSubstring("failed to load kubernetes config from vault"))) }) }) @@ -190,7 +192,7 @@ var _ = Describe("EnsureClusterAdminSecret", func() { It("is a no-op when the config does not set a cluster admin email", func() { // No vault path or secrets baseDir: reaching the vault loading would fail, // so a nil result proves the email check short-circuits first. - err := installer.EnsureClusterAdminSecret(context.Background(), "", "", files.RootConfig{}) + err := installer.EnsureClusterAdminSecret(context.Background(), "", "", string(vault.TypeSOPS), files.RootConfig{}) Expect(err).ToNot(HaveOccurred()) }) @@ -199,17 +201,18 @@ var _ = Describe("EnsureClusterAdminSecret", func() { Codesphere: files.CodesphereConfig{ClusterAdminEmail: "admin@codesphere.com"}, } - err := installer.EnsureClusterAdminSecret(context.Background(), "", "", cfg) + err := installer.EnsureClusterAdminSecret(context.Background(), "", "", string(vault.TypeSOPS), cfg) Expect(err).To(MatchError(ContainSubstring("vault path is not set"))) }) It("fails when the vault file does not exist", func() { - vaultPath := filepath.Join(GinkgoT().TempDir(), "missing.vault.yaml") + tempDir := GinkgoT().TempDir() + vaultPath := filepath.Join(tempDir, "missing.vault.yaml") cfg := files.RootConfig{ Codesphere: files.CodesphereConfig{ClusterAdminEmail: "admin@codesphere.com"}, } - err := installer.EnsureClusterAdminSecret(context.Background(), vaultPath, "", cfg) + err := installer.EnsureClusterAdminSecret(context.Background(), vaultPath, filepath.Join(tempDir, "unused-age-key"), string(vault.TypeSOPS), cfg) Expect(err).To(MatchError(ContainSubstring("failed to load vault"))) }) }) diff --git a/internal/installer/config_generator_collector_test.go b/internal/installer/config_generator_collector_test.go index 4511c0476..1738d72db 100644 --- a/internal/installer/config_generator_collector_test.go +++ b/internal/installer/config_generator_collector_test.go @@ -17,7 +17,7 @@ var _ = Describe("ConfigGeneratorCollector", func() { ) BeforeEach(func() { - manager = installer.NewInstallConfigManager() + manager = newPlainInstallConfigManager() }) Describe("CollectInteractively", func() { diff --git a/internal/installer/config_manager.go b/internal/installer/config_manager.go index 21081fb1c..cb3c184b3 100644 --- a/internal/installer/config_manager.go +++ b/internal/installer/config_manager.go @@ -44,15 +44,14 @@ type InstallConfigManager interface { GenerateSecrets() error WriteInstallConfig(configPath string, withComments bool) error WriteVault(vaultPath string, withComments bool) error - WriteUnencryptedVault(vaultPath string, withComments bool) error } type InstallConfig struct { - fileIO util.FileIO - vaultEncryptor vault.Encryptor - ageKeyResolver vault.AgeKeyResolver - Config *files.RootConfig - Vault *files.InstallVault + fileIO util.FileIO + Config *files.RootConfig + Vault *files.InstallVault + vaultType vault.Type + vaultAgeKey string } // SetFileIO overrides the file I/O implementation (useful for testing). @@ -60,39 +59,41 @@ func (g *InstallConfig) SetFileIO(fio util.FileIO) { g.fileIO = fio } -// SetVaultEncryptor overrides vault encryption (useful for testing). -func (g *InstallConfig) SetVaultEncryptor(encryptor vault.Encryptor) { - g.vaultEncryptor = encryptor -} - -// SetAgeKeyResolver overrides age key resolution (useful for testing). -func (g *InstallConfig) SetAgeKeyResolver(resolver vault.AgeKeyResolver) { - g.ageKeyResolver = resolver -} - -func (g *InstallConfig) encryptVault(src, target, recipient string) error { - if g.vaultEncryptor == nil { - return fmt.Errorf("vault encryptor is not configured") +// NewInstallConfigManager configures all vault reads and writes to go through +// the selected vault implementation. +func NewInstallConfigManager(vaultType string, ageKey string) (InstallConfigManager, error) { + t, err := vault.ParseType(vaultType) + if err != nil { + return nil, fmt.Errorf("failed to parse vault type %s: %w", vaultType, err) } - return g.vaultEncryptor.Encrypt(src, target, recipient) -} -func (g *InstallConfig) resolveAgeKey(explicitKeyFile, fallbackDir string) (recipient, keyPath string, err error) { - if g.ageKeyResolver == nil { - return "", "", fmt.Errorf("age key resolver is not configured") + if err := vault.ValidateConfiguration(t, ageKey); err != nil { + return nil, fmt.Errorf("failed to validate install config: %w", err) } - return g.ageKeyResolver.Resolve(explicitKeyFile, fallbackDir) -} -func NewInstallConfigManager() InstallConfigManager { config := files.NewRootConfig() + return &InstallConfig{ - fileIO: &util.FilesystemWriter{}, - vaultEncryptor: vault.SOPSEncryptor{}, - ageKeyResolver: vault.DefaultAgeKeyResolver{}, - Config: &config, - Vault: &files.InstallVault{}, + fileIO: &util.FilesystemWriter{}, + Config: &config, + Vault: &files.InstallVault{}, + vaultType: t, + vaultAgeKey: ageKey, + }, nil +} + +func (g *InstallConfig) vaultStore(path string, comments bool, forcedType ...vault.Type) (vault.Vault, error) { + t := g.vaultType + if len(forcedType) > 0 { + t = forcedType[0] + } + + vault, err := vault.New(t, vault.Options{Path: path, AgeKey: g.vaultAgeKey, WithComments: comments, FileIO: g.fileIO}) + if err != nil { + return nil, fmt.Errorf("failed to read vault: %w", err) } + + return vault, nil } func (g *InstallConfig) LoadInstallConfigFromFile(configPath string) error { @@ -116,26 +117,34 @@ func (g *InstallConfig) LoadInstallConfigFromFile(configPath string) error { return nil } -// LoadVaultFromFile loads the vault content from an encrypted file into the installConfig -// Returns an error if age key file has not been set as environment variable SOPS_AGE_KEY_FILE +// LoadVaultFromFile loads vault content using the manager's configured backend. +// An empty type selects the default SOPS backend. func (g *InstallConfig) LoadVaultFromFile(vaultPath string) error { - vault, err := vault.LoadVaultData(vaultPath, "") + store, err := g.vaultStore(vaultPath, false) if err != nil { - return err + return fmt.Errorf("failed to initialize vault backend: %w", err) } - g.Vault = vault + loaded, err := store.Load() + if err != nil { + return fmt.Errorf("failed to load vault: %w", err) + } + + g.Vault = loaded return nil } // LoadVaultFromUnecryptedFile loads the vault content from an unencrypted file into the installConfig func (g *InstallConfig) LoadVaultFromUnecryptedFile(vaultPath string) error { - vault, err := vault.LoadUnencryptedVaultData(vaultPath) + store, err := g.vaultStore(vaultPath, false, vault.TypePlain) if err != nil { - return err + return fmt.Errorf("failed to initialize vault backend: %w", err) } - g.Vault = vault + g.Vault, err = store.LoadOrCreate() + if err != nil { + return fmt.Errorf("failed to load vault: %w", err) + } return nil } @@ -351,83 +360,19 @@ func (g *InstallConfig) WriteInstallConfig(configPath string, withComments bool) return nil } -func (g *InstallConfig) WriteUnencryptedVault(vaultPath string, withComments bool) error { - vaultYAML, err := g.marshalVault(vaultPath, withComments) - if err != nil { - return err - } - - if err := g.fileIO.CreateAndWrite(vaultPath, vaultYAML, "Secrets"); err != nil { - return err - } - - return nil -} - func (g *InstallConfig) WriteVault(vaultPath string, withComments bool) error { - vaultYAML, err := g.marshalVault(vaultPath, withComments) - if err != nil { - return err - } - - recipient, _, err := g.resolveAgeKey("", filepath.Dir(vaultPath)) + store, err := g.vaultStore(vaultPath, withComments) if err != nil { - return fmt.Errorf("failed to resolve age key: %w", err) + return fmt.Errorf("failed to initialize vault backend: %w", err) } - plainPath, err := g.fileIO.CreateTemp(filepath.Dir(vaultPath), "."+filepath.Base(vaultPath)+".plaintext-*") + err = store.Save(g.Vault) if err != nil { - return fmt.Errorf("failed to create temporary plaintext vault: %w", err) - } - defer func() { - _ = g.fileIO.Remove(plainPath) - }() - if err := g.fileIO.WriteFile(plainPath, vaultYAML, 0600); err != nil { - return fmt.Errorf("failed to write temporary plaintext vault: %w", err) - } - - encryptedPath, err := g.fileIO.CreateTemp(filepath.Dir(vaultPath), "."+filepath.Base(vaultPath)+".encrypted-*") - if err != nil { - return fmt.Errorf("failed to create temporary encrypted vault: %w", err) - } - defer func() { - _ = g.fileIO.Remove(encryptedPath) - }() - - if err := g.encryptVault(plainPath, encryptedPath, recipient); err != nil { - return err - } - - if err := g.fileIO.Chmod(encryptedPath, 0600); err != nil { - return fmt.Errorf("failed to set encrypted vault permissions: %w", err) + return fmt.Errorf("failed to write vault: %w", err) } - if err := g.fileIO.Rename(encryptedPath, vaultPath); err != nil { - return fmt.Errorf("failed to replace encrypted vault: %w", err) - } - return nil } -func (g *InstallConfig) marshalVault(vaultPath string, withComments bool) ([]byte, error) { - if g.Config == nil { - return nil, fmt.Errorf("no configuration provided - config is nil") - } - if g.Vault == nil { - g.Vault = &files.InstallVault{} - } - - vaultYAML, err := g.Vault.Marshal() - if err != nil { - return nil, fmt.Errorf("failed to marshal %s: %w", filepath.Base(vaultPath), err) - } - - if withComments { - vaultYAML = AddVaultComments(vaultYAML) - } - - return vaultYAML, nil -} - func AddConfigComments(yamlData []byte) []byte { header := `# Codesphere Installer Configuration # Generated by OMS CLI diff --git a/internal/installer/config_manager_ansible_test.go b/internal/installer/config_manager_ansible_test.go index 7d9d374f4..6776f7d80 100644 --- a/internal/installer/config_manager_ansible_test.go +++ b/internal/installer/config_manager_ansible_test.go @@ -22,7 +22,7 @@ var _ = Describe("ConfigManagerAnsible", func() { ) BeforeEach(func() { - manager = installer.NewInstallConfigManager() + manager = newPlainInstallConfigManager() tempDir = GinkgoT().TempDir() inventoryFilePath = filepath.Join(tempDir, "inventory.yaml") diff --git a/internal/installer/config_manager_profile_test.go b/internal/installer/config_manager_profile_test.go index 23fd2eb2b..5923ff602 100644 --- a/internal/installer/config_manager_profile_test.go +++ b/internal/installer/config_manager_profile_test.go @@ -16,7 +16,7 @@ var _ = Describe("ConfigManagerProfile", func() { var manager installer.InstallConfigManager BeforeEach(func() { - manager = installer.NewInstallConfigManager() + manager = newPlainInstallConfigManager() }) Describe("ApplyProfile", func() { @@ -161,9 +161,9 @@ var _ = Describe("ConfigManagerProfile", func() { Context("profile-specific differences", func() { It("should have the expected datacenter names", func() { - devManager := installer.NewInstallConfigManager() - prodManager := installer.NewInstallConfigManager() - minimalManager := installer.NewInstallConfigManager() + devManager := newPlainInstallConfigManager() + prodManager := newPlainInstallConfigManager() + minimalManager := newPlainInstallConfigManager() err := devManager.ApplyProfile(installer.PROFILE_DEV) Expect(err).ToNot(HaveOccurred()) @@ -178,9 +178,9 @@ var _ = Describe("ConfigManagerProfile", func() { }) It("should have different resource profiles", func() { - devManager := installer.NewInstallConfigManager() - prodManager := installer.NewInstallConfigManager() - minimalManager := installer.NewInstallConfigManager() + devManager := newPlainInstallConfigManager() + prodManager := newPlainInstallConfigManager() + minimalManager := newPlainInstallConfigManager() err := devManager.ApplyProfile(installer.PROFILE_DEV) Expect(err).ToNot(HaveOccurred()) diff --git a/internal/installer/config_manager_secrets_test.go b/internal/installer/config_manager_secrets_test.go index 993fb4f22..20d8f276d 100644 --- a/internal/installer/config_manager_secrets_test.go +++ b/internal/installer/config_manager_secrets_test.go @@ -17,10 +17,8 @@ var _ = Describe("GenerateSecrets", func() { var mgr *installer.InstallConfig BeforeEach(func() { - mgr = &installer.InstallConfig{ - Config: &files.RootConfig{}, - Vault: &files.InstallVault{}, - } + mgr = newPlainInstallConfigManager().(*installer.InstallConfig) + mgr.Config = &files.RootConfig{} }) Context("with basic configuration (no postgres)", func() { @@ -187,10 +185,8 @@ var _ = Describe("GenerateSecrets", func() { Context("uniqueness", func() { It("generates different secrets for different instances", func() { - mgr2 := &installer.InstallConfig{ - Config: &files.RootConfig{}, - Vault: &files.InstallVault{}, - } + mgr2 := newPlainInstallConfigManager().(*installer.InstallConfig) + mgr2.Config = &files.RootConfig{} Expect(mgr.GenerateSecrets()).To(Succeed()) Expect(mgr2.GenerateSecrets()).To(Succeed()) diff --git a/internal/installer/config_manager_test.go b/internal/installer/config_manager_test.go index 8aed5c644..42733f855 100644 --- a/internal/installer/config_manager_test.go +++ b/internal/installer/config_manager_test.go @@ -5,7 +5,6 @@ package installer_test import ( "bytes" - "errors" "os" "path/filepath" @@ -15,7 +14,6 @@ import ( "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" - "github.com/codesphere-cloud/oms/internal/installer/vault" ) type MockFileIO struct { @@ -137,14 +135,13 @@ var _ = Describe("ConfigManager", func() { ) BeforeEach(func() { - configManager = &installer.InstallConfig{ - Config: &files.RootConfig{}, - } + manager := newPlainInstallConfigManager() + configManager = manager.(*installer.InstallConfig) }) Describe("NewInstallConfigManager", func() { It("should create a new config manager", func() { - manager := installer.NewInstallConfigManager() + manager := newPlainInstallConfigManager() Expect(manager).ToNot(BeNil()) }) }) @@ -595,39 +592,11 @@ var _ = Describe("ConfigManager", func() { }) Describe("WriteVault", func() { - It("should return error if config is nil", func() { + It("writes independently of the install config", func() { configManager.Config = nil - err := configManager.WriteVault("/tmp/vault.yaml", false) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("no configuration provided")) - }) - }) - - Describe("WriteVault", func() { - It("should preserve the existing vault when encryption fails", func() { - vaultPath := "prod.vault.yaml" - original := []byte("existing encrypted content") - mockIO := NewMockFileIO() - mockIO.files[vaultPath] = original - manager := &installer.InstallConfig{ - Config: &files.RootConfig{}, - Vault: &files.InstallVault{}, - } - ageKeyResolver := vault.NewMockAgeKeyResolver(GinkgoT()) - ageKeyResolver.EXPECT().Resolve("", ".").Return("recipient", "", nil) - encryptor := vault.NewMockEncryptor(GinkgoT()) - encryptor.EXPECT().Encrypt( - ".prod.vault.yaml.plaintext-*mock", - ".prod.vault.yaml.encrypted-*mock", - "recipient", - ).Return(errors.New("encryption failed")) - manager.SetFileIO(mockIO) - manager.SetAgeKeyResolver(ageKeyResolver) - manager.SetVaultEncryptor(encryptor) - - err := manager.WriteVault(vaultPath, false) - Expect(err).To(HaveOccurred()) - Expect(mockIO.GetFileContent(vaultPath)).To(Equal(original)) + vaultPath := filepath.Join(GinkgoT().TempDir(), "vault.yaml") + Expect(configManager.WriteVault(vaultPath, false)).To(Succeed()) + Expect(vaultPath).To(BeAnExistingFile()) }) }) @@ -658,9 +627,8 @@ var _ = Describe("ConfigManager", func() { }) Context("vault deduplication on re-write", func() { - It("should not produce duplicate vault entries when WriteUnencryptedVault is called after loading existing vault", func() { - mockIO := NewMockFileIO() - configManager.SetFileIO(mockIO) + It("should not produce duplicate vault entries when WriteVault is called after loading existing vault", func() { + vaultPath := filepath.Join(GinkgoT().TempDir(), "vault.yaml") err := configManager.ApplyProfile("prod") Expect(err).ToNot(HaveOccurred()) @@ -668,11 +636,12 @@ var _ = Describe("ConfigManager", func() { err = configManager.GenerateSecrets() Expect(err).ToNot(HaveOccurred()) - // First write via WriteUnencryptedVault - err = configManager.WriteUnencryptedVault("/tmp/vault.yaml", false) + // First write via WriteVault + err = configManager.WriteVault(vaultPath, false) Expect(err).ToNot(HaveOccurred()) - firstVaultBytes := mockIO.GetFileContent("/tmp/vault.yaml") + firstVaultBytes, err := os.ReadFile(vaultPath) + Expect(err).NotTo(HaveOccurred()) Expect(firstVaultBytes).ToNot(BeEmpty()) // Load the written vault back @@ -682,10 +651,11 @@ var _ = Describe("ConfigManager", func() { configManager.Vault = vault // Re-write vault (simulating a second run) - err = configManager.WriteUnencryptedVault("/tmp/vault.yaml", false) + err = configManager.WriteVault(vaultPath, false) Expect(err).ToNot(HaveOccurred()) - secondVaultBytes := mockIO.GetFileContent("/tmp/vault.yaml") + secondVaultBytes, err := os.ReadFile(vaultPath) + Expect(err).NotTo(HaveOccurred()) Expect(secondVaultBytes).To(Equal(firstVaultBytes), "serialized vault should be identical after load and re-write") }) @@ -696,6 +666,9 @@ var _ = Describe("ConfigManager", func() { mockIO := NewMockFileIO() configManager.SetFileIO(mockIO) + vaultPath := filepath.Join(GinkgoT().TempDir(), "vault.yaml") + vaultPath2 := filepath.Join(GinkgoT().TempDir(), "vault2.yaml") + // --- First run: generate everything from scratch --- err := configManager.ApplyProfile("prod") Expect(err).ToNot(HaveOccurred()) @@ -721,11 +694,11 @@ var _ = Describe("ConfigManager", func() { // Write config and vault err = configManager.WriteInstallConfig("/tmp/config.yaml", false) Expect(err).ToNot(HaveOccurred()) - err = configManager.WriteUnencryptedVault("/tmp/vault.yaml", false) + err = configManager.WriteVault(vaultPath, false) Expect(err).ToNot(HaveOccurred()) // --- Second run: simulate loading existing files --- - configManager2 := &installer.InstallConfig{} + configManager2 := newPlainInstallConfigManager().(*installer.InstallConfig) configManager2.SetFileIO(mockIO) // Reload config from written YAML @@ -740,7 +713,8 @@ var _ = Describe("ConfigManager", func() { "cert should be in config.yaml") // Reload vault from written YAML - vaultBytes := mockIO.GetFileContent("/tmp/vault.yaml") + vaultBytes, err := mockIO.ReadFile(vaultPath) + Expect(err).NotTo(HaveOccurred()) Expect(vaultBytes).ToNot(BeNil()) vault2 := &files.InstallVault{} err = vault2.Unmarshal(vaultBytes) @@ -761,12 +735,13 @@ var _ = Describe("ConfigManager", func() { Expect(err).ToNot(HaveOccurred(), "cert/key should match after load from vault") // Write vault again - err = configManager2.WriteUnencryptedVault("/tmp/vault2.yaml", false) + err = configManager2.WriteVault(vaultPath2, false) Expect(err).ToNot(HaveOccurred()) // Verify no duplicates in re-written vault vault3 := &files.InstallVault{} - vaultBytes2 := mockIO.GetFileContent("/tmp/vault2.yaml") + vaultBytes2, err := mockIO.ReadFile(vaultPath2) + Expect(err).NotTo(HaveOccurred()) err = vault3.Unmarshal(vaultBytes2) Expect(err).ToNot(HaveOccurred()) diff --git a/internal/installer/config_manager_test_helpers_test.go b/internal/installer/config_manager_test_helpers_test.go new file mode 100644 index 000000000..9c812f4e4 --- /dev/null +++ b/internal/installer/config_manager_test_helpers_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer_test + +import ( + "github.com/codesphere-cloud/oms/internal/installer" + . "github.com/onsi/gomega" +) + +func newPlainInstallConfigManager() installer.InstallConfigManager { + manager, err := installer.NewInstallConfigManager("plain", "") + Expect(err).NotTo(HaveOccurred()) + + return manager +} diff --git a/internal/installer/config_template_test.go b/internal/installer/config_template_test.go index c314a8a60..bea47366a 100644 --- a/internal/installer/config_template_test.go +++ b/internal/installer/config_template_test.go @@ -16,6 +16,7 @@ import ( "github.com/codesphere-cloud/oms/internal/configtemplating" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" ) func sopsAndAgeAvailable() bool { @@ -106,7 +107,7 @@ codesphere: Expect(exec.Command("age-keygen", "-o", ageKeyPath).Run()).To(Succeed()) recipient, err := exec.Command("age-keygen", "-y", ageKeyPath).Output() Expect(err).NotTo(HaveOccurred()) - Expect(vault.EncryptFileWithSOPS(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) + Expect(sops.EncryptFile(plaintextVaultPath, vaultPath, strings.TrimSpace(string(recipient)))).To(Succeed()) renderedPath, cleanup, err := configtemplating.RenderConfigFileToTemp( configPath, @@ -128,7 +129,9 @@ codesphere: Expect(err).NotTo(HaveOccurred()) Expect(os.WriteFile(vaultPath, vaultYaml, 0600)).To(Succeed()) - _, err = vault.LoadVaultData(vaultPath, "") + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultPath, AgeKey: filepath.Join(tempDir, "unused-age-key")}) + Expect(err).NotTo(HaveOccurred()) + _, err = backend.Load() Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("is not SOPS-encrypted")) diff --git a/internal/installer/mocks.go b/internal/installer/mocks.go index dba0f4be2..6f36a2239 100644 --- a/internal/installer/mocks.go +++ b/internal/installer/mocks.go @@ -833,63 +833,6 @@ func (_c *MockInstallConfigManager_WriteInstallConfig_Call) RunAndReturn(run fun return _c } -// WriteUnencryptedVault provides a mock function for the type MockInstallConfigManager -func (_mock *MockInstallConfigManager) WriteUnencryptedVault(vaultPath string, withComments bool) error { - ret := _mock.Called(vaultPath, withComments) - - if len(ret) == 0 { - panic("no return value specified for WriteUnencryptedVault") - } - - var r0 error - if returnFunc, ok := ret.Get(0).(func(string, bool) error); ok { - r0 = returnFunc(vaultPath, withComments) - } else { - r0 = ret.Error(0) - } - return r0 -} - -// MockInstallConfigManager_WriteUnencryptedVault_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WriteUnencryptedVault' -type MockInstallConfigManager_WriteUnencryptedVault_Call struct { - *mock.Call -} - -// WriteUnencryptedVault is a helper method to define mock.On call -// - vaultPath string -// - withComments bool -func (_e *MockInstallConfigManager_Expecter) WriteUnencryptedVault(vaultPath any, withComments any) *MockInstallConfigManager_WriteUnencryptedVault_Call { - return &MockInstallConfigManager_WriteUnencryptedVault_Call{Call: _e.mock.On("WriteUnencryptedVault", vaultPath, withComments)} -} - -func (_c *MockInstallConfigManager_WriteUnencryptedVault_Call) Run(run func(vaultPath string, withComments bool)) *MockInstallConfigManager_WriteUnencryptedVault_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 string - if args[0] != nil { - arg0 = args[0].(string) - } - var arg1 bool - if args[1] != nil { - arg1 = args[1].(bool) - } - run( - arg0, - arg1, - ) - }) - return _c -} - -func (_c *MockInstallConfigManager_WriteUnencryptedVault_Call) Return(err error) *MockInstallConfigManager_WriteUnencryptedVault_Call { - _c.Call.Return(err) - return _c -} - -func (_c *MockInstallConfigManager_WriteUnencryptedVault_Call) RunAndReturn(run func(vaultPath string, withComments bool) error) *MockInstallConfigManager_WriteUnencryptedVault_Call { - _c.Call.Return(run) - return _c -} - // WriteVault provides a mock function for the type MockInstallConfigManager func (_mock *MockInstallConfigManager) WriteVault(vaultPath string, withComments bool) error { ret := _mock.Called(vaultPath, withComments) diff --git a/internal/installer/openbao.go b/internal/installer/openbao.go index 885750892..ae9377ab3 100644 --- a/internal/installer/openbao.go +++ b/internal/installer/openbao.go @@ -18,7 +18,7 @@ import ( "time" "github.com/codesphere-cloud/oms/internal/bootstrap" - "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" k8s "github.com/codesphere-cloud/oms/internal/util" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -280,7 +280,7 @@ func (o *OpenBaoInstaller) PreFlightDRCheck() error { o.Logger.Logf("Found existing DR backup at %s", o.Config.DRBackupPath) - decrypted, err := vault.DecryptFileWithSOPS(o.Config.DRBackupPath, o.Config.AgeKeyPath) + decrypted, err := sops.DecryptFile(o.Config.DRBackupPath, o.Config.AgeKeyPath) if err != nil { return err } @@ -687,7 +687,7 @@ func (o *OpenBaoInstaller) ExtractAndEncrypt() error { return fmt.Errorf("closing temp backup file: %w", err) } - if err := vault.EncryptFileWithSOPS(tmpPath, o.Config.DRBackupPath, o.Config.AgeRecipient); err != nil { + if err := sops.EncryptFile(tmpPath, o.Config.DRBackupPath, o.Config.AgeRecipient); err != nil { return fmt.Errorf("encrypting DR backup: %w", err) } diff --git a/internal/installer/vault/internal/filebackend/file.go b/internal/installer/vault/internal/filebackend/file.go new file mode 100644 index 000000000..85c7caabc --- /dev/null +++ b/internal/installer/vault/internal/filebackend/file.go @@ -0,0 +1,130 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package filebackend contains implementation details shared by file-backed vaults. +package filebackend + +import ( + "fmt" + "path/filepath" + + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/util" + "go.yaml.in/yaml/v3" +) + +// Options contains configuration shared by file-backed vault implementations. +type Options struct { + Path string + WithComments bool + FileIO util.FileIO +} + +// WithDefaults fills optional file backend dependencies. +func WithDefaults(opts Options) Options { + if opts.FileIO == nil { + opts.FileIO = util.NewFilesystemWriter() + } + + return opts +} + +// Marshal serializes install vault data for storage. +func Marshal(data *files.InstallVault, comments bool) ([]byte, error) { + if data == nil { + data = &files.InstallVault{} + } + + plain, err := data.Marshal() + if err != nil { + return nil, fmt.Errorf("failed to marshal vault: %w", err) + } + + if comments { + plain = append([]byte("# Codesphere Installer Secrets\n# Generated by OMS CLI\n\n"), plain...) + } + + return plain, nil +} + +// Write atomically writes vault data to path. +func Write(fileIO util.FileIO, path string, data []byte) error { + if err := fileIO.MkdirAll(filepath.Dir(path), 0700); err != nil { + return fmt.Errorf("failed to create vault directory: %w", err) + } + + tmpPath, err := fileIO.CreateTemp(filepath.Dir(path), ".vault-*") + if err != nil { + return fmt.Errorf("failed to create temporary vault: %w", err) + } + defer func() { _ = fileIO.Remove(tmpPath) }() + + if err := fileIO.WriteFile(tmpPath, data, 0600); err != nil { + return fmt.Errorf("failed to write vault: %w", err) + } + + if err := fileIO.Rename(tmpPath, path); err != nil { + return fmt.Errorf("failed to replace vault: %w", err) + } + + return nil +} + +// IsSOPSEncryptedYAML reports whether a YAML document contains SOPS metadata. +func IsSOPSEncryptedYAML(data []byte) (bool, error) { + var doc yaml.Node + if err := yaml.Unmarshal(data, &doc); err != nil { + return false, fmt.Errorf("failed to inspect YAML for SOPS metadata: %w", err) + } + + if len(doc.Content) == 0 { + return false, nil + } + + root := doc.Content[0] + if root.Kind != yaml.MappingNode { + return false, nil + } + + for i := 0; i+1 < len(root.Content); i += 2 { + if root.Content[i].Value == "sops" && root.Content[i+1].Kind == yaml.MappingNode { + return true, nil + } + } + + return false, nil +} + +// Parse unmarshals vault YAML, including SOPS whole-file wrapper output. +func Parse(data []byte) (*files.InstallVault, error) { + data = unwrapSOPSData(data) + + vault := &files.InstallVault{} + if err := vault.Unmarshal(data); err != nil { + return nil, fmt.Errorf("failed to unmarshal vault data: %w", err) + } + + return vault, nil +} + +// unwrapSOPSData strips a top-level data literal-block wrapper when present. +func unwrapSOPSData(data []byte) []byte { + var doc yaml.Node + if err := yaml.Unmarshal(data, &doc); err != nil || len(doc.Content) == 0 { + return data + } + + root := doc.Content[0] + if root.Kind != yaml.MappingNode || len(root.Content) != 2 { + return data + } + + keyNode := root.Content[0] + + valueNode := root.Content[1] + if keyNode.Value != "data" || valueNode.Kind != yaml.ScalarNode { + return data + } + + return []byte(valueNode.Value) +} diff --git a/internal/installer/vault/internal/filebackend/file_test.go b/internal/installer/vault/internal/filebackend/file_test.go new file mode 100644 index 000000000..2aa2ee81d --- /dev/null +++ b/internal/installer/vault/internal/filebackend/file_test.go @@ -0,0 +1,35 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package filebackend + +import "testing" + +func TestParseUnwrapsSOPSWholeFileData(t *testing.T) { + data, err := Parse([]byte("data: |\n secrets:\n - name: foo\n fields:\n password: bar\n")) + if err != nil { + t.Fatalf("Parse() error = %v", err) + } + + if len(data.Secrets) != 1 || data.Secrets[0].Name != "foo" || data.Secrets[0].Fields.Password != "bar" { + t.Fatalf("Parse() = %#v", data) + } +} + +func TestUnwrapSOPSDataLeavesOtherDocumentsUnchanged(t *testing.T) { + tests := map[string]string{ + "plain vault": "secrets:\n - name: foo\n", + "empty document": "", + "multiple root keys": "data: some-value\nsops:\n key: val\n", + "invalid YAML": "not: valid: yaml: [[", + "non-scalar data": "data:\n nested: value\n", + } + + for name, input := range tests { + t.Run(name, func(t *testing.T) { + if got := string(unwrapSOPSData([]byte(input))); got != input { + t.Fatalf("unwrapSOPSData() = %q, want %q", got, input) + } + }) + } +} diff --git a/internal/installer/vault/mocks.go b/internal/installer/vault/mocks.go deleted file mode 100644 index 75bd5c16d..000000000 --- a/internal/installer/vault/mocks.go +++ /dev/null @@ -1,198 +0,0 @@ -// Code generated by mockery; DO NOT EDIT. -// github.com/vektra/mockery -// template: testify - -package vault - -import ( - mock "github.com/stretchr/testify/mock" -) - -// NewMockEncryptor creates a new instance of MockEncryptor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockEncryptor(t interface { - mock.TestingT - Cleanup(func()) -}) *MockEncryptor { - mock := &MockEncryptor{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} - -// MockEncryptor is an autogenerated mock type for the Encryptor type -type MockEncryptor struct { - mock.Mock -} - -type MockEncryptor_Expecter struct { - mock *mock.Mock -} - -func (_m *MockEncryptor) EXPECT() *MockEncryptor_Expecter { - return &MockEncryptor_Expecter{mock: &_m.Mock} -} - -// Encrypt provides a mock function for the type MockEncryptor -func (_mock *MockEncryptor) Encrypt(src string, target string, recipient string) error { - ret := _mock.Called(src, target, recipient) - - if len(ret) == 0 { - panic("no return value specified for Encrypt") - } - - var r0 error - if returnFunc, ok := ret.Get(0).(func(string, string, string) error); ok { - r0 = returnFunc(src, target, recipient) - } else { - r0 = ret.Error(0) - } - return r0 -} - -// MockEncryptor_Encrypt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Encrypt' -type MockEncryptor_Encrypt_Call struct { - *mock.Call -} - -// Encrypt is a helper method to define mock.On call -// - src string -// - target string -// - recipient string -func (_e *MockEncryptor_Expecter) Encrypt(src any, target any, recipient any) *MockEncryptor_Encrypt_Call { - return &MockEncryptor_Encrypt_Call{Call: _e.mock.On("Encrypt", src, target, recipient)} -} - -func (_c *MockEncryptor_Encrypt_Call) Run(run func(src string, target string, recipient string)) *MockEncryptor_Encrypt_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 string - if args[0] != nil { - arg0 = args[0].(string) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - var arg2 string - if args[2] != nil { - arg2 = args[2].(string) - } - run( - arg0, - arg1, - arg2, - ) - }) - return _c -} - -func (_c *MockEncryptor_Encrypt_Call) Return(err error) *MockEncryptor_Encrypt_Call { - _c.Call.Return(err) - return _c -} - -func (_c *MockEncryptor_Encrypt_Call) RunAndReturn(run func(src string, target string, recipient string) error) *MockEncryptor_Encrypt_Call { - _c.Call.Return(run) - return _c -} - -// NewMockAgeKeyResolver creates a new instance of MockAgeKeyResolver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockAgeKeyResolver(t interface { - mock.TestingT - Cleanup(func()) -}) *MockAgeKeyResolver { - mock := &MockAgeKeyResolver{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} - -// MockAgeKeyResolver is an autogenerated mock type for the AgeKeyResolver type -type MockAgeKeyResolver struct { - mock.Mock -} - -type MockAgeKeyResolver_Expecter struct { - mock *mock.Mock -} - -func (_m *MockAgeKeyResolver) EXPECT() *MockAgeKeyResolver_Expecter { - return &MockAgeKeyResolver_Expecter{mock: &_m.Mock} -} - -// Resolve provides a mock function for the type MockAgeKeyResolver -func (_mock *MockAgeKeyResolver) Resolve(explicitKeyFile string, fallbackDir string) (string, string, error) { - ret := _mock.Called(explicitKeyFile, fallbackDir) - - if len(ret) == 0 { - panic("no return value specified for Resolve") - } - - var r0 string - var r1 string - var r2 error - if returnFunc, ok := ret.Get(0).(func(string, string) (string, string, error)); ok { - return returnFunc(explicitKeyFile, fallbackDir) - } - if returnFunc, ok := ret.Get(0).(func(string, string) string); ok { - r0 = returnFunc(explicitKeyFile, fallbackDir) - } else { - r0 = ret.Get(0).(string) - } - if returnFunc, ok := ret.Get(1).(func(string, string) string); ok { - r1 = returnFunc(explicitKeyFile, fallbackDir) - } else { - r1 = ret.Get(1).(string) - } - if returnFunc, ok := ret.Get(2).(func(string, string) error); ok { - r2 = returnFunc(explicitKeyFile, fallbackDir) - } else { - r2 = ret.Error(2) - } - return r0, r1, r2 -} - -// MockAgeKeyResolver_Resolve_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Resolve' -type MockAgeKeyResolver_Resolve_Call struct { - *mock.Call -} - -// Resolve is a helper method to define mock.On call -// - explicitKeyFile string -// - fallbackDir string -func (_e *MockAgeKeyResolver_Expecter) Resolve(explicitKeyFile any, fallbackDir any) *MockAgeKeyResolver_Resolve_Call { - return &MockAgeKeyResolver_Resolve_Call{Call: _e.mock.On("Resolve", explicitKeyFile, fallbackDir)} -} - -func (_c *MockAgeKeyResolver_Resolve_Call) Run(run func(explicitKeyFile string, fallbackDir string)) *MockAgeKeyResolver_Resolve_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 string - if args[0] != nil { - arg0 = args[0].(string) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - run( - arg0, - arg1, - ) - }) - return _c -} - -func (_c *MockAgeKeyResolver_Resolve_Call) Return(recipient string, keyPath string, err error) *MockAgeKeyResolver_Resolve_Call { - _c.Call.Return(recipient, keyPath, err) - return _c -} - -func (_c *MockAgeKeyResolver_Resolve_Call) RunAndReturn(run func(explicitKeyFile string, fallbackDir string) (string, string, error)) *MockAgeKeyResolver_Resolve_Call { - _c.Call.Return(run) - return _c -} diff --git a/internal/installer/vault/plain/plain.go b/internal/installer/vault/plain/plain.go new file mode 100644 index 000000000..e71f7816e --- /dev/null +++ b/internal/installer/vault/plain/plain.go @@ -0,0 +1,87 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package plain implements an unencrypted file-backed vault. +package plain + +import ( + "errors" + "fmt" + "io/fs" + "strings" + + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/installer/vault/internal/filebackend" + "github.com/codesphere-cloud/oms/internal/util" +) + +// Options configures a plain file-backed vault. +type Options struct { + Path string + WithComments bool + FileIO util.FileIO +} + +// PlainVault stores vault YAML as an unencrypted file. +// +//revive:disable-next-line:exported // The backend-specific name is intentional. +type PlainVault struct{ options filebackend.Options } + +// New creates a plain file-backed vault. +func New(opts Options) (*PlainVault, error) { + if strings.TrimSpace(opts.Path) == "" { + return nil, fmt.Errorf("plain vault requires a file path") + } + + fileOpts := filebackend.WithDefaults(filebackend.Options(opts)) + + return &PlainVault{options: fileOpts}, nil +} + +// Load reads the unencrypted vault file and verifies it is not SOPS-encrypted. +func (v *PlainVault) Load() (*files.InstallVault, error) { + data, err := v.options.FileIO.ReadFile(v.options.Path) + if err != nil { + return nil, fmt.Errorf("failed to read vault file %s: %w", v.options.Path, err) + } + + encrypted, err := filebackend.IsSOPSEncryptedYAML(data) + if err != nil { + return nil, fmt.Errorf("failed to inspect vault file %s: %w", v.options.Path, err) + } + + if encrypted { + return nil, fmt.Errorf("vault file %s is SOPS-encrypted, but vault type is %q", v.options.Path, "plain") + } + + result, err := filebackend.Parse(data) + if err != nil { + return nil, fmt.Errorf("failed to parse vault file %s: %w", v.options.Path, err) + } + + return result, nil +} + +// LoadOrCreate loads the vault or returns an empty vault if the file does not exist. +func (v *PlainVault) LoadOrCreate() (*files.InstallVault, error) { + result, err := v.Load() + if errors.Is(err, fs.ErrNotExist) { + return &files.InstallVault{}, nil + } + + return result, err +} + +// Save writes vault data to an unencrypted file. +func (v *PlainVault) Save(data *files.InstallVault) error { + plain, err := filebackend.Marshal(data, v.options.WithComments) + if err != nil { + return fmt.Errorf("failed to marshal plain vault: %w", err) + } + + if err := filebackend.Write(v.options.FileIO, v.options.Path, plain); err != nil { + return fmt.Errorf("failed to write plain vault: %w", err) + } + + return nil +} diff --git a/internal/installer/vault/sops/encryption.go b/internal/installer/vault/sops/encryption.go new file mode 100644 index 000000000..6cd2d025e --- /dev/null +++ b/internal/installer/vault/sops/encryption.go @@ -0,0 +1,185 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package sops + +import ( + "errors" + "fmt" + "io" + "io/fs" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + + "filippo.io/age" + "github.com/codesphere-cloud/oms/internal/util" + sopsage "github.com/getsops/sops/v3/age" +) + +var xdgConfigHome = "XDG_CONFIG_HOME" + +// ResolveAgeKey resolves an existing age key or generates one in fallbackDir. +func ResolveAgeKey(explicitKeyFile, fallbackDir string) (recipient string, keyPath string, err error) { + return resolveAgeKey(util.NewFilesystemWriter(), explicitKeyFile, fallbackDir) +} + +func resolveAgeKey(fileIO util.FileIO, explicitKeyFile, fallbackDir string) (recipient string, keyPath string, err error) { + if explicitKeyFile != "" { + recipient, err = readRecipientFromFile(fileIO, explicitKeyFile) + if err != nil { + return "", "", fmt.Errorf("failed to read age key from %s: %w", explicitKeyFile, err) + } + + return recipient, explicitKeyFile, nil + } + + if raw := os.Getenv(sopsage.SopsAgeKeyEnv); raw != "" { + recipient, err = parseAgeRecipient(strings.NewReader(raw)) + if err != nil { + return "", "", fmt.Errorf("failed to parse age key from SOPS_AGE_KEY environment variable: %w", err) + } + + return recipient, "", nil + } + + if keyFile := os.Getenv(sopsage.SopsAgeKeyFileEnv); keyFile != "" { + recipient, err = readRecipientFromFile(fileIO, keyFile) + if err != nil { + return "", "", fmt.Errorf("failed to read age key from %s: %w", keyFile, err) + } + + return recipient, keyFile, nil + } + + defaultPath, configErr := getUserConfigDir() + if configErr == nil { + defaultPath = filepath.Join(defaultPath, sopsage.SopsAgeKeyUserConfigPath) + + recipient, err = readRecipientFromFile(fileIO, defaultPath) + if err == nil { + return recipient, defaultPath, nil + } + + if !errors.Is(err, fs.ErrNotExist) { + return "", "", fmt.Errorf("failed to read age key from default location %s: %w", defaultPath, err) + } + } + + keyPath = filepath.Join(fallbackDir, "age_key.txt") + + recipient, err = readRecipientFromFile(fileIO, keyPath) + if err != nil { + if !errors.Is(err, fs.ErrNotExist) { + return "", "", fmt.Errorf("failed to read age key from fallback location %s: %w", keyPath, err) + } + + recipient, err = generateAgeKey(fileIO, keyPath) + if err != nil { + return "", "", fmt.Errorf("failed to generate age key: %w", err) + } + } + + return recipient, keyPath, nil +} + +func parseAgeRecipient(reader io.Reader) (string, error) { + ids, err := age.ParseIdentities(reader) + if err != nil { + return "", fmt.Errorf("failed to parse age identities from file: %w", err) + } + + if len(ids) == 0 { + return "", fmt.Errorf("no age identities found in file") + } + + if len(ids) > 1 { + return "", fmt.Errorf("multiple age identities found in file, expected only one") + } + + switch id := ids[0].(type) { + case *age.X25519Identity: + return id.Recipient().String(), nil + case *age.HybridIdentity: + return id.Recipient().String(), nil + default: + return "", fmt.Errorf("internal error: unexpected identity type: %T", id) + } +} + +func readRecipientFromFile(fileIO util.FileIO, path string) (string, error) { + data, err := fileIO.ReadFile(path) + if err != nil { + return "", fmt.Errorf("failed to read age key file %s: %w", path, err) + } + + return parseAgeRecipient(strings.NewReader(string(data))) +} + +func getUserConfigDir() (string, error) { + if runtime.GOOS == "darwin" { + if userConfigDir, ok := os.LookupEnv(xdgConfigHome); ok && userConfigDir != "" { + return userConfigDir, nil + } + } + + configDir, err := os.UserConfigDir() + if err != nil { + return "", fmt.Errorf("failed to resolve user config directory: %w", err) + } + + return configDir, nil +} + +func generateAgeKey(fileIO util.FileIO, keyPath string) (string, error) { + if err := fileIO.MkdirAll(filepath.Dir(keyPath), 0700); err != nil { + return "", fmt.Errorf("failed to create directory for age key: %w", err) + } + + cmd := exec.Command("age-keygen", "-o", keyPath) + + out, err := cmd.CombinedOutput() + if err != nil { + return "", fmt.Errorf("age-keygen failed: %w: %s", err, out) + } + + recipient, err := readRecipientFromFile(fileIO, keyPath) + if err != nil { + return "", fmt.Errorf("failed to read generated age key: %w", err) + } + + return recipient, nil +} + +// EncryptFile encrypts src with SOPS and age and writes ciphertext to target. +func EncryptFile(src, target, recipient string) error { + cmd := exec.Command("sops", "--encrypt", "--input-type", "yaml", "--age", recipient, "--output", target, src) + + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("sops encrypt failed: %w: %s", err, out) + } + + return nil +} + +// DecryptFile decrypts a SOPS-encrypted file and returns its plaintext. +func DecryptFile(src, keyPath string) ([]byte, error) { + cmd := exec.Command("sops", "--decrypt", "--input-type", "yaml", src) + if keyPath != "" { + cmd.Env = append(os.Environ(), "SOPS_AGE_KEY_FILE="+keyPath) + } + + out, err := cmd.Output() + if err != nil { + if exitErr, ok := err.(*exec.ExitError); ok { + return nil, fmt.Errorf("sops decrypt failed: %s", string(exitErr.Stderr)) + } + + return nil, fmt.Errorf("sops decrypt failed: %w", err) + } + + return out, nil +} diff --git a/internal/installer/vault/sops/sops.go b/internal/installer/vault/sops/sops.go new file mode 100644 index 000000000..88f903923 --- /dev/null +++ b/internal/installer/vault/sops/sops.go @@ -0,0 +1,212 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package sops implements a SOPS-encrypted, age-backed vault. +package sops + +import ( + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/installer/vault/internal/filebackend" + "github.com/codesphere-cloud/oms/internal/util" + sopsage "github.com/getsops/sops/v3/age" +) + +// Options configures a SOPS-encrypted file-backed vault. +type Options struct { + Path string + AgeKey string + WithComments bool + FileIO util.FileIO +} + +// SopsVault stores vault YAML encrypted with SOPS and age. +// +//revive:disable-next-line:exported // The backend-specific name is intentional. +type SopsVault struct { + fileOptions filebackend.Options + ageKey string +} + +// New creates a SOPS-encrypted file-backed vault. +func New(opts Options) (*SopsVault, error) { + if strings.TrimSpace(opts.Path) == "" { + return nil, fmt.Errorf("SOPS vault requires a file path") + } + + if err := ValidateConfiguration(opts.AgeKey); err != nil { + return nil, err + } + + fileOpts := filebackend.WithDefaults(filebackend.Options{ + Path: opts.Path, WithComments: opts.WithComments, FileIO: opts.FileIO, + }) + + return &SopsVault{fileOptions: fileOpts, ageKey: opts.AgeKey}, nil +} + +// NewLazy creates a vault whose path and key configuration are validated on first use. +func NewLazy(opts Options) *SopsVault { + fileOpts := filebackend.WithDefaults(filebackend.Options{ + Path: opts.Path, WithComments: opts.WithComments, FileIO: opts.FileIO, + }) + + return &SopsVault{fileOptions: fileOpts, ageKey: opts.AgeKey} +} + +// Load reads, validates, decrypts, and parses the configured vault file. +func (v *SopsVault) Load() (*files.InstallVault, error) { + keyPath, err := v.getAgeKey() + if err != nil { + return nil, err + } + + data, err := v.fileOptions.FileIO.ReadFile(v.fileOptions.Path) + if err != nil { + return nil, fmt.Errorf("failed to read vault file %s: %w", v.fileOptions.Path, err) + } + + encrypted, err := filebackend.IsSOPSEncryptedYAML(data) + if err != nil { + return nil, fmt.Errorf("failed to inspect vault file %s: %w", v.fileOptions.Path, err) + } + + if !encrypted { + return nil, fmt.Errorf("vault file %s is not SOPS-encrypted", v.fileOptions.Path) + } + + plain, err := DecryptFile(v.fileOptions.Path, keyPath) + if err != nil { + return nil, fmt.Errorf("failed to decrypt vault file %s: %w", v.fileOptions.Path, err) + } + + result, err := filebackend.Parse(plain) + if err != nil { + return nil, fmt.Errorf("failed to parse decrypted vault file %s: %w", v.fileOptions.Path, err) + } + + return result, nil +} + +// LoadOrCreate loads the vault or returns an empty vault if the file does not exist. +func (v *SopsVault) LoadOrCreate() (*files.InstallVault, error) { + result, err := v.Load() + if errors.Is(err, fs.ErrNotExist) { + return &files.InstallVault{}, nil + } + + return result, err +} + +// Save encrypts and writes vault data to the configured path. +func (v *SopsVault) Save(data *files.InstallVault) error { + if _, err := v.getAgeKey(); err != nil { + return err + } + + recipient, _, err := resolveConfiguredAgeKey(v.fileOptions.FileIO, v.ageKey) + if err != nil { + return err + } + + plain, err := filebackend.Marshal(data, v.fileOptions.WithComments) + if err != nil { + return fmt.Errorf("failed to marshal SOPS vault: %w", err) + } + + if err := v.fileOptions.FileIO.MkdirAll(filepath.Dir(v.fileOptions.Path), 0700); err != nil { + return fmt.Errorf("failed to create vault directory: %w", err) + } + + plainPath, err := v.fileOptions.FileIO.CreateTemp(filepath.Dir(v.fileOptions.Path), ".vault-plaintext-*") + if err != nil { + return fmt.Errorf("failed to create temporary plaintext vault: %w", err) + } + defer func() { _ = v.fileOptions.FileIO.Remove(plainPath) }() + + if err := v.fileOptions.FileIO.WriteFile(plainPath, plain, 0600); err != nil { + return fmt.Errorf("failed to write temporary plaintext vault: %w", err) + } + + encryptedPath, err := v.fileOptions.FileIO.CreateTemp(filepath.Dir(v.fileOptions.Path), ".vault-encrypted-*") + if err != nil { + return fmt.Errorf("failed to create temporary encrypted vault: %w", err) + } + defer func() { _ = v.fileOptions.FileIO.Remove(encryptedPath) }() + + if err := EncryptFile(plainPath, encryptedPath, recipient); err != nil { + return err + } + + if err := v.fileOptions.FileIO.Chmod(encryptedPath, 0600); err != nil { + return fmt.Errorf("failed to set encrypted vault permissions: %w", err) + } + + if err := v.fileOptions.FileIO.Rename(encryptedPath, v.fileOptions.Path); err != nil { + return fmt.Errorf("failed to replace encrypted vault: %w", err) + } + + return nil +} + +func (v *SopsVault) getAgeKey() (string, error) { + if v.ageKey != "" { + return v.ageKey, nil + } + + if os.Getenv(sopsage.SopsAgeKeyEnv) != "" { + return "", nil + } + + if keyFile := os.Getenv(sopsage.SopsAgeKeyFileEnv); keyFile != "" { + return keyFile, nil + } + + return "", ValidateConfiguration("") +} + +// ValidateConfiguration ensures an age key is available for SOPS operations. +func ValidateConfiguration(ageKey string) error { + if ageKey != "" || os.Getenv(sopsage.SopsAgeKeyEnv) != "" || os.Getenv(sopsage.SopsAgeKeyFileEnv) != "" { + return nil + } + + return fmt.Errorf("SOPS vault requires an age key; set an age key argument or %s/%s", sopsage.SopsAgeKeyEnv, sopsage.SopsAgeKeyFileEnv) +} + +func resolveConfiguredAgeKey(fileIO util.FileIO, explicit string) (recipient, keyPath string, err error) { + if explicit != "" { + recipient, err := readRecipientFromFile(fileIO, explicit) + if err != nil { + return "", "", fmt.Errorf("failed to read age key from %s: %w", explicit, err) + } + + return recipient, explicit, nil + } + + if raw := os.Getenv(sopsage.SopsAgeKeyEnv); raw != "" { + recipient, err := parseAgeRecipient(strings.NewReader(raw)) + if err != nil { + return "", "", fmt.Errorf("failed to parse age key from %s: %w", sopsage.SopsAgeKeyEnv, err) + } + + return recipient, "", nil + } + + if keyFile := os.Getenv(sopsage.SopsAgeKeyFileEnv); keyFile != "" { + recipient, err := readRecipientFromFile(fileIO, keyFile) + if err != nil { + return "", "", fmt.Errorf("failed to read age key from %s: %w", keyFile, err) + } + + return recipient, keyFile, nil + } + + return "", "", fmt.Errorf("SOPS vault requires an age key") +} diff --git a/internal/installer/vault/vault.go b/internal/installer/vault/vault.go new file mode 100644 index 000000000..e9163a26b --- /dev/null +++ b/internal/installer/vault/vault.go @@ -0,0 +1,106 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package vault defines the installer vault interface and backend factory. +package vault + +import ( + "fmt" + "strings" + + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/installer/vault/plain" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" + "github.com/codesphere-cloud/oms/internal/util" +) + +// Type identifies the on-disk vault format. +type Type string + +// Supported Vault types +const ( + TypeSOPS Type = "sops" + TypePlain Type = "plain" + DefaultType = TypeSOPS +) + +// Vault is the persistence boundary for installer secrets. Callers work with +// InstallVault values and do not need to know how those values are represented +// or protected on disk. +type Vault interface { + Load() (*files.InstallVault, error) + LoadOrCreate() (*files.InstallVault, error) + Save(*files.InstallVault) error +} + +// Options contains the parameters currently accepted by the vault factory. +// The factory only forwards file parameters to implementations that use them; +// future non-file vaults can ignore Path and WithComments entirely. +type Options struct { + Path string + AgeKey string + WithComments bool + FileIO util.FileIO +} + +// ParseType validates a user supplied vault type. +func ParseType(value string) (Type, error) { + switch Type(strings.ToLower(strings.TrimSpace(value))) { + case "", TypeSOPS: + return TypeSOPS, nil + case TypePlain: + return TypePlain, nil + default: + return "", fmt.Errorf("unsupported vault type %q (must be %q or %q)", value, TypeSOPS, TypePlain) + } +} + +// ValidateConfiguration validates backend-specific, non-resource parameters. +// File paths are intentionally validated by the file-backed constructors. +func ValidateConfiguration(vaultType Type, ageKey string) error { + if vaultType != TypeSOPS { + return nil + } + + if err := sops.ValidateConfiguration(ageKey); err != nil { + return fmt.Errorf("failed to validate SOPS vault configuration: %w", err) + } + + return nil +} + +// New creates a vault implementation for the requested type. +func New(vaultType Type, opts Options) (Vault, error) { + switch vaultType { + case TypeSOPS: + backend, err := sops.New(sops.Options{ + Path: opts.Path, AgeKey: opts.AgeKey, WithComments: opts.WithComments, FileIO: opts.FileIO, + }) + if err != nil { + return nil, fmt.Errorf("failed to create SOPS vault: %w", err) + } + + return backend, nil + case TypePlain: + backend, err := plain.New(plain.Options{ + Path: opts.Path, WithComments: opts.WithComments, FileIO: opts.FileIO, + }) + if err != nil { + return nil, fmt.Errorf("failed to create plain vault: %w", err) + } + + return backend, nil + default: + return nil, fmt.Errorf("unsupported vault type %q", vaultType) + } +} + +// NewFromString parses vaultType and creates the matching implementation. +func NewFromString(vaultType string, opts Options) (Vault, error) { + t, err := ParseType(vaultType) + if err != nil { + return nil, err + } + + return New(t, opts) +} diff --git a/internal/installer/vault/vault_encryption.go b/internal/installer/vault/vault_encryption.go deleted file mode 100644 index b82be612d..000000000 --- a/internal/installer/vault/vault_encryption.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) Codesphere Inc. -// SPDX-License-Identifier: Apache-2.0 - -package vault - -import ( - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "filippo.io/age" - sopsage "github.com/getsops/sops/v3/age" - "go.yaml.in/yaml/v3" -) - -var xdgConfigHome = "XDG_CONFIG_HOME" - -// Encryptor encrypts a plaintext vault for an age recipient. -// -//mockery:generate: true -type Encryptor interface { - Encrypt(src, target, recipient string) error -} - -// AgeKeyResolver finds the age recipient used to encrypt a vault. -// -//mockery:generate: true -type AgeKeyResolver interface { - Resolve(explicitKeyFile, fallbackDir string) (recipient, keyPath string, err error) -} - -// SOPSEncryptor encrypts vaults using SOPS and age. -type SOPSEncryptor struct{} - -func (SOPSEncryptor) Encrypt(src, target, recipient string) error { - return EncryptFileWithSOPS(src, target, recipient) -} - -// DefaultAgeKeyResolver resolves age keys from the standard SOPS locations. -type DefaultAgeKeyResolver struct{} - -func (DefaultAgeKeyResolver) Resolve(explicitKeyFile, fallbackDir string) (recipient, keyPath string, err error) { - return ResolveAgeKey(explicitKeyFile, fallbackDir) -} - -// ResolveAgeKey resolves an existing age key or generates a new one. -// -// When explicitKeyFile is non-empty it takes priority over everything else: the -// recipient is read directly from that file and it is returned as the key path. -// This lets callers thread an explicit --age-key-file through without mutating -// the process environment. -// -// Otherwise it checks (in order): -// 1. SOPS_AGE_KEY environment variable (raw key content) -// 2. SOPS_AGE_KEY_FILE environment variable (path to key file) -// 3. Default location: ~/.config/sops/age/keys.txt -// 4. Generate a new key and write it to /age_key.txt -// -// Returns the age public key (recipient) and the path to the key file (empty when -// the key was supplied via SOPS_AGE_KEY). -func ResolveAgeKey(explicitKeyFile, fallbackDir string) (recipient string, keyPath string, err error) { - // 0. Explicit key file – supplied by the caller, takes priority. - if explicitKeyFile != "" { - recipient, err = readRecipientFromFile(explicitKeyFile) - if err != nil { - return "", "", fmt.Errorf("failed to read age key from %s: %w", explicitKeyFile, err) - } - return recipient, explicitKeyFile, nil - } - - // 1. SOPS_AGE_KEY env var – contains raw key content. - if raw := os.Getenv(sopsage.SopsAgeKeyEnv); raw != "" { - recipient, err = parseAgeRecipient(strings.NewReader(raw)) - if err != nil { - return "", "", fmt.Errorf("failed to parse age key from SOPS_AGE_KEY environment variable: %w", err) - } - return recipient, "", nil - } - - // 2. SOPS_AGE_KEY_FILE env var. - if keyFile := os.Getenv(sopsage.SopsAgeKeyFileEnv); keyFile != "" { - recipient, err = readRecipientFromFile(keyFile) - if err != nil { - return "", "", fmt.Errorf("failed to read age key from %s: %w", keyFile, err) - } - return recipient, keyFile, nil - } - - // 3. Default location: ~/.config/sops/age/keys.txt. - defaultPath, configErr := getUserConfigDir() - if configErr == nil { - defaultPath = filepath.Join(defaultPath, sopsage.SopsAgeKeyUserConfigPath) - recipient, err = readRecipientFromFile(defaultPath) - if err == nil { - return recipient, defaultPath, nil - } - if !os.IsNotExist(err) { - return "", "", fmt.Errorf("failed to read age key from default location %s: %w", defaultPath, err) - } - } - - // 4. Generate a new key. - keyPath = filepath.Join(fallbackDir, "age_key.txt") - recipient, err = readRecipientFromFile(keyPath) - if err != nil { - if !os.IsNotExist(err) { - return "", "", fmt.Errorf("failed to read age key from fallback location %s: %w", keyPath, err) - } - recipient, err = generateAgeKey(keyPath) - if err != nil { - return "", "", fmt.Errorf("failed to generate age key: %w", err) - } - return recipient, keyPath, nil - } - return recipient, keyPath, nil -} - -// parseAgeRecipient extracts the public key from age key given by reader. -func parseAgeRecipient(reader io.Reader) (string, error) { - ids, err := age.ParseIdentities(reader) - if err != nil { - return "", fmt.Errorf("failed to parse age identities from file: %w", err) - } - if len(ids) == 0 { - return "", fmt.Errorf("no age identities found in file") - } - if len(ids) > 1 { - return "", fmt.Errorf("multiple age identities found in file, expected only one") - } - id := ids[0] - switch id := id.(type) { - case *age.X25519Identity: - return id.Recipient().String(), nil - case *age.HybridIdentity: - return id.Recipient().String(), nil - default: - return "", fmt.Errorf("internal error: unexpected identity type: %T", id) - } -} - -// readRecipientFromFile reads an age key file and extracts the public key. -func readRecipientFromFile(path string) (recipient string, err error) { - file, err := os.Open(path) - if err != nil { - return "", err - } - defer func() { - err = file.Close() - }() - return parseAgeRecipient(file) -} - -func getUserConfigDir() (string, error) { - if runtime.GOOS == "darwin" { - if userConfigDir, ok := os.LookupEnv(xdgConfigHome); ok && userConfigDir != "" { - return userConfigDir, nil - } - } - return os.UserConfigDir() -} - -// generateAgeKey generates a new age keypair and writes it to the given path. -// Returns the public key (recipient). -func generateAgeKey(keyPath string) (string, error) { - if err := os.MkdirAll(filepath.Dir(keyPath), 0700); err != nil { - return "", fmt.Errorf("failed to create directory for age key: %w", err) - } - - cmd := exec.Command("age-keygen", "-o", keyPath) - out, err := cmd.CombinedOutput() - if err != nil { - return "", fmt.Errorf("age-keygen failed: %w: %s", err, out) - } - - recipient, err := readRecipientFromFile(keyPath) - if err != nil { - return "", fmt.Errorf("failed to read generated age key: %w", err) - } - return recipient, nil -} - -// EncryptFileWithSOPS encrypts src with SOPS+age and writes ciphertext to target. -func EncryptFileWithSOPS(src, target, recipient string) error { - cmd := exec.Command("sops", "--encrypt", "--input-type", "yaml", "--age", recipient, "--output", target, src) - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("sops encrypt failed: %w: %s", err, out) - } - return nil -} - -// DecryptFileWithSOPS decrypts a SOPS-encrypted file and returns the plaintext bytes. -// If keyPath is non-empty, SOPS_AGE_KEY_FILE is set for the sops process. -func DecryptFileWithSOPS(src, keyPath string) ([]byte, error) { - cmd := exec.Command("sops", "--decrypt", "--input-type", "yaml", src) - if keyPath != "" { - cmd.Env = append(os.Environ(), "SOPS_AGE_KEY_FILE="+keyPath) - } - - out, err := cmd.Output() - if err != nil { - if exitErr, ok := err.(*exec.ExitError); ok { - return nil, fmt.Errorf("sops decrypt failed: %s", string(exitErr.Stderr)) - } - return nil, fmt.Errorf("sops decrypt failed: %w", err) - } - - return out, nil -} - -// unwrapSOPSData strips a top-level "data" literal block scalar wrapper if -// present. When SOPS encrypts with --input-type yaml, it -// wraps the entire document under a data: | key. -func unwrapSOPSData(data []byte) []byte { - var doc yaml.Node - if err := yaml.Unmarshal(data, &doc); err != nil { - return data - } - if len(doc.Content) == 0 { - return data - } - root := doc.Content[0] - if root.Kind != yaml.MappingNode || len(root.Content) != 2 { - return data - } - keyNode := root.Content[0] - valNode := root.Content[1] - if keyNode.Value != "data" || valNode.Kind != yaml.ScalarNode { - return data - } - // The scalar value is the inner YAML content. - return []byte(valNode.Value) -} diff --git a/internal/installer/vault/vault_encryption_test.go b/internal/installer/vault/vault_encryption_test.go index 7045a68fe..b2145f9d9 100644 --- a/internal/installer/vault/vault_encryption_test.go +++ b/internal/installer/vault/vault_encryption_test.go @@ -12,6 +12,7 @@ import ( . "github.com/onsi/gomega" "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" ) func sopsAndAgeAvailable() bool { @@ -73,14 +74,14 @@ var _ = Describe("VaultEncryption", func() { // Set conflicting env vars to prove the explicit file takes priority. Expect(os.Setenv("SOPS_AGE_KEY_FILE", filepath.Join(tmpDir, "ignored.txt"))).To(Succeed()) - recipient, keyPath, err := vault.ResolveAgeKey(keyFile, tmpDir) + recipient, keyPath, err := sops.ResolveAgeKey(keyFile, tmpDir) Expect(err).ToNot(HaveOccurred()) Expect(recipient).To(HavePrefix("age1")) Expect(keyPath).To(Equal(keyFile)) }) It("returns an error if the explicit file does not exist", func() { - _, _, err := vault.ResolveAgeKey(filepath.Join(tmpDir, "missing.txt"), tmpDir) + _, _, err := sops.ResolveAgeKey(filepath.Join(tmpDir, "missing.txt"), tmpDir) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("failed to read age key")) }) @@ -111,7 +112,7 @@ var _ = Describe("VaultEncryption", func() { Expect(os.Setenv("SOPS_AGE_KEY", privKeyLine)).To(Succeed()) - recipient, keyPath, err := vault.ResolveAgeKey("", tmpDir) + recipient, keyPath, err := sops.ResolveAgeKey("", tmpDir) Expect(err).ToNot(HaveOccurred()) Expect(recipient).To(HavePrefix("age1")) Expect(keyPath).To(BeEmpty()) @@ -129,7 +130,7 @@ var _ = Describe("VaultEncryption", func() { Expect(os.Setenv("SOPS_AGE_KEY_FILE", keyFile)).To(Succeed()) - recipient, keyPath, err := vault.ResolveAgeKey("", tmpDir) + recipient, keyPath, err := sops.ResolveAgeKey("", tmpDir) Expect(err).ToNot(HaveOccurred()) Expect(recipient).To(HavePrefix("age1")) Expect(keyPath).To(Equal(keyFile)) @@ -138,7 +139,7 @@ var _ = Describe("VaultEncryption", func() { It("should return error if the file does not exist", func() { Expect(os.Setenv("SOPS_AGE_KEY_FILE", filepath.Join(tmpDir, "nonexistent.txt"))).To(Succeed()) - _, _, err := vault.ResolveAgeKey("", tmpDir) + _, _, err := sops.ResolveAgeKey("", tmpDir) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("failed to read age key")) }) @@ -150,7 +151,7 @@ var _ = Describe("VaultEncryption", func() { Skip("age-keygen not available") } - recipient, keyPath, err := vault.ResolveAgeKey("", tmpDir) + recipient, keyPath, err := sops.ResolveAgeKey("", tmpDir) Expect(err).ToNot(HaveOccurred()) Expect(recipient).To(HavePrefix("age1")) Expect(keyPath).To(Equal(filepath.Join(tmpDir, "age_key.txt"))) @@ -161,54 +162,7 @@ var _ = Describe("VaultEncryption", func() { }) }) - Describe("IsSOPSEncryptedFile", func() { - var tmpDir string - - BeforeEach(func() { - var err error - tmpDir, err = os.MkdirTemp("", "sops-detect-test-*") - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - Expect(os.RemoveAll(tmpDir)).To(Succeed()) - }) - - It("returns false for a file without sops metadata", func() { - path := filepath.Join(tmpDir, "plain.yaml") - Expect(os.WriteFile(path, []byte("key: value\n"), 0644)).To(Succeed()) - - encrypted, err := vault.IsSOPSEncryptedFile(path) - Expect(err).ToNot(HaveOccurred()) - Expect(encrypted).To(BeFalse()) - }) - - It("returns true for a file with sops top-level key", func() { - path := filepath.Join(tmpDir, "sops.yaml") - Expect(os.WriteFile(path, []byte("sops:\n age: age1abc\n"), 0644)).To(Succeed()) - - encrypted, err := vault.IsSOPSEncryptedFile(path) - Expect(err).ToNot(HaveOccurred()) - Expect(encrypted).To(BeTrue()) - }) - - It("returns false for an empty file", func() { - path := filepath.Join(tmpDir, "empty.yaml") - Expect(os.WriteFile(path, []byte{}, 0644)).To(Succeed()) - - encrypted, err := vault.IsSOPSEncryptedFile(path) - Expect(err).ToNot(HaveOccurred()) - Expect(encrypted).To(BeFalse()) - }) - - It("returns an error for a non-existent file", func() { - path := filepath.Join(tmpDir, "missing.yaml") - _, err := vault.IsSOPSEncryptedFile(path) - Expect(err).To(HaveOccurred()) - }) - }) - - Describe("LoadVaultData", func() { + Describe("file-backed vault loading", func() { var tmpDir string BeforeEach(func() { @@ -226,11 +180,13 @@ var _ = Describe("VaultEncryption", func() { plainYAML := "secrets:\n - name: test-secret\n fields:\n password: hunter2\n" Expect(os.WriteFile(vaultPath, []byte(plainYAML), 0644)).To(Succeed()) - vault, err := vault.LoadUnencryptedVaultData(vaultPath) + backend, err := vault.New(vault.TypePlain, vault.Options{Path: vaultPath}) Expect(err).ToNot(HaveOccurred()) - Expect(vault.Secrets).To(HaveLen(1)) - Expect(vault.Secrets[0].Name).To(Equal("test-secret")) - Expect(vault.Secrets[0].Fields.Password).To(Equal("hunter2")) + loaded, err := backend.Load() + Expect(err).ToNot(HaveOccurred()) + Expect(loaded.Secrets).To(HaveLen(1)) + Expect(loaded.Secrets[0].Name).To(Equal("test-secret")) + Expect(loaded.Secrets[0].Fields.Password).To(Equal("hunter2")) }) It("unwraps a plain file with data: | wrapper (SOPS whole-file format edge case)", func() { @@ -238,11 +194,13 @@ var _ = Describe("VaultEncryption", func() { wrappedYAML := "data: |\n secrets:\n - name: test-secret\n fields:\n password: hunter2\n" Expect(os.WriteFile(vaultPath, []byte(wrappedYAML), 0644)).To(Succeed()) - vault, err := vault.LoadUnencryptedVaultData(vaultPath) + backend, err := vault.New(vault.TypePlain, vault.Options{Path: vaultPath}) + Expect(err).ToNot(HaveOccurred()) + loaded, err := backend.Load() Expect(err).ToNot(HaveOccurred()) - Expect(vault.Secrets).To(HaveLen(1)) - Expect(vault.Secrets[0].Name).To(Equal("test-secret")) - Expect(vault.Secrets[0].Fields.Password).To(Equal("hunter2")) + Expect(loaded.Secrets).To(HaveLen(1)) + Expect(loaded.Secrets[0].Name).To(Equal("test-secret")) + Expect(loaded.Secrets[0].Fields.Password).To(Equal("hunter2")) }) It("loads and decrypts a SOPS-encrypted vault end-to-end", func() { @@ -256,7 +214,7 @@ var _ = Describe("VaultEncryption", func() { Expect(err).ToNot(HaveOccurred(), string(out)) // Extract the public key (recipient). - recipient, _, err := vault.ResolveAgeKey(ageKeyPath, tmpDir) + recipient, _, err := sops.ResolveAgeKey(ageKeyPath, tmpDir) Expect(err).ToNot(HaveOccurred()) // Write a plain vault file. @@ -271,16 +229,19 @@ var _ = Describe("VaultEncryption", func() { encOut, err := encryptCmd.CombinedOutput() Expect(err).ToNot(HaveOccurred(), string(encOut)) - // LoadVaultData should detect SOPS, decrypt, unwrap data: |, and parse. - vault, err := vault.LoadVaultData(vaultPath, ageKeyPath) + backend, err := vault.New(vault.TypeSOPS, vault.Options{Path: vaultPath, AgeKey: ageKeyPath}) Expect(err).ToNot(HaveOccurred()) - Expect(vault.Secrets).To(HaveLen(1)) - Expect(vault.Secrets[0].Name).To(Equal("sops-secret")) - Expect(vault.Secrets[0].Fields.Password).To(Equal("s3cr3t")) + loaded, err := backend.Load() + Expect(err).ToNot(HaveOccurred()) + Expect(loaded.Secrets).To(HaveLen(1)) + Expect(loaded.Secrets[0].Name).To(Equal("sops-secret")) + Expect(loaded.Secrets[0].Fields.Password).To(Equal("s3cr3t")) }) It("returns an error for a non-existent file", func() { - _, err := vault.LoadVaultData(filepath.Join(tmpDir, "missing.yaml"), "") + backend, err := vault.New(vault.TypePlain, vault.Options{Path: filepath.Join(tmpDir, "missing.yaml")}) + Expect(err).ToNot(HaveOccurred()) + _, err = backend.Load() Expect(err).To(HaveOccurred()) }) }) diff --git a/internal/installer/vault/vault_encryption_unexported_test.go b/internal/installer/vault/vault_encryption_unexported_test.go deleted file mode 100644 index e83e67cac..000000000 --- a/internal/installer/vault/vault_encryption_unexported_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Codesphere Inc. -// SPDX-License-Identifier: Apache-2.0 - -package vault - -import ( - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("unwrapSOPSData", func() { - It("returns data unchanged when there is no data: wrapper", func() { - input := []byte("secrets:\n - name: foo\n fields:\n password: bar\n") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal(string(input))) - }) - - It("strips a top-level data: | wrapper and returns inner content", func() { - input := []byte("data: |\n secrets:\n - name: foo\n fields:\n password: bar\n") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal("secrets:\n - name: foo\n fields:\n password: bar\n")) - }) - - It("returns data unchanged for an empty document", func() { - input := []byte("") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal(string(input))) - }) - - It("returns data unchanged when root has multiple keys", func() { - input := []byte("data: some-value\nsops:\n key: val\n") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal(string(input))) - }) - - It("returns data unchanged for invalid YAML", func() { - input := []byte("not: valid: yaml: [[") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal(string(input))) - }) - - It("returns data unchanged when data is not a scalar", func() { - input := []byte("data:\n nested: value\n") - output := unwrapSOPSData(input) - Expect(string(output)).To(Equal(string(input))) - }) -}) diff --git a/internal/installer/vault/vault_secret_creator.go b/internal/installer/vault/vault_secret_creator.go index 5ac825485..a0e40b97a 100644 --- a/internal/installer/vault/vault_secret_creator.go +++ b/internal/installer/vault/vault_secret_creator.go @@ -36,22 +36,28 @@ func NewVaultSecretCreator(c client.Client) *VaultSecretCreator { // - File entries produce a single key equal to the entry name. // - Field entries produce "entryName.password" and, when present, "entryName.username". func (v *VaultSecretCreator) CreateSecretFromFile(ctx context.Context, vaultFile, ageKeyPath, namespace, secretName string) error { - decrypted, err := DecryptFileWithSOPS(vaultFile, ageKeyPath) + backend, err := New(TypeSOPS, Options{Path: vaultFile, AgeKey: ageKeyPath}) if err != nil { - return fmt.Errorf("failed to decrypt vault file: %w", err) + return err } - vault := &files.InstallVault{} - if err := vault.Unmarshal(decrypted); err != nil { - return fmt.Errorf("failed to parse vault file: %w", err) + return v.CreateSecretFromStore(ctx, backend, namespace, secretName) +} + +// CreateSecretFromStore loads secrets through the abstract vault and syncs them +// to a Kubernetes secret. +func (v *VaultSecretCreator) CreateSecretFromStore(ctx context.Context, store Vault, namespace, secretName string) error { + data, err := store.Load() + if err != nil { + return fmt.Errorf("failed to load vault: %w", err) } // Always create new service accounts tokens during creation to ensure they are always valid and updated. - if err := secrets.EnsureServiceAccountTokens(vault); err != nil { + if err := secrets.EnsureServiceAccountTokens(data); err != nil { return fmt.Errorf("failed to ensure service account tokens: %w", err) } - return v.CreateSecretFromVault(ctx, vault, namespace, secretName) + return v.CreateSecretFromVault(ctx, data, namespace, secretName) } // CreateSecretFromVault creates or updates a Kubernetes secret with the contents of a Vault in the target cluster. diff --git a/internal/installer/vault/vault_store_test.go b/internal/installer/vault/vault_store_test.go new file mode 100644 index 000000000..e24257278 --- /dev/null +++ b/internal/installer/vault/vault_store_test.go @@ -0,0 +1,99 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package vault_test + +import ( + "os" + "os/exec" + "path/filepath" + + "github.com/codesphere-cloud/oms/internal/installer/files" + "github.com/codesphere-cloud/oms/internal/installer/vault" + "github.com/codesphere-cloud/oms/internal/installer/vault/plain" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Vault stores", func() { + It("round-trips secrets and secret files through a plain vault", func() { + path := filepath.Join(GinkgoT().TempDir(), "prod.vault.yaml") + store, err := plain.New(plain.Options{Path: path}) + Expect(err).NotTo(HaveOccurred()) + + want := &files.InstallVault{Secrets: []files.SecretEntry{ + {Name: "password", Fields: &files.SecretFields{Username: "user", Password: "secret"}}, + {Name: "certificate", File: &files.SecretFile{Name: "ca.pem", Content: "PEM"}}, + }} + Expect(store.Save(want)).To(Succeed()) + got, err := store.Load() + Expect(err).NotTo(HaveOccurred()) + Expect(got.GetSecret("password").Fields.Password).To(Equal("secret")) + Expect(got.GetSecret("certificate").File.Content).To(Equal("PEM")) + + info, err := os.Stat(path) + Expect(err).NotTo(HaveOccurred()) + Expect(info.Mode().Perm()).To(Equal(os.FileMode(0600))) + }) + + It("requires an age key for a SOPS vault", func() { + GinkgoT().Setenv("SOPS_AGE_KEY", "") + GinkgoT().Setenv("SOPS_AGE_KEY_FILE", "") + _, err := vault.New(vault.TypeSOPS, vault.Options{Path: filepath.Join(GinkgoT().TempDir(), "prod.vault.yaml")}) + Expect(err).To(HaveOccurred()) + }) + + It("round-trips secrets through a SOPS vault", func() { + if _, err := exec.LookPath("sops"); err != nil { + Skip("sops is not installed") + } + + if _, err := exec.LookPath("age-keygen"); err != nil { + Skip("age-keygen is not installed") + } + + dir := GinkgoT().TempDir() + keyPath := filepath.Join(dir, "age-key.txt") + output, err := exec.Command("age-keygen", "-o", keyPath).CombinedOutput() + Expect(err).NotTo(HaveOccurred(), string(output)) + + path := filepath.Join(dir, "prod.vault.yaml") + store, err := sops.New(sops.Options{Path: path, AgeKey: keyPath}) + Expect(err).NotTo(HaveOccurred()) + + want := &files.InstallVault{Secrets: []files.SecretEntry{{Name: "token", Fields: &files.SecretFields{Password: "secret"}}}} + Expect(store.Save(want)).To(Succeed()) + + onDisk, err := os.ReadFile(path) + Expect(err).NotTo(HaveOccurred()) + Expect(onDisk).NotTo(BeEmpty()) + + got, err := store.Load() + Expect(err).NotTo(HaveOccurred()) + Expect(got.GetSecret("token").Fields.Password).To(Equal("secret")) + }) + + It("defaults an empty type to SOPS", func() { + vaultType, err := vault.ParseType("") + Expect(err).NotTo(HaveOccurred()) + Expect(vaultType).To(Equal(vault.TypeSOPS)) + }) + + It("validates file paths in the file-backed implementations", func() { + _, err := plain.New(plain.Options{}) + Expect(err).To(HaveOccurred()) + GinkgoT().Setenv("SOPS_AGE_KEY", "test-key-is-present") + + _, err = sops.New(sops.Options{}) + Expect(err).To(HaveOccurred()) + }) + + It("handles a missing plain file inside the plain vault", func() { + store, err := plain.New(plain.Options{Path: filepath.Join(GinkgoT().TempDir(), "missing.yaml")}) + Expect(err).NotTo(HaveOccurred()) + data, err := store.LoadOrCreate() + Expect(err).NotTo(HaveOccurred()) + Expect(data.Secrets).To(BeEmpty()) + }) +}) diff --git a/internal/installer/vault/vault_suite_test.go b/internal/installer/vault/vault_suite_test.go index 7ad67417d..a36330c24 100644 --- a/internal/installer/vault/vault_suite_test.go +++ b/internal/installer/vault/vault_suite_test.go @@ -1,7 +1,7 @@ // Copyright (c) Codesphere Inc. // SPDX-License-Identifier: Apache-2.0 -package vault +package vault_test import ( "testing" diff --git a/internal/installer/vault/vault_templating_secret_store.go b/internal/installer/vault/vault_templating_secret_store.go index 9a0865053..4511eda26 100644 --- a/internal/installer/vault/vault_templating_secret_store.go +++ b/internal/installer/vault/vault_templating_secret_store.go @@ -6,19 +6,17 @@ package vault import ( "errors" "fmt" - "os" "github.com/codesphere-cloud/oms/internal/installer/files" - "go.yaml.in/yaml/v3" + "github.com/codesphere-cloud/oms/internal/installer/vault/sops" ) // VaultTemplatingSecretStore resolves secrets referenced from config templates // against a SOPS-encrypted install vault. The vault can either be provided // directly or loaded lazily from disk on first lookup. type VaultTemplatingSecretStore struct { - vault *files.InstallVault - vaultPath string - ageKeyPath string + vault *files.InstallVault + backend Vault } // NewVaultTemplatingSecretStore returns a store backed by an already-decrypted vault. @@ -29,16 +27,27 @@ func NewVaultTemplatingSecretStore(vault *files.InstallVault) *VaultTemplatingSe // NewLazyVaultTemplatingSecretStore returns a store that decrypts and loads the // vault from vaultPath using ageKeyPath on the first secret lookup. func NewLazyVaultTemplatingSecretStore(vaultPath, ageKeyPath string) *VaultTemplatingSecretStore { + backend := sops.NewLazy(sops.Options{Path: vaultPath, AgeKey: ageKeyPath}) return &VaultTemplatingSecretStore{ - vaultPath: vaultPath, - ageKeyPath: ageKeyPath, + backend: backend, } } +// NewLazyVaultTemplatingSecretStoreWithVault returns a lazily loaded secret +// store backed by any Vault implementation. +func NewLazyVaultTemplatingSecretStoreWithVault(backend Vault) *VaultTemplatingSecretStore { + return &VaultTemplatingSecretStore{backend: backend} +} + // NewVaultTemplatingSecretStoreFromFile decrypts and loads the vault from // vaultPath using ageKeyPath and returns a store backed by it. func NewVaultTemplatingSecretStoreFromFile(vaultPath, ageKeyPath string) (*VaultTemplatingSecretStore, error) { - vault, err := LoadVaultData(vaultPath, ageKeyPath) + backend, err := New(TypeSOPS, Options{Path: vaultPath, AgeKey: ageKeyPath}) + if err != nil { + return nil, err + } + + vault, err := backend.Load() if err != nil { return nil, err } @@ -68,10 +77,12 @@ func (s *VaultTemplatingSecretStore) ensureVault() error { if s.vault != nil { return nil } - if s.vaultPath == "" { - return errors.New("vaultPath not set") + + if s.backend == nil { + return errors.New("vault backend not set") } - vault, err := LoadVaultData(s.vaultPath, s.ageKeyPath) + + vault, err := s.backend.Load() if err != nil { return err } @@ -111,106 +122,3 @@ func selectVaultSecretValue(entry files.SecretEntry, selector ...string) (string return "", fmt.Errorf("selector %q is not available on secret %q", field, entry.Name) } - -// LoadVaultData reads, SOPS-decrypts, and parses the vault at vaultPath using -// the age key at ageKeyPath, returning the decoded install vault. -func LoadVaultData(vaultPath, ageKeyPath string) (*files.InstallVault, error) { - data, err := os.ReadFile(vaultPath) - if err != nil { - return nil, fmt.Errorf("failed to read vault file %s: %w", vaultPath, err) - } - - encrypted, err := isSOPSEncryptedYAML(data) - if err != nil { - return nil, fmt.Errorf("failed to inspect vault file %s: %w", vaultPath, err) - } - - if !encrypted { - return nil, fmt.Errorf("vault file %s is not SOPS-encrypted", vaultPath) - } - - decryptedData, err := DecryptFileWithSOPS(vaultPath, ageKeyPath) - if err != nil { - return nil, fmt.Errorf("failed to decrypt vault.yaml: %w", err) - } - - vault, err := parseVaultData(decryptedData) - if err != nil { - return nil, fmt.Errorf("failed to parse decrypted vault.yaml: %w", err) - } - - return vault, nil -} - -// LoadUnencryptedVaultData reads parses an unencrypted vault at vaultPath -// returning the decoded install vault. -// This is only used for GCP Bootstrapping. All other features should force a decrypted vault. -func LoadUnencryptedVaultData(vaultPath string) (*files.InstallVault, error) { - data, err := os.ReadFile(vaultPath) - if err != nil { - return nil, fmt.Errorf("failed to read vault file %s: %w", vaultPath, err) - } - - encrypted, err := isSOPSEncryptedYAML(data) - if err != nil { - return nil, fmt.Errorf("failed to inspect vault file %s: %w", vaultPath, err) - } - - if encrypted { - return nil, fmt.Errorf("failed to use unencrypted vault: vault is encrpted") - } - - vault, err := parseVaultData(data) - if err != nil { - return nil, fmt.Errorf("failed to parse decrypted vault.yaml: %w", err) - } - - return vault, nil -} - -// IsSOPSEncryptedFile checks whether the file at path is a SOPS-encrypted YAML document. -func IsSOPSEncryptedFile(path string) (bool, error) { - data, err := os.ReadFile(path) - if err != nil { - return false, err - } - return isSOPSEncryptedYAML(data) -} - -// isSOPSEncryptedYAML checks whether the YAML document contains SOPS metadata. -// SOPS-encrypted YAML files have a top-level "sops" mapping that stores -// encryption metadata such as age recipients, encrypted data keys, and MACs. -func isSOPSEncryptedYAML(data []byte) (bool, error) { - var doc yaml.Node - if err := yaml.Unmarshal(data, &doc); err != nil { - return false, err - } - if len(doc.Content) == 0 { - return false, nil - } - - root := doc.Content[0] - if root.Kind != yaml.MappingNode { - return false, nil - } - - // A mapping node stores its keys and values as a flat list alternating - // key, value, key, value, ... so we step by 2 to visit each key/value pair. - for i := 0; i+1 < len(root.Content); i += 2 { - if root.Content[i].Value == "sops" && root.Content[i+1].Kind == yaml.MappingNode { - return true, nil - } - } - - return false, nil -} - -func parseVaultData(data []byte) (*files.InstallVault, error) { - data = unwrapSOPSData(data) - - vault := &files.InstallVault{} - if err := vault.Unmarshal(data); err != nil { - return nil, err - } - return vault, nil -} From a8ea1364620bf1a85023eec5d94641db9afe46b2 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Fri, 14 Aug 2026 17:12:01 +0200 Subject: [PATCH 020/132] update(deps): update github.com/rook/rook/pkg/apis digest to 5f86a7d (#694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `9aed6d7` → `5f86a7d` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 7473a7a98..e25f5820c 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260813163907-9aed6d79c17a +Version: v0.0.0-20260814134912-5f86a7d01c22 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/9aed6d79c17a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5f86a7d01c22/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index c1a84edaf..453c1b7ae 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a + github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22 ) require ( diff --git a/go.sum b/go.sum index 2f01e55fe..218fd94a9 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a h1:6k8ogL7q9VOi+5b76L4qA6PYDxDxlvk6ewbjMsBH0Fk= -github.com/rook/rook/pkg/apis v0.0.0-20260813163907-9aed6d79c17a/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22 h1:1BbiLIfjeApDILhWPhGyWO92MQk1D/92QQKeWPZ9VKQ= +github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 7473a7a98..e25f5820c 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260813163907-9aed6d79c17a +Version: v0.0.0-20260814134912-5f86a7d01c22 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/9aed6d79c17a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5f86a7d01c22/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 2643f092cd0ceb0b1690a9a927f0cb5251194b50 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:21:19 +0200 Subject: [PATCH 021/132] update(deps): update github.com/rook/rook/pkg/apis digest to b9e4772 (#695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `5f86a7d` → `b9e4772` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index e25f5820c..7df836f1a 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260814134912-5f86a7d01c22 +Version: v0.0.0-20260814182029-b9e4772d8417 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5f86a7d01c22/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/b9e4772d8417/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 453c1b7ae..30685bd62 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22 + github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417 ) require ( diff --git a/go.sum b/go.sum index 218fd94a9..daed2e21e 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22 h1:1BbiLIfjeApDILhWPhGyWO92MQk1D/92QQKeWPZ9VKQ= -github.com/rook/rook/pkg/apis v0.0.0-20260814134912-5f86a7d01c22/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417 h1:BB7sq4Q9r4EdAN5M4FFSgK+ZD6rf8hXlxXcJc5JpTCY= +github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index e25f5820c..7df836f1a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260814134912-5f86a7d01c22 +Version: v0.0.0-20260814182029-b9e4772d8417 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5f86a7d01c22/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/b9e4772d8417/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 4e3a282ff38969b9bc8396cfe6af5e274f55aa0a Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Mon, 17 Aug 2026 12:11:06 +0200 Subject: [PATCH 022/132] update(deps): update module github.com/stretchr/testify to v1.12.0 (#696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/stretchr/testify](https://redirect.github.com/stretchr/testify) | `v1.11.1` → `v1.12.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fstretchr%2ftestify/v1.12.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fstretchr%2ftestify/v1.11.1/v1.12.0?slim=true) | --- ### Release Notes
stretchr/testify (github.com/stretchr/testify) ### [`v1.12.0`](https://redirect.github.com/stretchr/testify/releases/tag/v1.12.0) [Compare Source](https://redirect.github.com/stretchr/testify/compare/v1.11.1...v1.12.0) #### What's Changed ##### Functional Changes - assert: make \*AssertionFunc types just aliases by [@​dolmen](https://redirect.github.com/dolmen) in [#​1563](https://redirect.github.com/stretchr/testify/pull/1563) ##### Fixes - mock: avoid panic when expected type is nil in Arguments.Diff by [@​mutaiib](https://redirect.github.com/mutaiib) in [#​1775](https://redirect.github.com/stretchr/testify/pull/1775) - mock: revert to pre-v1.11.0 argument matching behavior for mutating stringers by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1786](https://redirect.github.com/stretchr/testify/pull/1786) - suite: validate method signatures and continue execution for valid tests by [@​vyas-git](https://redirect.github.com/vyas-git) in [#​1665](https://redirect.github.com/stretchr/testify/pull/1665) - assert.PanicsWithError: report error message by [@​olivergondza](https://redirect.github.com/olivergondza) in [#​1400](https://redirect.github.com/stretchr/testify/pull/1400) - assert: IsIncreasing et al can return false w/out failing by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1787](https://redirect.github.com/stretchr/testify/pull/1787) - add type to error message of assert.Same by [@​egawata](https://redirect.github.com/egawata) in [#​1792](https://redirect.github.com/stretchr/testify/pull/1792) - mock.AssertExpectationsForObjects fix panic with wrong testObject type. by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1795](https://redirect.github.com/stretchr/testify/pull/1795) - assert: truncate very long objects in test failure messages by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1646](https://redirect.github.com/stretchr/testify/pull/1646) - assert: fix NotSubset error messages using %#v instead of %q (fixes [#​1800](https://redirect.github.com/stretchr/testify/issues/1800)) by [@​nghiack7](https://redirect.github.com/nghiack7) in [#​1888](https://redirect.github.com/stretchr/testify/pull/1888) - suite: prevent panic when SetupTest skips with HandleStats by [@​blackwell-systems](https://redirect.github.com/blackwell-systems) in [#​1877](https://redirect.github.com/stretchr/testify/pull/1877) ##### Documentation, Build & CI - CI: test also with Go 1.23 by [@​dolmen](https://redirect.github.com/dolmen) in [#​1783](https://redirect.github.com/stretchr/testify/pull/1783) - Vendor unmaintained github.com/pmezard/go-difflib by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1708](https://redirect.github.com/stretchr/testify/pull/1708) - Promote ccoVeille to maintainer by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1784](https://redirect.github.com/stretchr/testify/pull/1784) - build(deps): bump actions/setup-go from 5 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​1790](https://redirect.github.com/stretchr/testify/pull/1790) - assert.YAMLEq: Document mutlidoc behavior by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1791](https://redirect.github.com/stretchr/testify/pull/1791) - \_codegen: copy dependency github.com/ernesto-jimenez/gogen/imports by [@​dolmen](https://redirect.github.com/dolmen) in [#​1782](https://redirect.github.com/stretchr/testify/pull/1782) - doc: remove ineffective inline code blocks by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1714](https://redirect.github.com/stretchr/testify/pull/1714) - Tag generated assertions as non-generated in new .gitattributes by [@​ubunatic](https://redirect.github.com/ubunatic) in [#​1815](https://redirect.github.com/stretchr/testify/pull/1815) - chore: vendor go-spew from by [@​ccoVeille](https://redirect.github.com/ccoVeille) in [#​1827](https://redirect.github.com/stretchr/testify/pull/1827) - require: fix godoc generation for assertions returning a bool by [@​Baxromumarov](https://redirect.github.com/Baxromumarov) in [#​1850](https://redirect.github.com/stretchr/testify/pull/1850) - docs(require): correct example usage to use assert.CollectT (require.CollectT does not exist) by [@​a2not](https://redirect.github.com/a2not) in [#​1821](https://redirect.github.com/stretchr/testify/pull/1821) - docs: Fix EventuallyWithTf documentation with proper placement of formatting arguments by [@​a2not](https://redirect.github.com/a2not) in [#​1842](https://redirect.github.com/stretchr/testify/pull/1842) - EMERITUS.md: add [@​tylerb](https://redirect.github.com/tylerb) by [@​dolmen](https://redirect.github.com/dolmen) in [#​1812](https://redirect.github.com/stretchr/testify/pull/1812) - CI: test also with Go 1.24 by [@​alexandear](https://redirect.github.com/alexandear) in [#​1856](https://redirect.github.com/stretchr/testify/pull/1856) - deps: bump objx to v0.5.3 and remove dependency cycle issue by [@​ccoVeille](https://redirect.github.com/ccoVeille) in [#​1823](https://redirect.github.com/stretchr/testify/pull/1823) - CI: upgrade GitHub Actions and pin hashes by [@​SuperQ](https://redirect.github.com/SuperQ) in [#​1883](https://redirect.github.com/stretchr/testify/pull/1883) - CI: add \_readme-gofmt tool to reformat Go code in README by [@​dolmen](https://redirect.github.com/dolmen) in [#​1889](https://redirect.github.com/stretchr/testify/pull/1889) - CI: add check of GitHub Action pinned hashes against tag by [@​dolmen](https://redirect.github.com/dolmen) in [#​1885](https://redirect.github.com/stretchr/testify/pull/1885) - \_codegen: modernize by [@​dolmen](https://redirect.github.com/dolmen) in [#​1890](https://redirect.github.com/stretchr/testify/pull/1890) - build(deps): bump actions/checkout from 6.0.2 to 6.0.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​1906](https://redirect.github.com/stretchr/testify/pull/1906) - mock: Mock.Return does not exist anymore by [@​Kentzo](https://redirect.github.com/Kentzo) in [#​1905](https://redirect.github.com/stretchr/testify/pull/1905) #### New Contributors - [@​mutaiib](https://redirect.github.com/mutaiib) made their first contribution in [#​1775](https://redirect.github.com/stretchr/testify/pull/1775) - [@​vyas-git](https://redirect.github.com/vyas-git) made their first contribution in [#​1665](https://redirect.github.com/stretchr/testify/pull/1665) - [@​olivergondza](https://redirect.github.com/olivergondza) made their first contribution in [#​1400](https://redirect.github.com/stretchr/testify/pull/1400) - [@​egawata](https://redirect.github.com/egawata) made their first contribution in [#​1792](https://redirect.github.com/stretchr/testify/pull/1792) - [@​ubunatic](https://redirect.github.com/ubunatic) made their first contribution in [#​1815](https://redirect.github.com/stretchr/testify/pull/1815) - [@​Baxromumarov](https://redirect.github.com/Baxromumarov) made their first contribution in [#​1850](https://redirect.github.com/stretchr/testify/pull/1850) - [@​a2not](https://redirect.github.com/a2not) made their first contribution in [#​1821](https://redirect.github.com/stretchr/testify/pull/1821) - [@​nghiack7](https://redirect.github.com/nghiack7) made their first contribution in [#​1888](https://redirect.github.com/stretchr/testify/pull/1888) - [@​blackwell-systems](https://redirect.github.com/blackwell-systems) made their first contribution in [#​1877](https://redirect.github.com/stretchr/testify/pull/1877) - [@​Kentzo](https://redirect.github.com/Kentzo) made their first contribution in [#​1905](https://redirect.github.com/stretchr/testify/pull/1905) **Full Changelog**: #### What's Changed - mock: avoid panic when expected type is nil in Arguments.Diff by [@​mutaiib](https://redirect.github.com/mutaiib) in [#​1775](https://redirect.github.com/stretchr/testify/pull/1775) - CI: test also with Go 1.23 by [@​dolmen](https://redirect.github.com/dolmen) in [#​1783](https://redirect.github.com/stretchr/testify/pull/1783) - mock: revert to pre-v1.11.0 argument matching behavior for mutating stringers by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1786](https://redirect.github.com/stretchr/testify/pull/1786) - suite: validate method signatures and continue execution for valid tests by [@​vyas-git](https://redirect.github.com/vyas-git) in [#​1665](https://redirect.github.com/stretchr/testify/pull/1665) - Vendor unmaintained github.com/pmezard/go-difflib by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1708](https://redirect.github.com/stretchr/testify/pull/1708) - Promote ccoVeille to maintainer by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1784](https://redirect.github.com/stretchr/testify/pull/1784) - build(deps): bump actions/setup-go from 5 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​1790](https://redirect.github.com/stretchr/testify/pull/1790) - assert.PanicsWithError: report error message by [@​olivergondza](https://redirect.github.com/olivergondza) in [#​1400](https://redirect.github.com/stretchr/testify/pull/1400) - assert: IsIncreasing et al can return false w/out failing by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1787](https://redirect.github.com/stretchr/testify/pull/1787) - add type to error message of assert.Same by [@​egawata](https://redirect.github.com/egawata) in [#​1792](https://redirect.github.com/stretchr/testify/pull/1792) - assert.YAMLEq: Document mutlidoc behavior by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1791](https://redirect.github.com/stretchr/testify/pull/1791) - mock.AssertExpectationsForObjects fix panic with wrong testObject type. by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1795](https://redirect.github.com/stretchr/testify/pull/1795) - \_codegen: copy dependency github.com/ernesto-jimenez/gogen/imports by [@​dolmen](https://redirect.github.com/dolmen) in [#​1782](https://redirect.github.com/stretchr/testify/pull/1782) - assert: truncate very long objects in test failure messages by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1646](https://redirect.github.com/stretchr/testify/pull/1646) - doc: remove ineffective inline code blocks by [@​brackendawson](https://redirect.github.com/brackendawson) in [#​1714](https://redirect.github.com/stretchr/testify/pull/1714) - Tag generated assertions as non-generated in new .gitattributes by [@​ubunatic](https://redirect.github.com/ubunatic) in [#​1815](https://redirect.github.com/stretchr/testify/pull/1815) - chore: vendor go-spew from by [@​ccoVeille](https://redirect.github.com/ccoVeille) in [#​1827](https://redirect.github.com/stretchr/testify/pull/1827) - require: fix godoc generation for assertions returning a bool by [@​Baxromumarov](https://redirect.github.com/Baxromumarov) in [#​1850](https://redirect.github.com/stretchr/testify/pull/1850) - docs(require): correct example usage to use assert.CollectT (require.CollectT does not exist) by [@​a2not](https://redirect.github.com/a2not) in [#​1821](https://redirect.github.com/stretchr/testify/pull/1821) - docs: Fix EventuallyWithTf documentation with proper placement of formatting arguments by [@​a2not](https://redirect.github.com/a2not) in [#​1842](https://redirect.github.com/stretchr/testify/pull/1842) - EMERITUS.md: add [@​tylerb](https://redirect.github.com/tylerb) by [@​dolmen](https://redirect.github.com/dolmen) in [#​1812](https://redirect.github.com/stretchr/testify/pull/1812) - CI: test also with Go 1.24 by [@​alexandear](https://redirect.github.com/alexandear) in [#​1856](https://redirect.github.com/stretchr/testify/pull/1856) - deps: bump objx to v0.5.3 and remove dependency cycle issue by [@​ccoVeille](https://redirect.github.com/ccoVeille) in [#​1823](https://redirect.github.com/stretchr/testify/pull/1823) - CI: upgrade GitHub Actions and pin hashes by [@​SuperQ](https://redirect.github.com/SuperQ) in [#​1883](https://redirect.github.com/stretchr/testify/pull/1883) - assert: fix NotSubset error messages using %#v instead of %q (fixes [#​1800](https://redirect.github.com/stretchr/testify/issues/1800)) by [@​nghiack7](https://redirect.github.com/nghiack7) in [#​1888](https://redirect.github.com/stretchr/testify/pull/1888) - suite: prevent panic when SetupTest skips with HandleStats by [@​blackwell-systems](https://redirect.github.com/blackwell-systems) in [#​1877](https://redirect.github.com/stretchr/testify/pull/1877) - CI: add \_readme-gofmt tool to reformat Go code in README by [@​dolmen](https://redirect.github.com/dolmen) in [#​1889](https://redirect.github.com/stretchr/testify/pull/1889) - CI: add check of GitHub Action pinned hashes against tag by [@​dolmen](https://redirect.github.com/dolmen) in [#​1885](https://redirect.github.com/stretchr/testify/pull/1885) - \_codegen: modernize by [@​dolmen](https://redirect.github.com/dolmen) in [#​1890](https://redirect.github.com/stretchr/testify/pull/1890) - assert: make \*AssertionFunc types just aliases by [@​dolmen](https://redirect.github.com/dolmen) in [#​1563](https://redirect.github.com/stretchr/testify/pull/1563) - build(deps): bump actions/checkout from 6.0.2 to 6.0.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​1906](https://redirect.github.com/stretchr/testify/pull/1906) - mock: Mock.Return does not exist anymore by [@​Kentzo](https://redirect.github.com/Kentzo) in [#​1905](https://redirect.github.com/stretchr/testify/pull/1905) #### New Contributors - [@​mutaiib](https://redirect.github.com/mutaiib) made their first contribution in [#​1775](https://redirect.github.com/stretchr/testify/pull/1775) - [@​vyas-git](https://redirect.github.com/vyas-git) made their first contribution in [#​1665](https://redirect.github.com/stretchr/testify/pull/1665) - [@​olivergondza](https://redirect.github.com/olivergondza) made their first contribution in [#​1400](https://redirect.github.com/stretchr/testify/pull/1400) - [@​egawata](https://redirect.github.com/egawata) made their first contribution in [#​1792](https://redirect.github.com/stretchr/testify/pull/1792) - [@​ubunatic](https://redirect.github.com/ubunatic) made their first contribution in [#​1815](https://redirect.github.com/stretchr/testify/pull/1815) - [@​Baxromumarov](https://redirect.github.com/Baxromumarov) made their first contribution in [#​1850](https://redirect.github.com/stretchr/testify/pull/1850) - [@​a2not](https://redirect.github.com/a2not) made their first contribution in [#​1821](https://redirect.github.com/stretchr/testify/pull/1821) - [@​nghiack7](https://redirect.github.com/nghiack7) made their first contribution in [#​1888](https://redirect.github.com/stretchr/testify/pull/1888) - [@​blackwell-systems](https://redirect.github.com/blackwell-systems) made their first contribution in [#​1877](https://redirect.github.com/stretchr/testify/pull/1877) - [@​Kentzo](https://redirect.github.com/Kentzo) made their first contribution in [#​1905](https://redirect.github.com/stretchr/testify/pull/1905) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 16 ++++++++++++++-- go.mod | 2 +- go.sum | 3 ++- internal/tmpl/NOTICE | 16 ++++++++++++++-- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/NOTICE b/NOTICE index 7df836f1a..6fba68171 100644 --- a/NOTICE +++ b/NOTICE @@ -1241,9 +1241,21 @@ License URL: https://github.com/stretchr/objx/blob/v0.5.3/LICENSE ---------- Module: github.com/stretchr/testify -Version: v1.11.1 +Version: v1.12.0 License: MIT -License URL: https://github.com/stretchr/testify/blob/v1.11.1/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.0/LICENSE + +---------- +Module: github.com/stretchr/testify/internal/difflib +Version: v1.12.0 +License: BSD-3-Clause +License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/difflib/LICENSE + +---------- +Module: github.com/stretchr/testify/internal/spew +Version: v1.12.0 +License: ISC +License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/spew/LICENSE ---------- Module: github.com/tetratelabs/wabin diff --git a/go.mod b/go.mod index 30685bd62..21364bb4c 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 github.com/spf13/cobra v1.10.2 - github.com/stretchr/testify v1.11.1 + github.com/stretchr/testify v1.12.0 go.yaml.in/yaml/v3 v3.0.5 golang.org/x/crypto v0.55.0 golang.org/x/mod v0.40.0 diff --git a/go.sum b/go.sum index daed2e21e..f45d014ad 100644 --- a/go.sum +++ b/go.sum @@ -4880,8 +4880,9 @@ github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= +github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 7df836f1a..6fba68171 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1241,9 +1241,21 @@ License URL: https://github.com/stretchr/objx/blob/v0.5.3/LICENSE ---------- Module: github.com/stretchr/testify -Version: v1.11.1 +Version: v1.12.0 License: MIT -License URL: https://github.com/stretchr/testify/blob/v1.11.1/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.0/LICENSE + +---------- +Module: github.com/stretchr/testify/internal/difflib +Version: v1.12.0 +License: BSD-3-Clause +License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/difflib/LICENSE + +---------- +Module: github.com/stretchr/testify/internal/spew +Version: v1.12.0 +License: ISC +License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/spew/LICENSE ---------- Module: github.com/tetratelabs/wabin From 42727f8d685ea6b40ba0f275feb5cad444c64ff9 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Tue, 18 Aug 2026 01:33:08 +0200 Subject: [PATCH 023/132] update(deps): update github.com/rook/rook/pkg/apis digest to dc8bdad (#698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `b9e4772` → `dc8bdad` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 6fba68171..a0686bb97 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260814182029-b9e4772d8417 +Version: v0.0.0-20260817221051-dc8bdad5789d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/b9e4772d8417/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/dc8bdad5789d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 21364bb4c..81fb27a88 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417 + github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d ) require ( diff --git a/go.sum b/go.sum index f45d014ad..650a8928c 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417 h1:BB7sq4Q9r4EdAN5M4FFSgK+ZD6rf8hXlxXcJc5JpTCY= -github.com/rook/rook/pkg/apis v0.0.0-20260814182029-b9e4772d8417/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d h1:ObcmgfBZlDg3kmj4gAIcD3RFcnQZto3qHRV9ApxPcyU= +github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6fba68171..a0686bb97 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260814182029-b9e4772d8417 +Version: v0.0.0-20260817221051-dc8bdad5789d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/b9e4772d8417/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/dc8bdad5789d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From d98dfe0cf21bfdd9df88a90859de0ba349276ef5 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Tue, 18 Aug 2026 20:19:09 +0200 Subject: [PATCH 024/132] update(deps): update github.com/rook/rook/pkg/apis digest to 3fc7fa0 (#699) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `dc8bdad` → `3fc7fa0` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index a0686bb97..4fce7cd70 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260817221051-dc8bdad5789d +Version: v0.0.0-20260818165109-3fc7fa0ca1cb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/dc8bdad5789d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/3fc7fa0ca1cb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 81fb27a88..c9410f409 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d + github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb ) require ( diff --git a/go.sum b/go.sum index 650a8928c..7390bb8dd 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d h1:ObcmgfBZlDg3kmj4gAIcD3RFcnQZto3qHRV9ApxPcyU= -github.com/rook/rook/pkg/apis v0.0.0-20260817221051-dc8bdad5789d/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb h1:m0OhAmCKZ8f2XkZJ2xhHbNo4fgKobZr+A1B8A6eTJdU= +github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index a0686bb97..4fce7cd70 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260817221051-dc8bdad5789d +Version: v0.0.0-20260818165109-3fc7fa0ca1cb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/dc8bdad5789d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/3fc7fa0ca1cb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From beeafc0bb19a54ad3ce9eb013e04b1b7a9cf06cc Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:18:44 +0200 Subject: [PATCH 025/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.23.0 (#700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.22.0` → `v1.23.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.23.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.22.0/v1.23.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.23.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.23.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.22.0...v1.23.0) #### Changelog - [`9b6e313`](https://redirect.github.com/codesphere-cloud/cs-go/commit/9b6e3130333ac87ede3a00e02e6c59aa1bc2a53e) Cs mcp fixes ([#​282](https://redirect.github.com/codesphere-cloud/cs-go/issues/282)) - [`da52c2c`](https://redirect.github.com/codesphere-cloud/cs-go/commit/da52c2c7683d02a4877d8314aea029420beaf597) update(deps): update module github.com/stretchr/testify to v1.12.0 ([#​305](https://redirect.github.com/codesphere-cloud/cs-go/issues/305)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 4fce7cd70..08835742c 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.22.0 +Version: v1.23.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.22.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.23.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index c9410f409..99271c2ea 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( filippo.io/age v1.3.1 github.com/Masterminds/semver/v3 v3.5.0 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.22.0 + github.com/codesphere-cloud/cs-go v1.23.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/jedib0t/go-pretty/v6 v6.8.3 diff --git a/go.sum b/go.sum index 7390bb8dd..7b18295ba 100644 --- a/go.sum +++ b/go.sum @@ -3219,8 +3219,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.22.0 h1:jvLut2jr6qulKsNICUCSk03oCgCFAZGco+6JyYWmbx4= -github.com/codesphere-cloud/cs-go v1.22.0/go.mod h1:p8751a/hY3yONn3AcC7dPi/t43OpvYN+yUqwe9oPSyU= +github.com/codesphere-cloud/cs-go v1.23.0 h1:1utr5apaFPAHmysXsV2T3qddLGAUDWdrjcm6N+tshh4= +github.com/codesphere-cloud/cs-go v1.23.0/go.mod h1:0TVlynPmXCVvxyi996r9UDd7iLyS0pcEI2y/JCo5vU4= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 4fce7cd70..08835742c 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.22.0 +Version: v1.23.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.22.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.23.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From c6f264401784c12dc39ba10b82448127e38cc338 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Wed, 19 Aug 2026 13:59:28 +0200 Subject: [PATCH 026/132] update(deps): update module google.golang.org/grpc to v1.83.1 (#701) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/grpc](https://redirect.github.com/grpc/grpc-go) | `v1.83.0` → `v1.83.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.83.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.83.0/v1.83.1?slim=true) | --- ### Release Notes
grpc/grpc-go (google.golang.org/grpc) ### [`v1.83.1`](https://redirect.github.com/grpc/grpc-go/releases/tag/v1.83.1): Release 1.83.1 [Compare Source](https://redirect.github.com/grpc/grpc-go/compare/v1.83.0...v1.83.1) ### Security - xds/rbac: Fix a bug where nested `Principal` or `Permission` rules with `:scheme` or `grpc-` prefixed header matchers were not rejected, which could cause DENY rules to fail open. ([#​9258](https://redirect.github.com/grpc/grpc-go/issues/9258)) - Special Thanks: [@​nvxbug](https://redirect.github.com/nvxbug) - xds/rbac: Fix a bug where the `host` header matcher was not being replaced with `:authority` in nested `Principal` or `Permission` rules. ([#​9258](https://redirect.github.com/grpc/grpc-go/issues/9258)) - Special Thanks: [@​nvxbug](https://redirect.github.com/nvxbug) - xds/rbac: Fix a bug where a header matcher whose name was not lowercase, such as `X-Role`, matched no header, which could cause DENY rules to fail open. ([#​9332](https://redirect.github.com/grpc/grpc-go/issues/9332)) - Special Thanks: [@​alimony](https://redirect.github.com/alimony) - xds/rbac: Fix a bug where a `:scheme` or `grpc-` prefixed header matcher was accepted when its name was not lowercase. ([#​9332](https://redirect.github.com/grpc/grpc-go/issues/9332)) - Special Thanks: [@​alimony](https://redirect.github.com/alimony) - xds/rbac: Fix a bug where a `Host` header matcher was not replaced with `:authority`. ([#​9332](https://redirect.github.com/grpc/grpc-go/issues/9332)) - Special Thanks: [@​alimony](https://redirect.github.com/alimony) ### Performance - transport: Restrict memory overhead of buffering small data frames. ([#​9331](https://redirect.github.com/grpc/grpc-go/issues/9331))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://redirect.github.com/renovatebot/renovate). --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 08835742c..f3db38aca 100644 --- a/NOTICE +++ b/NOTICE @@ -1517,9 +1517,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googlea ---------- Module: google.golang.org/grpc -Version: v1.83.0 +Version: v1.83.1 License: Apache-2.0 -License URL: https://github.com/grpc/grpc-go/blob/v1.83.0/LICENSE +License URL: https://github.com/grpc/grpc-go/blob/v1.83.1/LICENSE ---------- Module: google.golang.org/protobuf diff --git a/go.mod b/go.mod index 99271c2ea..66efba610 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 google.golang.org/api v0.293.0 - google.golang.org/grpc v1.83.0 + google.golang.org/grpc v1.83.1 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 diff --git a/go.sum b/go.sum index 7b18295ba..a1367df29 100644 --- a/go.sum +++ b/go.sum @@ -6726,8 +6726,8 @@ google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= -google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= +google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b/go.mod h1:IBqQ7wSUJ2Ep09a8rMWFsg4fmI2r38zwsq8a0GgxXpM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 08835742c..f3db38aca 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1517,9 +1517,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googlea ---------- Module: google.golang.org/grpc -Version: v1.83.0 +Version: v1.83.1 License: Apache-2.0 -License URL: https://github.com/grpc/grpc-go/blob/v1.83.0/LICENSE +License URL: https://github.com/grpc/grpc-go/blob/v1.83.1/LICENSE ---------- Module: google.golang.org/protobuf From 1205ef5dbd380141da7e3922e3175d0e340e4981 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:04:40 +0000 Subject: [PATCH 027/132] update(deps): update actions/checkout digest to d23441a (#702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/checkout](https://redirect.github.com/actions/checkout) ([changelog](https://redirect.github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd..d23441a48e516b6c34aea4fa41551a30e30af803)) | action | digest | `de0fac2` → `d23441a` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- .github/workflows/cli-build_test.yml | 4 ++-- .github/workflows/go-lint.yml | 2 +- .github/workflows/integration-test.yml | 2 +- .github/workflows/tag-release.yml | 2 +- .github/workflows/update-docs-and-licenses.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cli-build_test.yml b/.github/workflows/cli-build_test.yml index ab3dfbe4d..00269a830 100644 --- a/.github/workflows/cli-build_test.yml +++ b/.github/workflows/cli-build_test.yml @@ -17,7 +17,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 @@ -42,7 +42,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 diff --git a/.github/workflows/go-lint.yml b/.github/workflows/go-lint.yml index 65558e92b..1fe0f68c4 100644 --- a/.github/workflows/go-lint.yml +++ b/.github/workflows/go-lint.yml @@ -17,7 +17,7 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: fetch-depth: 0 diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 9cc5044e1..b550244d4 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -13,7 +13,7 @@ jobs: integration-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 02babe450..1b4a2def4 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest needs: integration-tests steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: fetch-tags: true fetch-depth: 0 diff --git a/.github/workflows/update-docs-and-licenses.yml b/.github/workflows/update-docs-and-licenses.yml index 37b68b678..38c4833d2 100644 --- a/.github/workflows/update-docs-and-licenses.yml +++ b/.github/workflows/update-docs-and-licenses.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: # on push to main, use main; on PR, check out the PR head ref: ${{ github.event.pull_request.head.ref || github.ref }} From b9cc692e81870c4113f92d6f5901fa6cd4445dca Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:03:48 +0000 Subject: [PATCH 028/132] update(deps): update actions/setup-go digest to 924ae3a (#703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/setup-go](https://redirect.github.com/actions/setup-go) ([changelog](https://redirect.github.com/actions/setup-go/compare/7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5..924ae3a1cded613372ab5595356fb5720e22ba16)) | action | digest | `7a3fe6c` → `924ae3a` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- .github/workflows/cli-build_test.yml | 4 ++-- .github/workflows/go-lint.yml | 2 +- .github/workflows/integration-test.yml | 2 +- .github/workflows/tag-release.yml | 2 +- .github/workflows/update-docs-and-licenses.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cli-build_test.yml b/.github/workflows/cli-build_test.yml index 00269a830..2ba2dfc5a 100644 --- a/.github/workflows/cli-build_test.yml +++ b/.github/workflows/cli-build_test.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' diff --git a/.github/workflows/go-lint.yml b/.github/workflows/go-lint.yml index 1fe0f68c4..5797a5cad 100644 --- a/.github/workflows/go-lint.yml +++ b/.github/workflows/go-lint.yml @@ -21,7 +21,7 @@ jobs: with: fetch-depth: 0 - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index b550244d4..0884cfbfb 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 - name: Set up Go - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 1b4a2def4..dc4f141e9 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -27,7 +27,7 @@ jobs: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' diff --git a/.github/workflows/update-docs-and-licenses.yml b/.github/workflows/update-docs-and-licenses.yml index 38c4833d2..c6a26b771 100644 --- a/.github/workflows/update-docs-and-licenses.yml +++ b/.github/workflows/update-docs-and-licenses.yml @@ -25,7 +25,7 @@ jobs: token: ${{ secrets.PAT_UPDATE_DOCS }} - name: Set up Go - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: go-version-file: 'go.mod' From fec4124a607ce642ffff8ff9d586be0c611e5191 Mon Sep 17 00:00:00 2001 From: Nathanael Ruf <104262550+nathanael-ruf@users.noreply.github.com> Date: Thu, 20 Aug 2026 17:52:30 +0200 Subject: [PATCH 029/132] fix(installer): cap Helm release history at 10 revisions (#711) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Debug thread: https://codesphere-cloud.slack.com/archives/C09CVP4NTL7/p1787240010614749?thread_ts=1785396099.116169&cid=C09CVP4NTL7 The Helm SDK defaults `MaxHistory` to 0, which means unlimited — unlike the Helm CLI, which defaults to 10. `UpgradeChart` never set it, so every upgrade appends a release Secret that nothing ever collects. `cd-master` runs an unconditional `helm upgrade` on every master commit and each revision embeds the full chart, so the `argocd` release on the OVH dev cluster has reached 202 revisions. This matters because listing releases has to transfer all of them, and over the WARP tunnel that transfer gets reset a few seconds in, failing master deploys: ``` Install ArgoCD failed: ... query: failed to query with labels: unexpected error when reading response body. Please retry. Original error: read tcp 172.16.0.2:43848->10.20.3.88:6443: read: connection reset by peer ``` Scope worth being explicit about: this caps the `argocd` release going forward, and fixes the `query with labels` read, which selects on `name=argocd`. It does **not** fix the `list releases failed` variant — `FindRelease` uses `action.NewList`, which fetches every `owner=helm` Secret in the namespace and applies its filter client-side. That namespace currently also holds 616 orphaned `pc-applications` revisions left behind when #633 moved pc-apps to an ArgoCD Application, so the immediate unblock is pruning those; this change keeps `argocd` from growing back into the same problem. --- internal/installer/helm_client.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/installer/helm_client.go b/internal/installer/helm_client.go index be018a948..034c9c8c0 100644 --- a/internal/installer/helm_client.go +++ b/internal/installer/helm_client.go @@ -28,6 +28,12 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) +// maxReleaseHistory caps how many revisions Helm keeps per release. The Helm +// SDK defaults to 0 (unlimited), unlike the CLI which defaults to 10. Every +// upgrade stores the full chart in a Secret, so an uncapped release grows +// without bound and eventually makes listing releases too large to transfer. +const maxReleaseHistory = 10 + // ReleaseInfo holds the details of an existing Helm release that the rest of // the application cares about — completely decoupled from the Helm SDK types. type ReleaseInfo struct { @@ -333,6 +339,7 @@ func (h *helmClient) UpgradeChart(ctx context.Context, cfg ChartConfig, opts Upg upgradeClient.Version = cfg.Version upgradeClient.RepoURL = cfg.RepoURL upgradeClient.Timeout = 5 * time.Minute + upgradeClient.MaxHistory = maxReleaseHistory upgradeClient.ForceConflicts = opts.ForceConflicts upgradeClient.TakeOwnership = opts.TakeOwnership From 7f98dc432bbf48110e0ae8e5b9f990912fef11e0 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 17:03:44 +0000 Subject: [PATCH 030/132] update(deps): update github.com/rook/rook/pkg/apis digest to 90af774 (#705) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `3fc7fa0` → `90af774` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index f3db38aca..0211e2f82 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260818165109-3fc7fa0ca1cb +Version: v0.0.0-20260819181914-90af774465eb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/3fc7fa0ca1cb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/90af774465eb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 66efba610..593287a96 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb + github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb ) require ( diff --git a/go.sum b/go.sum index a1367df29..094f07b12 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb h1:m0OhAmCKZ8f2XkZJ2xhHbNo4fgKobZr+A1B8A6eTJdU= -github.com/rook/rook/pkg/apis v0.0.0-20260818165109-3fc7fa0ca1cb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb h1:ilJU0rG79oX3QqiYM/vl6yW9Bl/e20G9MnNhvL4kMXU= +github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index f3db38aca..0211e2f82 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260818165109-3fc7fa0ca1cb +Version: v0.0.0-20260819181914-90af774465eb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/3fc7fa0ca1cb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/90af774465eb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From c340954a657fae26b7d7433951dbb27a918cb03b Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:10:24 +0000 Subject: [PATCH 031/132] update(deps): update module github.com/stretchr/testify to v1.12.1 (#706) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/stretchr/testify](https://redirect.github.com/stretchr/testify) | `v1.12.0` → `v1.12.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fstretchr%2ftestify/v1.12.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fstretchr%2ftestify/v1.12.0/v1.12.1?slim=true) | --- ### Release Notes
stretchr/testify (github.com/stretchr/testify) ### [`v1.12.1`](https://redirect.github.com/stretchr/testify/releases/tag/v1.12.1) [Compare Source](https://redirect.github.com/stretchr/testify/compare/v1.12.0...v1.12.1) This is the first release which has the minimum dependencies practical in testify v1. The last remaining dependencies are github.com/stretchr/objx which itself has no dependencies, and go.yaml.in/yaml/v3. Removing objx would require v2, it cannot be vendored. Removing YAML would require vendoring the yaml library, which would do more harm than good. It's better to become aware of vulnerabilities in the official yaml package than to attempt to maintain our own. #### What's Changed - Change yaml library to `go.yaml.in/yaml/v3` by [@​harryzcy](https://redirect.github.com/harryzcy) in [#​1935](https://redirect.github.com/stretchr/testify/pull/1935) - change yaml library to go.yaml.in/yaml/v3 by [@​boekkooi-impossiblecloud](https://redirect.github.com/boekkooi-impossiblecloud) in [#​1772](https://redirect.github.com/stretchr/testify/pull/1772) #### New Contributors - [@​harryzcy](https://redirect.github.com/harryzcy) made their first contribution in [#​1935](https://redirect.github.com/stretchr/testify/pull/1935) - [@​boekkooi-impossiblecloud](https://redirect.github.com/boekkooi-impossiblecloud) made their first contribution in [#​1772](https://redirect.github.com/stretchr/testify/pull/1772) **Full Changelog**: #### What's Changed - Change yaml library to `go.yaml.in/yaml/v3` by [@​harryzcy](https://redirect.github.com/harryzcy) in [#​1935](https://redirect.github.com/stretchr/testify/pull/1935) - change yaml library to go.yaml.in/yaml/v3 by [@​boekkooi-impossiblecloud](https://redirect.github.com/boekkooi-impossiblecloud) in [#​1772](https://redirect.github.com/stretchr/testify/pull/1772) #### New Contributors - [@​harryzcy](https://redirect.github.com/harryzcy) made their first contribution in [#​1935](https://redirect.github.com/stretchr/testify/pull/1935) - [@​boekkooi-impossiblecloud](https://redirect.github.com/boekkooi-impossiblecloud) made their first contribution in [#​1772](https://redirect.github.com/stretchr/testify/pull/1772) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 12 ++++++------ go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/NOTICE b/NOTICE index 0211e2f82..da7c07bda 100644 --- a/NOTICE +++ b/NOTICE @@ -1241,21 +1241,21 @@ License URL: https://github.com/stretchr/objx/blob/v0.5.3/LICENSE ---------- Module: github.com/stretchr/testify -Version: v1.12.0 +Version: v1.12.1 License: MIT -License URL: https://github.com/stretchr/testify/blob/v1.12.0/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/LICENSE ---------- Module: github.com/stretchr/testify/internal/difflib -Version: v1.12.0 +Version: v1.12.1 License: BSD-3-Clause -License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/difflib/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/internal/difflib/LICENSE ---------- Module: github.com/stretchr/testify/internal/spew -Version: v1.12.0 +Version: v1.12.1 License: ISC -License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/spew/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/internal/spew/LICENSE ---------- Module: github.com/tetratelabs/wabin diff --git a/go.mod b/go.mod index 593287a96..9d3dcdd52 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 github.com/spf13/cobra v1.10.2 - github.com/stretchr/testify v1.12.0 + github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 golang.org/x/crypto v0.55.0 golang.org/x/mod v0.40.0 diff --git a/go.sum b/go.sum index 094f07b12..186bb1cd9 100644 --- a/go.sum +++ b/go.sum @@ -4881,8 +4881,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/stretchr/testify v1.12.0 h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI= -github.com/stretchr/testify v1.12.0/go.mod h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 0211e2f82..da7c07bda 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1241,21 +1241,21 @@ License URL: https://github.com/stretchr/objx/blob/v0.5.3/LICENSE ---------- Module: github.com/stretchr/testify -Version: v1.12.0 +Version: v1.12.1 License: MIT -License URL: https://github.com/stretchr/testify/blob/v1.12.0/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/LICENSE ---------- Module: github.com/stretchr/testify/internal/difflib -Version: v1.12.0 +Version: v1.12.1 License: BSD-3-Clause -License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/difflib/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/internal/difflib/LICENSE ---------- Module: github.com/stretchr/testify/internal/spew -Version: v1.12.0 +Version: v1.12.1 License: ISC -License URL: https://github.com/stretchr/testify/blob/v1.12.0/internal/spew/LICENSE +License URL: https://github.com/stretchr/testify/blob/v1.12.1/internal/spew/LICENSE ---------- Module: github.com/tetratelabs/wabin From 469acc82c6483ca30ad6d0e78642d5fb7ba24526 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:17:36 +0000 Subject: [PATCH 032/132] update(deps): update module github.com/golangci/golangci-lint/v2 to v2.13.1 (#712) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/golangci/golangci-lint/v2](https://redirect.github.com/golangci/golangci-lint) | `v2.12.2` → `v2.13.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgolangci%2fgolangci-lint%2fv2/v2.13.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgolangci%2fgolangci-lint%2fv2/v2.12.2/v2.13.1?slim=true) | --- ### Release Notes
golangci/golangci-lint (github.com/golangci/golangci-lint/v2) ### [`v2.13.1`](https://redirect.github.com/golangci/golangci-lint/blob/HEAD/CHANGELOG.md#v2131) [Compare Source](https://redirect.github.com/golangci/golangci-lint/compare/v2.13.0...v2.13.1) *Released on 2026-08-20* 1. Linters bug fixes - `ginkgolinter`: from 0.23.1 to 0.24.0 - `gofmt`: from [`d62b90e`](https://redirect.github.com/golangci/golangci-lint/commit/d62b90e6713d) to [`e84e050`](https://redirect.github.com/golangci/golangci-lint/commit/e84e05053792) - `staticcheck`: from 0.8.0-rc.1 to 0.8.0 - `wsl_v5`: from 5.8.0 to 5.9.0 ### [`v2.13.0`](https://redirect.github.com/golangci/golangci-lint/blob/HEAD/CHANGELOG.md#v2130) [Compare Source](https://redirect.github.com/golangci/golangci-lint/compare/v2.12.2...v2.13.0) *Released on 2026-08-19* 1. Enhancements - 🎉 go1.27 support 2. Bug fixes - fix: cache package facts 3. Linters new features or changes - `dupword`: from 0.1.7 to 0.1.8 (new option `skip-raw-strings`) - `errcheck`: from 1.10.0 to 1.20.0 - `exhaustruct_v5`: from 4.0.0 to 5.0.2 (new configuration) - `exhaustruct`: deprecated and replaced by `exhaustruct_v5` - `fatcontext`: from 0.9.0 to 0.10.0 (new options: `check-loops`, `check-function-literals`) - `goconst`: from 1.10.0 to 1.11.0 (new options: `ignore-map-keys`, `exclude-types`) - `gofumpt`: from 0.9.2 to 0.11.0 (new options: `extra.group-params`, `extra.clothe-returns`, `extra.balance-calls`) - `gomoddirectives`: from 0.8.0 to 0.9.0 (new option: `replace-allow-all`) - `gosec`: from 2.26.1 to 2.27.1 - `govet-modernize`: from 0.44.0 to 0.49.0 (`fmtappendf` is removed. New analyzers `atomictypes`, `embedlit`, `errorsastype`, `importcomment`, `reflecttypeassert`, `slicesclip`, and `slicesbackward`. `waitgroup` is renamed `waitgroupgo`) - `iface`: from 1.4.3 to 1.5.0 (new analyzer: `unusedmethod`) - `noinlineerr`: from 1.0.5 to 1.0.6 - `nonamedreturns`: from 1.0.6 to 1.0.8 (new option: `allow-unused-named-returns`) - `recvcheck`: from 0.2.0 to 0.3.0 (new default exclusions) types\` - `unparam`: from [`2dd26e2`](https://redirect.github.com/golangci/golangci-lint/commit/2dd26e23affb) to [`2dd26e2`](https://redirect.github.com/golangci/golangci-lint/commit/2dd26e23affb) 4. Linters bug fixes - `clickhouse-go-linter`: from 1.2.0 to 1.2.1 - `errname`: from 1.1.1 to 1.1.2 - `exhaustruct`: from 5.0.2 to 5.0.3 - `funcorder`: add missing `Function` field - `ginkgolinter`: from 0.23.0 to 0.23.1 - `gocheckcompilerdirectives`: from 1.3.0 to 1.4.0 - `gocritic`: from 0.14.3 to 0.14.4 - `gomoddirectives`: add missing `IgnoreForbidden` field - `iface`: from 1.4.2 to 1.4.3 - `mirror`: from 1.3.0 to 1.3.3 - `nilnil`: from 1.1.1 to 1.1.2 - `protogetter`: from 0.3.20 to 0.3.21
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++-- go.mod | 49 +++++++++++----------- go.sum | 98 ++++++++++++++++++++++---------------------- internal/tmpl/NOTICE | 8 ++-- 4 files changed, 83 insertions(+), 80 deletions(-) diff --git a/NOTICE b/NOTICE index da7c07bda..44bec96c4 100644 --- a/NOTICE +++ b/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/ryanuber/go-glob/blob/v1.0.0/LICENSE ---------- Module: github.com/santhosh-tekuri/jsonschema/v6 -Version: v6.0.2 +Version: v6.0.3 License: Apache-2.0 -License URL: https://github.com/santhosh-tekuri/jsonschema/blob/v6.0.2/LICENSE +License URL: https://github.com/santhosh-tekuri/jsonschema/blob/v6.0.3/LICENSE ---------- Module: github.com/sergi/go-diff/diffmatchpatch @@ -1205,9 +1205,9 @@ License URL: https://github.com/shopspring/decimal/blob/v1.4.0/LICENSE ---------- Module: github.com/sirupsen/logrus -Version: v1.9.4 +Version: v1.10.1 License: MIT -License URL: https://github.com/sirupsen/logrus/blob/v1.9.4/LICENSE +License URL: https://github.com/sirupsen/logrus/blob/v1.10.1/LICENSE ---------- Module: github.com/skeema/knownhosts diff --git a/go.mod b/go.mod index 9d3dcdd52..4692a2d4c 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( 4d63.com/gochecknoglobals v0.2.2 // indirect al.essio.dev/pkg/shellescape v1.6.0 // indirect cel.dev/expr v0.25.2 // indirect - charm.land/lipgloss/v2 v2.0.5 // indirect + charm.land/lipgloss/v2 v2.0.6 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth v0.23.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -92,7 +92,7 @@ require ( github.com/Abirdcfly/dupword v0.1.8 // indirect github.com/AdminBenni/iota-mixing v1.0.0 // indirect github.com/AlekSi/pointer v1.2.0 // indirect - github.com/AlwxSin/noinlineerr v1.0.5 // indirect + github.com/AlwxSin/noinlineerr v1.0.6 // indirect github.com/Antonboom/errname v1.1.2 // indirect github.com/Antonboom/nilnil v1.1.2 // indirect github.com/Antonboom/testifylint v1.6.4 // indirect @@ -125,7 +125,7 @@ require ( github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect github.com/ProtonMail/go-crypto v1.4.1 // indirect github.com/agnivade/levenshtein v1.2.1 // indirect - github.com/alecthomas/chroma/v2 v2.26.1 // indirect + github.com/alecthomas/chroma/v2 v2.27.0 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect github.com/alexkohler/nakedret/v2 v2.0.6 // indirect github.com/alexkohler/prealloc v1.1.0 // indirect @@ -171,7 +171,7 @@ require ( github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bluesky-social/indigo v0.0.0-20260611225325-2e8287f2f1bb // indirect github.com/bombsimon/wsl/v4 v4.7.0 // indirect - github.com/bombsimon/wsl/v5 v5.8.0 // indirect + github.com/bombsimon/wsl/v5 v5.9.0 // indirect github.com/breml/bidichk v0.3.3 // indirect github.com/breml/errchkjson v0.4.1 // indirect github.com/brunoga/deep v1.3.1 // indirect @@ -191,8 +191,8 @@ require ( github.com/charithe/durationcheck v0.0.11 // indirect github.com/charmbracelet/colorprofile v0.4.3 // indirect github.com/charmbracelet/fang v1.0.0 // indirect - github.com/charmbracelet/ultraviolet v0.0.0-20260615092913-2399af76d5b1 // indirect - github.com/charmbracelet/x/ansi v0.11.7 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886 // indirect + github.com/charmbracelet/x/ansi v0.11.8 // indirect github.com/charmbracelet/x/exp/charmtone v0.0.0-20260615092313-b57e5e6d29bb // indirect github.com/charmbracelet/x/term v0.2.2 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect @@ -233,13 +233,13 @@ require ( github.com/fatih/structs v1.1.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect - github.com/firefart/nonamedreturns v1.0.7 // indirect + github.com/firefart/nonamedreturns v1.0.8 // indirect github.com/fsnotify/fsnotify v1.10.1 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/ghostiam/protogetter v0.3.21 // indirect github.com/github/smimesign v0.2.0 // indirect - github.com/go-critic/go-critic v0.14.3 // indirect + github.com/go-critic/go-critic v0.14.4 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.9.1 // indirect @@ -287,7 +287,7 @@ require ( github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect - github.com/golangci/golangci-lint/v2 v2.12.2 // indirect + github.com/golangci/golangci-lint/v2 v2.13.1 // indirect github.com/golangci/golines v0.15.0 // indirect github.com/golangci/misspell v0.8.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect @@ -342,7 +342,7 @@ require ( github.com/ipfs/go-metrics-interface v0.3.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jedisct1/go-minisign v0.0.0-20260527172527-a09352b57a22 // indirect - github.com/jgautheron/goconst v1.10.2 // indirect + github.com/jgautheron/goconst v1.11.0 // indirect github.com/jjti/go-spancheck v0.6.5 // indirect github.com/julz/importas v0.2.0 // indirect github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect @@ -371,7 +371,7 @@ require ( github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect - github.com/lucasb-eyer/go-colorful v1.4.0 // indirect + github.com/lucasb-eyer/go-colorful v1.4.1 // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect github.com/manuelarte/funcorder v0.6.0 // indirect @@ -405,12 +405,12 @@ require ( github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.23.0 // indirect + github.com/nunnatsa/ginkgolinter v0.24.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.3.1 // indirect + github.com/pelletier/go-toml/v2 v2.4.3 // indirect github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect @@ -430,13 +430,13 @@ require ( github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect github.com/sassoftware/relic v7.2.1+incompatible // indirect github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e // indirect github.com/secure-systems-lab/go-securesystemslib v0.11.0 // indirect - github.com/securego/gosec/v2 v2.27.1 // indirect + github.com/securego/gosec/v2 v2.28.0 // indirect github.com/sergi/go-diff v1.4.0 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect @@ -446,7 +446,7 @@ require ( github.com/sigstore/sigstore v1.10.8 // indirect github.com/sigstore/sigstore-go v1.2.1 // indirect github.com/sigstore/timestamp-authority/v2 v2.1.2 // indirect - github.com/sirupsen/logrus v1.9.4 // indirect + github.com/sirupsen/logrus v1.10.1 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/skeema/knownhosts v1.3.2 // indirect github.com/slack-go/slack v0.27.0 // indirect @@ -492,7 +492,7 @@ require ( go-simpler.org/musttag v0.14.0 // indirect go-simpler.org/sloglint v0.12.0 // indirect go.augendre.info/arangolint v0.4.0 // indirect - go.augendre.info/fatcontext v0.9.0 // indirect + go.augendre.info/fatcontext v0.10.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect @@ -508,7 +508,7 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect gocloud.dev v0.46.0 // indirect golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect - golang.org/x/exp/typeparams v0.0.0-20260611194520-c48552f49976 // indirect + golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto v0.0.0-20260720171339-e059f2f05d78 // indirect @@ -518,10 +518,10 @@ require ( gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/validator.v2 v2.0.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - honnef.co/go/tools v0.7.0 // indirect + honnef.co/go/tools v0.8.0 // indirect lukechampine.com/blake3 v1.4.1 // indirect - mvdan.cc/gofumpt v0.10.0 // indirect - mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect + mvdan.cc/gofumpt v0.11.0 // indirect + mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 // indirect sigs.k8s.io/kind v0.32.0 // indirect sigs.k8s.io/yaml v1.6.0 software.sslmate.com/src/go-pkcs12 v0.7.3 // indirect @@ -529,6 +529,7 @@ require ( require ( cyphar.com/go-pathrs v0.2.2 // indirect + dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect filippo.io/edwards25519 v1.2.0 // indirect filippo.io/hpke v0.4.0 // indirect github.com/ClickHouse/clickhouse-go-linter v1.2.1 // indirect @@ -571,7 +572,7 @@ require ( github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect github.com/go-redis/cache/v9 v9.0.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect + github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect github.com/golangci/rowserrcheck v0.0.0-20260602201336-0ec5bd2741d7 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.7.1 // indirect @@ -583,7 +584,7 @@ require ( github.com/google/go-licenses/v2 v2.0.1 // indirect github.com/google/go-querystring v1.2.0 // indirect github.com/google/licenseclassifier/v2 v2.0.0 // indirect - github.com/google/pprof v0.0.0-20260604005048-7023385849c0 // indirect + github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/goreleaser/go-shellwords v1.0.13 // indirect github.com/gosuri/uitable v0.0.4 // indirect @@ -630,7 +631,7 @@ require ( github.com/prometheus/common v0.70.1 // indirect github.com/redis/go-redis/v9 v9.20.1 // indirect github.com/robfig/cron/v3 v3.0.2-0.20210106135023-bc59245fe10e // indirect - github.com/rogpeppe/go-internal v1.15.0 // indirect + github.com/rogpeppe/go-internal v1.16.0 // indirect github.com/rubenv/sql-migrate v1.8.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect diff --git a/go.sum b/go.sum index 186bb1cd9..92059a05e 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= -charm.land/lipgloss/v2 v2.0.5 h1:kbNxgeeUOYv5J0YdpxFjfvf3dFvqH8Aci4zB6xqFtrY= -charm.land/lipgloss/v2 v2.0.5/go.mod h1:9oqhxt4yxIMe6q5A4kHr44DremZk7J9UNh74GlWa5nc= +charm.land/lipgloss/v2 v2.0.6 h1:EaGKeuA8FvF+v2BT5VmZd2LoYLaMZJXA5n34th8nCIQ= +charm.land/lipgloss/v2 v2.0.6/go.mod h1:ipDDJNSGa1hlwDtSfW1s2/xR8Vdhbut4PXh2zEKZd0Q= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -2659,6 +2659,8 @@ dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= +dev.gaijin.team/go/exhaustruct/v5 v5.0.3 h1:yOeA7DNjlT8y4yfmN6nWWYYggA13N523YAj9/TXbuTM= +dev.gaijin.team/go/exhaustruct/v5 v5.0.3/go.mod h1:KwtBsX8nHHH1YxhxkpiBq6bfsmw5WnazWpNvJPHgY9Y= dev.gaijin.team/go/golib v0.8.1 h1:JYju4x9BSo+QD/AYeHULVDcvEhiFg8wOi6pT0IaZF5E= dev.gaijin.team/go/golib v0.8.1/go.mod h1:c5fu7t1RSGMxSQgcUYO1sODbzsYnOCXJLmHeNG1Eb+0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -2703,8 +2705,8 @@ github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCg github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= -github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= -github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= +github.com/AlwxSin/noinlineerr v1.0.6 h1:KAvuxunTe9QxvqrFB7nZTdb/7Wzas4AvifslTnG0Ld8= +github.com/AlwxSin/noinlineerr v1.0.6/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= github.com/Antonboom/errname v1.1.2 h1:dxwONZJua3VB8Xh/VaCjqAcqF645sWWv7xj26zy7tdQ= github.com/Antonboom/errname v1.1.2/go.mod h1:YeZIpgLMxT+SNkruGgYkLhzq/9vs3fsolTZegKaKDZI= github.com/Antonboom/nilnil v1.1.2 h1:aNlFuJhaEseXe4fHO3xbjXlSeEiQVYa2lEkWD2s2hAY= @@ -2864,8 +2866,8 @@ github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhk github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.26.1 h1:2X21EdxGZNv5GF9mG5u+uzc02GCFyGxbcBm3Grd9A78= -github.com/alecthomas/chroma/v2 v2.26.1/go.mod h1:lxhRRa9H4hPmRLOOdYga4zkQIQjq3dtrrdwQeCfu78Y= +github.com/alecthomas/chroma/v2 v2.27.0 h1:FodwmyOBgJULFYmDqibcp9pvfDLWdtPRh9v/r5BXYZs= +github.com/alecthomas/chroma/v2 v2.27.0/go.mod h1:NjJ3ciIgrqBNeIkWZ4e46nseoLDslxU1LmfCoL+wcY8= github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= @@ -3067,8 +3069,8 @@ github.com/bombsimon/logrusr/v4 v4.1.0 h1:uZNPbwusB0eUXlO8hIUwStE6Lr5bLN6IgYgG+7 github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= -github.com/bombsimon/wsl/v5 v5.8.0 h1:JTkyfs4yl8SPejrCF2GdABXE+mO1WvM7iUYzRWlsxDs= -github.com/bombsimon/wsl/v5 v5.8.0/go.mod h1:AbOLsulgkqP4ZnitHf9gwPtCOGlrzkk0jb0uNxRSY0o= +github.com/bombsimon/wsl/v5 v5.9.0 h1:WCrgZ7RQnZO5oEwbVTlYgBdU3wL294kR1BSWV8vTfsU= +github.com/bombsimon/wsl/v5 v5.9.0/go.mod h1:kjo4HiAV5FDkHC8/uzJq9mBffEEd6WT/nvN7DoMovDM= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradleyfalzon/ghinstallation/v2 v2.19.0 h1:KQfD+43pRw9NUJhGycGrFr9vF1MubZacksKol1gomFI= @@ -3144,10 +3146,10 @@ github.com/charmbracelet/fang v1.0.0 h1:jESBY40agJOlLYnnv9jE0mLqDGTxEk0hkOnx7YGy github.com/charmbracelet/fang v1.0.0/go.mod h1:P5/DNb9DddQ0Z0dbc0P3ol4/ix5Po7Ofr2KMBfAqoCo= github.com/charmbracelet/keygen v0.5.4 h1:XQYgf6UEaTGgQSSmiPpIQ78WfseNQp4Pz8N/c1OsrdA= github.com/charmbracelet/keygen v0.5.4/go.mod h1:t4oBRr41bvK7FaJsAaAQhhkUuHslzFXVjOBwA55CZNM= -github.com/charmbracelet/ultraviolet v0.0.0-20260615092913-2399af76d5b1 h1:4+r3uOJ69ueRBt4okgEfWZeXs3BD36HcDBmOIAUlETk= -github.com/charmbracelet/ultraviolet v0.0.0-20260615092913-2399af76d5b1/go.mod h1:f/jRa757WUmaOZrbPspXymbg/GnbF+rwe4OLsG7aXYo= -github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI= -github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ= +github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886 h1:rdnVWKgJpTVXKuKuJyxDJ+NFJdUaUqGvyGy61OcvlbA= +github.com/charmbracelet/ultraviolet v0.0.0-20260811164956-006e29f97886/go.mod h1:nAw0d9PhFp1qdzi2xhQU5YOu5sVpDIHWlaW2Uz/bCro= +github.com/charmbracelet/x/ansi v0.11.8 h1:JMFwp0CgDC2+jcOB162HH5k7I3FVbgFSMMYg7dSPBQQ= +github.com/charmbracelet/x/ansi v0.11.8/go.mod h1:ZNN+3mXny/516oTQPLMPIBeSINvNJJQ8uQXDgbeJxY0= github.com/charmbracelet/x/exp/charmtone v0.0.0-20260615092313-b57e5e6d29bb h1:hoqNT54vrpXamSaQe5GxupakGgvvqFmVgmLJjotpHco= github.com/charmbracelet/x/exp/charmtone v0.0.0-20260615092313-b57e5e6d29bb/go.mod h1:nsExn0DGyX0lh9LwLHTn2Gg+hafdzfSXnC+QmEJTZFY= github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA= @@ -3413,8 +3415,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= -github.com/firefart/nonamedreturns v1.0.7 h1:gIrbIri68tN9rneOoWzBTA4B+rh5qP5Yq0yILeQwSfo= -github.com/firefart/nonamedreturns v1.0.7/go.mod h1:Kj/SHlG7im9GjmGfGBij361DJmPhOXZhydgHeJT1Xt4= +github.com/firefart/nonamedreturns v1.0.8 h1:iB32Dl17zJl1zlVEj/WlUWgx0HiRyQ85OUw1WHa4/II= +github.com/firefart/nonamedreturns v1.0.8/go.mod h1:vxFNvm5AfP/8rgAKFzYmnqx0yp1HjrYsErZ9pHPTznA= github.com/fluxcd/cli-utils v1.2.1 h1:ug9CicKW7H9QXnvNDapTSKuryZvWcu4Nw7pRvQa6jDY= github.com/fluxcd/cli-utils v1.2.1/go.mod h1:cky6M6eHvTQkoPtsuFYLIgAMYdpTCSLoor4IA6vueSw= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -3456,8 +3458,8 @@ github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-chi/chi/v5 v5.3.0 h1:halUjDxhshgXHMrao5bB8eNBXo/rnzwr8m5m36glehM= github.com/go-chi/chi/v5 v5.3.0/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto= -github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= -github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= +github.com/go-critic/go-critic v0.14.4 h1:dSX4C3pWSeuMVxvQh6yG8U0ReSf3YOmKi4nwX5q7n/8= +github.com/go-critic/go-critic v0.14.4/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= @@ -3745,10 +3747,10 @@ github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 h1:CbTB8KpqnViI6lIXx github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= -github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= -github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint/v2 v2.12.2 h1:7+d1uY0bq1MU2UV3R5pW5Q7QWdcoq4naMRXM+gsJKrs= -github.com/golangci/golangci-lint/v2 v2.12.2/go.mod h1:opqHHuIcTG2R+4akzWMd4o1BnD9/1LcjICWOujr91U8= +github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 h1:WL8YKrt3UbOBqSRU7GpP5BTtQTMWtVtj+mfPijgZeIg= +github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792/go.mod h1:te5hX0dW4C5r6YbXs+6ysNr8Q5UTmdIqGbb+mlFiYmA= +github.com/golangci/golangci-lint/v2 v2.13.1 h1:RuM4OcluM4xFQcGuRE6R7jA33pqxK/W1EsBxpugdZjg= +github.com/golangci/golangci-lint/v2 v2.13.1/go.mod h1:HwX7mDzqHbcSxlhrTygjX1GJbAfQ3sJAqOx41qQlhDE= github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= @@ -3854,8 +3856,8 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/pprof v0.0.0-20260604005048-7023385849c0 h1:h1QTMDl6q9wDvDCJVpKQSjgleGFYnd2fOxmg2K+6BGE= -github.com/google/pprof v0.0.0-20260604005048-7023385849c0/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= +github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0 h1:du0WGc8xSKq/++e0cglxhS/mXVqsR7+c7jLEi5Vqduw= +github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/rpmpack v0.7.1 h1:YdWh1IpzOjBz60Wvdw0TU0A5NWP+JTVHA5poDqwMO2o= github.com/google/rpmpack v0.7.1/go.mod h1:h1JL16sUTWCLI/c39ox1rDaTBo3BXUQGjczVJyK4toU= @@ -4141,8 +4143,8 @@ github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jezek/xgb v1.0.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/jgautheron/goconst v1.10.2 h1:0wFg/DbpYB0ChoP94qUM+SuQpqj5oCzPEqAil5dV8Pg= -github.com/jgautheron/goconst v1.10.2/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= +github.com/jgautheron/goconst v1.11.0 h1:KgN90z5qXt5f0Uzf3cWXev3hfMMFUyNeKdpkSBRvLDk= +github.com/jgautheron/goconst v1.11.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -4292,8 +4294,8 @@ github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffkt github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5nwm/V115vj2YXfhS0w= github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w= -github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= -github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.4.1 h1:1EO+WB73+EH8EVbzlrG3KLAfEypQWVHIBqlTf+2hNss= +github.com/lucasb-eyer/go-colorful v1.4.1/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -4460,8 +4462,8 @@ github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhK github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8= -github.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4= +github.com/nunnatsa/ginkgolinter v0.24.0 h1:Mp0EagluLFP98JatP6nqp/gGEoljNG97uf9AcxcBVy8= +github.com/nunnatsa/ginkgolinter v0.24.0/go.mod h1:2ZMRuzX6+3XXyY6UZOwb6n+MCocVGbkIsDBC4vuWz5c= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= @@ -4548,8 +4550,8 @@ github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7olPtrEc= -github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pelletier/go-toml/v2 v2.4.3 h1:GTRvJQutkOSftxIFD5xw9aepkYNuPWmVJpffdDPYVpY= +github.com/pelletier/go-toml/v2 v2.4.3/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -4709,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc= -github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= +github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= +github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb h1:ilJU0rG79oX3QqiYM/vl6yW9Bl/e20G9MnNhvL4kMXU= github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= @@ -4743,8 +4745,8 @@ github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 h1:1EYB5IzjZawrrnELUi78f9fPu57HuXjmddZPjrls/28= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.3/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= @@ -4760,8 +4762,8 @@ github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e/go.mod h1:DkpGd7 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.11.0 h1:iuCR9kcMFD4QurdKrGvPLoKZLv9YvwPYVr0473BdtFs= github.com/secure-systems-lab/go-securesystemslib v0.11.0/go.mod h1:+PMOTjUGwHj2vcZ+TFKlb1tXRbrdWE1LYDT5i9JC80Q= -github.com/securego/gosec/v2 v2.27.1 h1:bg4lZnpCCpC8e5l0K+ADF5gG91jmT2LQgOcOflwBfJI= -github.com/securego/gosec/v2 v2.27.1/go.mod h1:lbgwsogcxq9aoN62Bk/vcdWwemFjlT5NPF/D/dH4+Ho= +github.com/securego/gosec/v2 v2.28.0 h1:ZsSdiDb0AtTpLFVol5z91gbMei9ZiLEPG/pZjZujp7c= +github.com/securego/gosec/v2 v2.28.0/go.mod h1:lb4/9AHe+lJy/kjWmWRWWsEipvbwGKuxf+tY1Pmjdnk= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= @@ -4799,8 +4801,8 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= -github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/sirupsen/logrus v1.10.1 h1:xi4336Zh11WpU14fXR6I67V3yaTPQYwRx2WEtHbRg4Q= +github.com/sirupsen/logrus v1.10.1/go.mod h1:vsQHnG7xzNsxk3NrwboUiWPnIC3dmbjcGPykD7+tiHk= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= @@ -5038,8 +5040,8 @@ go-simpler.org/sloglint v0.12.0 h1:UzWDlLWNE5FLqsvyq3tWYHuQMbqrervOhT8qPl4Mmw4= go-simpler.org/sloglint v0.12.0/go.mod h1:jBjjC2bm8rYrs88oTRlFX497kWjJsyZWYoNaXkGRI6I= go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50= go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA= -go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE= -go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw= +go.augendre.info/fatcontext v0.10.0 h1:HhFopmivh8U1+AU7f0kuwUeg2eiIns7YsGQOMHwSJ90= +go.augendre.info/fatcontext v0.10.0/go.mod h1:pqpGvA9GlrXy+aXkp8L2dKz12Zp4g2FhzcAtwToU+2w= go.digitalxero.dev/go-msix v0.3.1 h1:V5E8PuFkA3Fr3VFYX6pTUutriogYC9sgxIWhzf9sSKw= go.digitalxero.dev/go-msix v0.3.1/go.mod h1:QbUpFs0AUd1zk7e9fy17suiqEAF90TR3jZY+LCI2K+c= go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= @@ -5404,8 +5406,8 @@ golang.org/x/exp/shiny v0.0.0-20240707233637-46b078467d37/go.mod h1:3F+MieQB7dRY golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20260611194520-c48552f49976 h1:GTD/WuaexTazIG/SxLOz4rEKZPDVilmVVC2nz4xhwfE= -golang.org/x/exp/typeparams v0.0.0-20260611194520-c48552f49976/go.mod h1:PqrXSW65cXDZH0k4IeUbhmg/bcAZDbzNz3byBpKCsXo= +golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f h1:+lI8cDJ4uceLipg2f1ODay7fEuLkk0BIHXd6PB8icxo= +golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f/go.mod h1:PqrXSW65cXDZH0k4IeUbhmg/bcAZDbzNz3byBpKCsXo= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -6835,8 +6837,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= -honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= +honnef.co/go/tools v0.8.0 h1:UacpzPr7D6i5BAjTkA7sNVcx4kIbhAZcQ4zYtKiXx68= +honnef.co/go/tools v0.8.0/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= @@ -6953,10 +6955,10 @@ modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= -mvdan.cc/gofumpt v0.10.0 h1:yGGpRS2pBN2OQIi7b21IXknJna7faPkFaVfHLrN6Euo= -mvdan.cc/gofumpt v0.10.0/go.mod h1:sU2ElXHzOEmvoPqfutYG7uunlueR4K2T1JFml40SzP4= -mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= -mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= +mvdan.cc/gofumpt v0.11.0 h1:0H01XB95PnN2QgCSR9ELdZyTlJqNZ7181B0BTMh5VZc= +mvdan.cc/gofumpt v0.11.0/go.mod h1:BeT5wCsOJt6J9zT2MZIOGszjUHzFkn1/l9g6xAzqsXo= +mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 h1:dEE6li4OPIE54oojY2qaayFS1fSp17G14si0gXRxl0U= +mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673/go.mod h1:62roFV3D3nYOWIXv3PfGO4UYEKAotz2WgLywT87ONd8= oras.land/oras-go/v2 v2.6.2 h1:N04RXngAp1LJKTG6ifz3xHPipasEkWr+hFmInja5YKo= oras.land/oras-go/v2 v2.6.2/go.mod h1:PlTtg4JTDJkDe8yVHpM2wz7/YDc00GVas+i4jAW2TZ4= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index da7c07bda..44bec96c4 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/ryanuber/go-glob/blob/v1.0.0/LICENSE ---------- Module: github.com/santhosh-tekuri/jsonschema/v6 -Version: v6.0.2 +Version: v6.0.3 License: Apache-2.0 -License URL: https://github.com/santhosh-tekuri/jsonschema/blob/v6.0.2/LICENSE +License URL: https://github.com/santhosh-tekuri/jsonschema/blob/v6.0.3/LICENSE ---------- Module: github.com/sergi/go-diff/diffmatchpatch @@ -1205,9 +1205,9 @@ License URL: https://github.com/shopspring/decimal/blob/v1.4.0/LICENSE ---------- Module: github.com/sirupsen/logrus -Version: v1.9.4 +Version: v1.10.1 License: MIT -License URL: https://github.com/sirupsen/logrus/blob/v1.9.4/LICENSE +License URL: https://github.com/sirupsen/logrus/blob/v1.10.1/LICENSE ---------- Module: github.com/skeema/knownhosts From c44b88a51b175f6923e40b18a117d29acaaa22f2 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 20:14:05 +0000 Subject: [PATCH 033/132] update(deps): update module k8s.io/cri-streaming to v0.36.4 (#715) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/cri-streaming](https://redirect.github.com/kubernetes/cri-streaming) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcri-streaming/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcri-streaming/v0.36.3/v0.36.4?slim=true) | --- ### Release Notes
kubernetes/cri-streaming (k8s.io/cri-streaming) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cri-streaming/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cri-streaming/compare/v0.36.3...v0.36.4)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 4692a2d4c..f572c883e 100644 --- a/go.mod +++ b/go.mod @@ -726,6 +726,6 @@ replace ( k8s.io/sample-controller => k8s.io/sample-controller v0.36.3 ) -replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.3 +replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.4 replace k8s.io/streaming => k8s.io/streaming v0.36.3 From 05c07e158dc6eb85ddf06bb3aa898bd7670bba89 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:06:08 +0000 Subject: [PATCH 034/132] update(deps): update github.com/rook/rook/pkg/apis digest to 4a0761f (#717) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `90af774` → `4a0761f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 44bec96c4..fe2877094 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260819181914-90af774465eb +Version: v0.0.0-20260820190521-4a0761f0c8d9 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/90af774465eb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/4a0761f0c8d9/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index f572c883e..de8b3d7aa 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb + github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9 ) require ( diff --git a/go.sum b/go.sum index 92059a05e..1f9e3ae84 100644 --- a/go.sum +++ b/go.sum @@ -4713,8 +4713,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb h1:ilJU0rG79oX3QqiYM/vl6yW9Bl/e20G9MnNhvL4kMXU= -github.com/rook/rook/pkg/apis v0.0.0-20260819181914-90af774465eb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9 h1:Tua19HJOWaTSs1Ye/C/0RK41OEMQ6YbqLEc+ZFhBq78= +github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 44bec96c4..fe2877094 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260819181914-90af774465eb +Version: v0.0.0-20260820190521-4a0761f0c8d9 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/90af774465eb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/4a0761f0c8d9/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 6feeb12202ef4074943fc7ec05d8b8212750fc3e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 22:06:11 +0000 Subject: [PATCH 035/132] update(deps): update kubernetes monorepo to v0.36.4 (#714) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/api](https://redirect.github.com/kubernetes/api) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fapi/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fapi/v0.36.3/v0.36.4?slim=true) | | [k8s.io/apiextensions-apiserver](https://redirect.github.com/kubernetes/apiextensions-apiserver) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fapiextensions-apiserver/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fapiextensions-apiserver/v0.36.3/v0.36.4?slim=true) | | [k8s.io/apimachinery](https://redirect.github.com/kubernetes/apimachinery) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fapimachinery/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fapimachinery/v0.36.3/v0.36.4?slim=true) | | [k8s.io/apiserver](https://redirect.github.com/kubernetes/apiserver) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fapiserver/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fapiserver/v0.36.3/v0.36.4?slim=true) | | [k8s.io/cli-runtime](https://redirect.github.com/kubernetes/cli-runtime) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcli-runtime/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcli-runtime/v0.36.3/v0.36.4?slim=true) | | [k8s.io/client-go](https://redirect.github.com/kubernetes/client-go) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fclient-go/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fclient-go/v0.36.3/v0.36.4?slim=true) | | [k8s.io/cloud-provider](https://redirect.github.com/kubernetes/cloud-provider) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcloud-provider/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcloud-provider/v0.36.3/v0.36.4?slim=true) | | [k8s.io/cluster-bootstrap](https://redirect.github.com/kubernetes/cluster-bootstrap) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcluster-bootstrap/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcluster-bootstrap/v0.36.3/v0.36.4?slim=true) | | [k8s.io/code-generator](https://redirect.github.com/kubernetes/code-generator) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcode-generator/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcode-generator/v0.36.3/v0.36.4?slim=true) | | [k8s.io/component-base](https://redirect.github.com/kubernetes/component-base) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcomponent-base/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcomponent-base/v0.36.3/v0.36.4?slim=true) | | [k8s.io/component-helpers](https://redirect.github.com/kubernetes/component-helpers) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcomponent-helpers/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcomponent-helpers/v0.36.3/v0.36.4?slim=true) | | [k8s.io/controller-manager](https://redirect.github.com/kubernetes/controller-manager) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcontroller-manager/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcontroller-manager/v0.36.3/v0.36.4?slim=true) | | [k8s.io/cri-api](https://redirect.github.com/kubernetes/cri-api) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcri-api/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcri-api/v0.36.3/v0.36.4?slim=true) | | [k8s.io/cri-client](https://redirect.github.com/kubernetes/cri-client) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcri-client/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcri-client/v0.36.3/v0.36.4?slim=true) | | [k8s.io/csi-translation-lib](https://redirect.github.com/kubernetes/csi-translation-lib) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcsi-translation-lib/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcsi-translation-lib/v0.36.3/v0.36.4?slim=true) | | [k8s.io/dynamic-resource-allocation](https://redirect.github.com/kubernetes/dynamic-resource-allocation) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fdynamic-resource-allocation/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fdynamic-resource-allocation/v0.36.3/v0.36.4?slim=true) | | [k8s.io/endpointslice](https://redirect.github.com/kubernetes/endpointslice) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fendpointslice/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fendpointslice/v0.36.3/v0.36.4?slim=true) | | [k8s.io/externaljwt](https://redirect.github.com/kubernetes/externaljwt) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fexternaljwt/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fexternaljwt/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kms](https://redirect.github.com/kubernetes/kms) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkms/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkms/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kube-aggregator](https://redirect.github.com/kubernetes/kube-aggregator) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkube-aggregator/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkube-aggregator/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kube-controller-manager](https://redirect.github.com/kubernetes/kube-controller-manager) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkube-controller-manager/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkube-controller-manager/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kube-proxy](https://redirect.github.com/kubernetes/kube-proxy) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkube-proxy/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkube-proxy/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kube-scheduler](https://redirect.github.com/kubernetes/kube-scheduler) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkube-scheduler/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkube-scheduler/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kubectl](https://redirect.github.com/kubernetes/kubectl) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkubectl/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkubectl/v0.36.3/v0.36.4?slim=true) | | [k8s.io/kubelet](https://redirect.github.com/kubernetes/kubelet) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkubelet/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkubelet/v0.36.3/v0.36.4?slim=true) | | [k8s.io/metrics](https://redirect.github.com/kubernetes/metrics) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fmetrics/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fmetrics/v0.36.3/v0.36.4?slim=true) | | [k8s.io/mount-utils](https://redirect.github.com/kubernetes/mount-utils) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fmount-utils/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fmount-utils/v0.36.3/v0.36.4?slim=true) | | [k8s.io/pod-security-admission](https://redirect.github.com/kubernetes/pod-security-admission) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fpod-security-admission/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fpod-security-admission/v0.36.3/v0.36.4?slim=true) | | [k8s.io/sample-apiserver](https://redirect.github.com/kubernetes/sample-apiserver) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fsample-apiserver/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fsample-apiserver/v0.36.3/v0.36.4?slim=true) | | [k8s.io/sample-cli-plugin](https://redirect.github.com/kubernetes/sample-cli-plugin) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fsample-cli-plugin/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fsample-cli-plugin/v0.36.3/v0.36.4?slim=true) | | [k8s.io/sample-controller](https://redirect.github.com/kubernetes/sample-controller) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fsample-controller/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fsample-controller/v0.36.3/v0.36.4?slim=true) | --- ### Release Notes
kubernetes/api (k8s.io/api) ### [`v0.36.4`](https://redirect.github.com/kubernetes/api/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/api/compare/v0.36.3...v0.36.4)
kubernetes/apiextensions-apiserver (k8s.io/apiextensions-apiserver) ### [`v0.36.4`](https://redirect.github.com/kubernetes/apiextensions-apiserver/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/apiextensions-apiserver/compare/v0.36.3...v0.36.4)
kubernetes/apimachinery (k8s.io/apimachinery) ### [`v0.36.4`](https://redirect.github.com/kubernetes/apimachinery/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/apimachinery/compare/v0.36.3...v0.36.4)
kubernetes/apiserver (k8s.io/apiserver) ### [`v0.36.4`](https://redirect.github.com/kubernetes/apiserver/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/apiserver/compare/v0.36.3...v0.36.4)
kubernetes/cli-runtime (k8s.io/cli-runtime) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cli-runtime/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cli-runtime/compare/v0.36.3...v0.36.4)
kubernetes/client-go (k8s.io/client-go) ### [`v0.36.4`](https://redirect.github.com/kubernetes/client-go/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/client-go/compare/v0.36.3...v0.36.4)
kubernetes/cloud-provider (k8s.io/cloud-provider) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cloud-provider/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cloud-provider/compare/v0.36.3...v0.36.4)
kubernetes/cluster-bootstrap (k8s.io/cluster-bootstrap) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cluster-bootstrap/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cluster-bootstrap/compare/v0.36.3...v0.36.4)
kubernetes/code-generator (k8s.io/code-generator) ### [`v0.36.4`](https://redirect.github.com/kubernetes/code-generator/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/code-generator/compare/v0.36.3...v0.36.4)
kubernetes/component-base (k8s.io/component-base) ### [`v0.36.4`](https://redirect.github.com/kubernetes/component-base/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/component-base/compare/v0.36.3...v0.36.4)
kubernetes/component-helpers (k8s.io/component-helpers) ### [`v0.36.4`](https://redirect.github.com/kubernetes/component-helpers/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/component-helpers/compare/v0.36.3...v0.36.4)
kubernetes/controller-manager (k8s.io/controller-manager) ### [`v0.36.4`](https://redirect.github.com/kubernetes/controller-manager/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/controller-manager/compare/v0.36.3...v0.36.4)
kubernetes/cri-api (k8s.io/cri-api) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cri-api/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cri-api/compare/v0.36.3...v0.36.4)
kubernetes/cri-client (k8s.io/cri-client) ### [`v0.36.4`](https://redirect.github.com/kubernetes/cri-client/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/cri-client/compare/v0.36.3...v0.36.4)
kubernetes/csi-translation-lib (k8s.io/csi-translation-lib) ### [`v0.36.4`](https://redirect.github.com/kubernetes/csi-translation-lib/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/csi-translation-lib/compare/v0.36.3...v0.36.4)
kubernetes/dynamic-resource-allocation (k8s.io/dynamic-resource-allocation) ### [`v0.36.4`](https://redirect.github.com/kubernetes/dynamic-resource-allocation/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/dynamic-resource-allocation/compare/v0.36.3...v0.36.4)
kubernetes/endpointslice (k8s.io/endpointslice) ### [`v0.36.4`](https://redirect.github.com/kubernetes/endpointslice/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/endpointslice/compare/v0.36.3...v0.36.4)
kubernetes/externaljwt (k8s.io/externaljwt) ### [`v0.36.4`](https://redirect.github.com/kubernetes/externaljwt/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/externaljwt/compare/v0.36.3...v0.36.4)
kubernetes/kms (k8s.io/kms) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kms/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kms/compare/v0.36.3...v0.36.4)
kubernetes/kube-aggregator (k8s.io/kube-aggregator) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kube-aggregator/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kube-aggregator/compare/v0.36.3...v0.36.4)
kubernetes/kube-controller-manager (k8s.io/kube-controller-manager) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kube-controller-manager/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kube-controller-manager/compare/v0.36.3...v0.36.4)
kubernetes/kube-proxy (k8s.io/kube-proxy) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kube-proxy/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kube-proxy/compare/v0.36.3...v0.36.4)
kubernetes/kube-scheduler (k8s.io/kube-scheduler) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kube-scheduler/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kube-scheduler/compare/v0.36.3...v0.36.4)
kubernetes/kubectl (k8s.io/kubectl) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kubectl/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kubectl/compare/v0.36.3...v0.36.4)
kubernetes/kubelet (k8s.io/kubelet) ### [`v0.36.4`](https://redirect.github.com/kubernetes/kubelet/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/kubelet/compare/v0.36.3...v0.36.4)
kubernetes/metrics (k8s.io/metrics) ### [`v0.36.4`](https://redirect.github.com/kubernetes/metrics/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/metrics/compare/v0.36.3...v0.36.4)
kubernetes/mount-utils (k8s.io/mount-utils) ### [`v0.36.4`](https://redirect.github.com/kubernetes/mount-utils/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/mount-utils/compare/v0.36.3...v0.36.4)
kubernetes/pod-security-admission (k8s.io/pod-security-admission) ### [`v0.36.4`](https://redirect.github.com/kubernetes/pod-security-admission/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/pod-security-admission/compare/v0.36.3...v0.36.4)
kubernetes/sample-apiserver (k8s.io/sample-apiserver) ### [`v0.36.4`](https://redirect.github.com/kubernetes/sample-apiserver/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/sample-apiserver/compare/v0.36.3...v0.36.4)
kubernetes/sample-cli-plugin (k8s.io/sample-cli-plugin) ### [`v0.36.4`](https://redirect.github.com/kubernetes/sample-cli-plugin/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/sample-cli-plugin/compare/v0.36.3...v0.36.4)
kubernetes/sample-controller (k8s.io/sample-controller) ### [`v0.36.4`](https://redirect.github.com/kubernetes/sample-controller/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/sample-controller/compare/v0.36.3...v0.36.4)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 56 ++++++++++++------------- go.mod | 76 +++++++++++++++++----------------- go.sum | 98 ++++++++++++++++++++++++++++++++------------ internal/tmpl/NOTICE | 56 ++++++++++++------------- 4 files changed, 166 insertions(+), 120 deletions(-) diff --git a/NOTICE b/NOTICE index fe2877094..faa245275 100644 --- a/NOTICE +++ b/NOTICE @@ -1571,75 +1571,75 @@ License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE ---------- Module: k8s.io/api -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/api/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/api/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apiextensions-apiserver/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apiextensions-apiserver/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apiextensions-apiserver/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apimachinery/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apimachinery/third_party/forked/golang -Version: v0.36.3 +Version: v0.36.4 License: BSD-3-Clause -License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.3/third_party/forked/golang/LICENSE +License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.4/third_party/forked/golang/LICENSE ---------- Module: k8s.io/apiserver/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apiserver/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apiserver/blob/v0.36.4/LICENSE ---------- Module: k8s.io/cli-runtime/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/cli-runtime/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/cli-runtime/blob/v0.36.4/LICENSE ---------- Module: k8s.io/client-go -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/LICENSE ---------- Module: k8s.io/client-go/third_party/forked/golang/template -Version: v0.36.3 +Version: v0.36.4 License: BSD-3-Clause -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/third_party/forked/golang/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/third_party/forked/golang/LICENSE ---------- Module: k8s.io/client-go/third_party/forked/httpcache -Version: v0.36.3 +Version: v0.36.4 License: MIT -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/third_party/forked/httpcache/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/third_party/forked/httpcache/LICENSE ---------- Module: k8s.io/component-base -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/component-base/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/component-base/blob/v0.36.4/LICENSE ---------- Module: k8s.io/component-helpers -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/component-helpers/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/component-helpers/blob/v0.36.4/LICENSE ---------- Module: k8s.io/controller-manager/pkg/features -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/controller-manager/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/controller-manager/blob/v0.36.4/LICENSE ---------- Module: k8s.io/klog/v2 @@ -1649,9 +1649,9 @@ License URL: https://github.com/kubernetes/klog/blob/v2.140.0/LICENSE ---------- Module: k8s.io/kube-aggregator/pkg/apis/apiregistration -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kube-openapi/pkg @@ -1673,9 +1673,9 @@ License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/va ---------- Module: k8s.io/kubectl/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kubectl/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/kubectl/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kubernetes/pkg diff --git a/go.mod b/go.mod index de8b3d7aa..bfa7d2aee 100644 --- a/go.mod +++ b/go.mod @@ -52,8 +52,8 @@ require ( google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 - k8s.io/api v0.36.3 - k8s.io/apimachinery v0.36.3 + k8s.io/api v0.36.4 + k8s.io/apimachinery v0.36.4 k8s.io/client-go v12.0.0+incompatible k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 sigs.k8s.io/controller-runtime v0.24.1 @@ -665,17 +665,17 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect - k8s.io/apiserver v0.36.3 // indirect - k8s.io/cli-runtime v0.36.3 // indirect - k8s.io/component-base v0.36.3 // indirect - k8s.io/component-helpers v0.36.3 // indirect + k8s.io/apiserver v0.36.4 // indirect + k8s.io/cli-runtime v0.36.4 // indirect + k8s.io/component-base v0.36.4 // indirect + k8s.io/component-helpers v0.36.4 // indirect k8s.io/controller-manager v0.36.1 // indirect k8s.io/klog/v2 v2.140.0 // indirect k8s.io/kube-aggregator v0.36.1 // indirect k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect k8s.io/kubectl v0.36.1 // indirect k8s.io/kubernetes v1.36.1 // indirect - k8s.io/streaming v0.36.3 // indirect + k8s.io/streaming v0.36.4 // indirect oras.land/oras-go/v2 v2.6.2 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/kustomize/api v0.21.1 // indirect @@ -693,37 +693,37 @@ tool ( // replaces for kubernetes imports. Generated with hack/update-k8s-imports.sh replace ( - k8s.io/api => k8s.io/api v0.36.3 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.36.3 - k8s.io/apimachinery => k8s.io/apimachinery v0.36.3 - k8s.io/apiserver => k8s.io/apiserver v0.36.3 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.36.3 - k8s.io/client-go => k8s.io/client-go v0.36.3 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.36.3 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.36.3 - k8s.io/code-generator => k8s.io/code-generator v0.36.3 - k8s.io/component-base => k8s.io/component-base v0.36.3 - k8s.io/component-helpers => k8s.io/component-helpers v0.36.3 - k8s.io/controller-manager => k8s.io/controller-manager v0.36.3 - k8s.io/cri-api => k8s.io/cri-api v0.36.3 - k8s.io/cri-client => k8s.io/cri-client v0.36.3 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.36.3 - k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.36.3 - k8s.io/endpointslice => k8s.io/endpointslice v0.36.3 - k8s.io/externaljwt => k8s.io/externaljwt v0.36.3 - k8s.io/kms => k8s.io/kms v0.36.3 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.36.3 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.36.3 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.36.3 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.36.3 - k8s.io/kubectl => k8s.io/kubectl v0.36.3 - k8s.io/kubelet => k8s.io/kubelet v0.36.3 - k8s.io/metrics => k8s.io/metrics v0.36.3 - k8s.io/mount-utils => k8s.io/mount-utils v0.36.3 - k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.36.3 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.36.3 - k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.36.3 - k8s.io/sample-controller => k8s.io/sample-controller v0.36.3 + k8s.io/api => k8s.io/api v0.36.4 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.36.4 + k8s.io/apimachinery => k8s.io/apimachinery v0.36.4 + k8s.io/apiserver => k8s.io/apiserver v0.36.4 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.36.4 + k8s.io/client-go => k8s.io/client-go v0.36.4 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.36.4 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.36.4 + k8s.io/code-generator => k8s.io/code-generator v0.36.4 + k8s.io/component-base => k8s.io/component-base v0.36.4 + k8s.io/component-helpers => k8s.io/component-helpers v0.36.4 + k8s.io/controller-manager => k8s.io/controller-manager v0.36.4 + k8s.io/cri-api => k8s.io/cri-api v0.36.4 + k8s.io/cri-client => k8s.io/cri-client v0.36.4 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.36.4 + k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.36.4 + k8s.io/endpointslice => k8s.io/endpointslice v0.36.4 + k8s.io/externaljwt => k8s.io/externaljwt v0.36.4 + k8s.io/kms => k8s.io/kms v0.36.4 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.36.4 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.36.4 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.36.4 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.36.4 + k8s.io/kubectl => k8s.io/kubectl v0.36.4 + k8s.io/kubelet => k8s.io/kubelet v0.36.4 + k8s.io/metrics => k8s.io/metrics v0.36.4 + k8s.io/mount-utils => k8s.io/mount-utils v0.36.4 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.36.4 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.36.4 + k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.36.4 + k8s.io/sample-controller => k8s.io/sample-controller v0.36.4 ) replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.4 diff --git a/go.sum b/go.sum index 1f9e3ae84..54ec1cb17 100644 --- a/go.sum +++ b/go.sum @@ -5365,6 +5365,11 @@ golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvm golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -5489,6 +5494,11 @@ golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -5603,6 +5613,13 @@ golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -5694,6 +5711,8 @@ golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -5840,6 +5859,12 @@ golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= @@ -5851,6 +5876,11 @@ golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJ golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= +golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c/go.mod h1:TpUTTEp9frx7rTdLpC9gFG9kdI7zVLFTFFlqaH2Cncw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= +golang.org/x/telemetry v0.0.0-20260625142307-59b4966ccb57/go.mod h1:3AWMyWHS+caVoiEXpiq6+tzKA40J4vQT3MYr80ZtQpc= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -5892,6 +5922,11 @@ golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -5933,6 +5968,12 @@ golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -6064,6 +6105,11 @@ golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= @@ -6839,25 +6885,25 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.8.0 h1:UacpzPr7D6i5BAjTkA7sNVcx4kIbhAZcQ4zYtKiXx68= honnef.co/go/tools v0.8.0/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= -k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= -k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= -k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= -k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= -k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= -k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= -k8s.io/apiserver v0.36.3 h1:MGSg2SkdfuytiDEcRylT5mQFmmSsbx90XFUO67Y4bsQ= -k8s.io/apiserver v0.36.3/go.mod h1:fVH7zv9EUNUA7Fl7LtDKh8aB9W7u1VQPSGtWV5SjUxg= -k8s.io/cli-runtime v0.36.3 h1:g+eJ+M1sYpnNYp/q5fzaw2KejIL0Q7DH+xFl6YVoL4U= -k8s.io/cli-runtime v0.36.3/go.mod h1:hZpAqK8nSFXvvLaVCbzUPVp8e9TRLSTCfpNzMt7s3tE= -k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= -k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= -k8s.io/code-generator v0.36.3/go.mod h1:Unn13Mp8X+H803jgZi4f4ExxK11aj0llXcSsl++UTkE= -k8s.io/component-base v0.36.3 h1:vc/UFvPCkW0irPz84LAodAL1j3f4xktPM6dDJIEheAY= -k8s.io/component-base v0.36.3/go.mod h1:hZbNFG+gCMl9EbykDGEu73feKP9/Cq6JsV4pTo9GTO8= -k8s.io/component-helpers v0.36.3 h1:hya22S0Mto0SlHaiD4kMIi817f/tK7uTMsShxrDKQaY= -k8s.io/component-helpers v0.36.3/go.mod h1:QjREK1lOFXR+jxTqzrtHgOtzUc2s9sm8zuFSiK+TW+c= -k8s.io/controller-manager v0.36.3 h1:GUP9E6+1EUEzxZgceOw2I+jyuahrTluadj6ZoZ/1Sbw= -k8s.io/controller-manager v0.36.3/go.mod h1:zrjaNqXRz4vfK5TdOQZEfOiTofcyIKrt/Y+jKdwqLa4= +k8s.io/api v0.36.4 h1:RxrvqCL6vgH5/+UnTeu1IIFqYmGfy0hnyrod1rn35Oo= +k8s.io/api v0.36.4/go.mod h1:S2B3orCFBDhrgyWbLeuKcT2QdHIpQesBkCYSlWtwUOw= +k8s.io/apiextensions-apiserver v0.36.4 h1:SfvCVt+4CqKWvzuVytYDT5g9hyb9MztoiYELIkPVrFc= +k8s.io/apiextensions-apiserver v0.36.4/go.mod h1:JT9V2Ju7ys1FY4zbSpmX9XOvKB3/BwsODc4hFQEa+Xo= +k8s.io/apimachinery v0.36.4 h1:PT2UzkupGuAx/+xT5XjiMJ1WGpY3fn9/hdAvjweRet4= +k8s.io/apimachinery v0.36.4/go.mod h1:p2I2dipt7JHG+quVwQ1d02d28O4GdDi77RByQ13MTpk= +k8s.io/apiserver v0.36.4 h1:AtKjaf2eUiX5G6TfF2IOlhuUuvMsHh49Ivr1+4fZ2gA= +k8s.io/apiserver v0.36.4/go.mod h1:RyiGghXP67hb0Ll+7iLJ6GGv2JpEzCn7ljbiA+L3cJ0= +k8s.io/cli-runtime v0.36.4 h1:OHvManCwP1k9GiC5tXRFxHhzZIQQFCsrHlt7OspKo3w= +k8s.io/cli-runtime v0.36.4/go.mod h1:qQSj2FJgQos6GHpS/ge7wTdQMZm9XFWlesWgV6h7qZY= +k8s.io/client-go v0.36.4 h1:MDvfDNvMSt0Br94SK8neviVlwL9qifw9B26hJCpD1K0= +k8s.io/client-go v0.36.4/go.mod h1:pNK4WKELbwlEDvtbE8l22lEZL5THYF61H5EealokZmA= +k8s.io/code-generator v0.36.4/go.mod h1:JmRrlYwTOn2glEuGOfNnlXTGbz3FfMg7t7Dq/8lHcc4= +k8s.io/component-base v0.36.4 h1:tz75yC2xgq3kd7vPdBtR8do5iMx0OHf6Zd1kuaxDB84= +k8s.io/component-base v0.36.4/go.mod h1:DCwb306U8ou89NNAp45Csuy8ok+1rp1ELDVPhzN5AWc= +k8s.io/component-helpers v0.36.4 h1:B5+SnptAlwTVJO0MW1JLsZVp4KevlADRg0CX5YFzjbU= +k8s.io/component-helpers v0.36.4/go.mod h1:RECUDkRdVuxcNOAl9/EK7lmy1TIjoWkBHs6f0uOyoCs= +k8s.io/controller-manager v0.36.4 h1:YG03tVDUY+BGLRTsNKY0Vms3lsCdq/314DW3IGZfZig= +k8s.io/controller-manager v0.36.4/go.mod h1:63s+JKgdrkqQl3AI2PovT22YMaiXC1i80/LRGLlFVjo= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/gengo/v2 v2.0.0-20250922181213-ec3ebc5fd46b/go.mod h1:CgujABENc3KuTrcsdpGmrrASjtQsWCT7R99mEV4U/fM= @@ -6870,18 +6916,18 @@ k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kms v0.36.3/go.mod h1:g91diTD9h0oJCCHkTb00krlF+Qm5HTnkWLi9Q/TpRoc= -k8s.io/kube-aggregator v0.36.3 h1:eypRCZKyGx3u9TLdnLva47l6R/67Zs9h9FQI+uMruaY= -k8s.io/kube-aggregator v0.36.3/go.mod h1:WLfUZLoYlcuy+LnfBOv9eV9bVvNf+x8dYt0mfVrq/6Y= +k8s.io/kms v0.36.4/go.mod h1:7GDHEJmWmfAJR4eBr4YzM272dPBmoVTgTkoCUOumzq4= +k8s.io/kube-aggregator v0.36.4 h1:B593UGiOA2ivyuWOSvgWly5lXkTPLcYpeZwkq4Y+ieA= +k8s.io/kube-aggregator v0.36.4/go.mod h1:05q7hjy8iKStLM1e+BOQ8mMVPnIfAqfpkhZDPGxS0xY= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs= k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= -k8s.io/kubectl v0.36.3 h1:TesKp+XYQEjPYoFvuobcVnuvira2+/xAVlq//+kksaI= -k8s.io/kubectl v0.36.3/go.mod h1:W+NEb1CzBGmoaI1Nrpn2ETo9omNBl0AsyxnnMT40N6E= -k8s.io/kubelet v0.36.3 h1:dRzEnhHk35Opy6wjWR4YBcN5RI9lB2npUY37TghFuPU= -k8s.io/kubelet v0.36.3/go.mod h1:4USFGr21Ioka+b964Beq0NvV5b5aca3RWJ1/kfq+RLw= +k8s.io/kubectl v0.36.4 h1:xZd9g1bFBd7hpb1oKjK8lT9jRL18dtgr4DAPQG1Oksk= +k8s.io/kubectl v0.36.4/go.mod h1:STWlr78cdEa1hHpr55wpcboaqchvfDueKRNDa1zOd1w= +k8s.io/kubelet v0.36.4 h1:mlmXnkrq3H02r/r0H/8M2jdPY7f4I4u4cA0tHnsPzY0= +k8s.io/kubelet v0.36.4/go.mod h1:jcOhk4E8cdUBn7WswW67WH9waQTe37G057ttnYdcaKY= k8s.io/kubernetes v1.36.3 h1:qDQdoMiluAE2Eab6Fa52YV+WjiGz9mZFFoagEA6cI+o= k8s.io/kubernetes v1.36.3/go.mod h1:6oChkQeI7Yf6lV9lFpSdRzODdbY/ECp/4zUeBk8ONaw= k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index fe2877094..faa245275 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1571,75 +1571,75 @@ License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE ---------- Module: k8s.io/api -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/api/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/api/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apiextensions-apiserver/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apiextensions-apiserver/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apiextensions-apiserver/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apimachinery/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.4/LICENSE ---------- Module: k8s.io/apimachinery/third_party/forked/golang -Version: v0.36.3 +Version: v0.36.4 License: BSD-3-Clause -License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.3/third_party/forked/golang/LICENSE +License URL: https://github.com/kubernetes/apimachinery/blob/v0.36.4/third_party/forked/golang/LICENSE ---------- Module: k8s.io/apiserver/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/apiserver/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/apiserver/blob/v0.36.4/LICENSE ---------- Module: k8s.io/cli-runtime/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/cli-runtime/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/cli-runtime/blob/v0.36.4/LICENSE ---------- Module: k8s.io/client-go -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/LICENSE ---------- Module: k8s.io/client-go/third_party/forked/golang/template -Version: v0.36.3 +Version: v0.36.4 License: BSD-3-Clause -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/third_party/forked/golang/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/third_party/forked/golang/LICENSE ---------- Module: k8s.io/client-go/third_party/forked/httpcache -Version: v0.36.3 +Version: v0.36.4 License: MIT -License URL: https://github.com/kubernetes/client-go/blob/v0.36.3/third_party/forked/httpcache/LICENSE +License URL: https://github.com/kubernetes/client-go/blob/v0.36.4/third_party/forked/httpcache/LICENSE ---------- Module: k8s.io/component-base -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/component-base/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/component-base/blob/v0.36.4/LICENSE ---------- Module: k8s.io/component-helpers -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/component-helpers/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/component-helpers/blob/v0.36.4/LICENSE ---------- Module: k8s.io/controller-manager/pkg/features -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/controller-manager/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/controller-manager/blob/v0.36.4/LICENSE ---------- Module: k8s.io/klog/v2 @@ -1649,9 +1649,9 @@ License URL: https://github.com/kubernetes/klog/blob/v2.140.0/LICENSE ---------- Module: k8s.io/kube-aggregator/pkg/apis/apiregistration -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kube-openapi/pkg @@ -1673,9 +1673,9 @@ License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/va ---------- Module: k8s.io/kubectl/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kubectl/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/kubectl/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kubernetes/pkg From 472532abd6c950a439420d7f844de32756c3a0e3 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 23:04:18 +0000 Subject: [PATCH 036/132] update(deps): update github.com/rook/rook/pkg/apis digest to efd510f (#720) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `4a0761f` → `efd510f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index faa245275..602c99238 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820190521-4a0761f0c8d9 +Version: v0.0.0-20260820212544-efd510f4cbcb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/4a0761f0c8d9/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/efd510f4cbcb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index bfa7d2aee..141271a5c 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9 + github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb ) require ( diff --git a/go.sum b/go.sum index 54ec1cb17..fb9a13efa 100644 --- a/go.sum +++ b/go.sum @@ -4713,8 +4713,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9 h1:Tua19HJOWaTSs1Ye/C/0RK41OEMQ6YbqLEc+ZFhBq78= -github.com/rook/rook/pkg/apis v0.0.0-20260820190521-4a0761f0c8d9/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb h1:orF3duoxWwsWV5mCEXpta10enkGZnZodry6cA3WTRPg= +github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index faa245275..602c99238 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820190521-4a0761f0c8d9 +Version: v0.0.0-20260820212544-efd510f4cbcb License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/4a0761f0c8d9/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/efd510f4cbcb/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From a7b45be90b396e2e8150b5bfd32ae50ce8448a95 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 00:05:44 +0000 Subject: [PATCH 037/132] update(deps): update module k8s.io/kubernetes to v1.36.4 (#707) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/kubernetes](https://redirect.github.com/kubernetes/kubernetes) | `v1.36.3` → `v1.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fkubernetes/v1.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fkubernetes/v1.36.3/v1.36.4?slim=true) | --- ### Release Notes
kubernetes/kubernetes (k8s.io/kubernetes) ### [`v1.36.4`](https://redirect.github.com/kubernetes/kubernetes/releases/tag/v1.36.4) [Compare Source](https://redirect.github.com/kubernetes/kubernetes/compare/v1.36.3...v1.36.4) See [kubernetes-announce@](https://groups.google.com/forum/#!forum/kubernetes-announce). Additional binary downloads are linked in the [CHANGELOG](https://redirect.github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md). See the [CHANGELOG](https://redirect.github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md) for more details.
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 602c99238..0b8922b55 100644 --- a/NOTICE +++ b/NOTICE @@ -1679,9 +1679,9 @@ License URL: https://github.com/kubernetes/kubectl/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kubernetes/pkg -Version: v1.36.3 +Version: v1.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.3/LICENSE +License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg diff --git a/go.mod b/go.mod index 141271a5c..c23b3d2b3 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ replace ( // TODO: remove this replace once https://github.com/libopenstorage/secrets/pull/83 is merged github.com/libopenstorage/secrets => github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 github.com/portworx/sched-ops => github.com/portworx/sched-ops v0.20.4-openstorage-rc3 - k8s.io/kubernetes => k8s.io/kubernetes v1.36.3 + k8s.io/kubernetes => k8s.io/kubernetes v1.36.4 ) require ( diff --git a/go.sum b/go.sum index fb9a13efa..ff2212109 100644 --- a/go.sum +++ b/go.sum @@ -6928,8 +6928,8 @@ k8s.io/kubectl v0.36.4 h1:xZd9g1bFBd7hpb1oKjK8lT9jRL18dtgr4DAPQG1Oksk= k8s.io/kubectl v0.36.4/go.mod h1:STWlr78cdEa1hHpr55wpcboaqchvfDueKRNDa1zOd1w= k8s.io/kubelet v0.36.4 h1:mlmXnkrq3H02r/r0H/8M2jdPY7f4I4u4cA0tHnsPzY0= k8s.io/kubelet v0.36.4/go.mod h1:jcOhk4E8cdUBn7WswW67WH9waQTe37G057ttnYdcaKY= -k8s.io/kubernetes v1.36.3 h1:qDQdoMiluAE2Eab6Fa52YV+WjiGz9mZFFoagEA6cI+o= -k8s.io/kubernetes v1.36.3/go.mod h1:6oChkQeI7Yf6lV9lFpSdRzODdbY/ECp/4zUeBk8ONaw= +k8s.io/kubernetes v1.36.4 h1:08GT0ZOMtyCcRnslyvnpWurf1wm20KHbC/aRS+0LxSo= +k8s.io/kubernetes v1.36.4/go.mod h1:ZyLkHB4+fxSZ4LqpShPGJhikj4ngJaYAFlaZKs7goP4= k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 602c99238..0b8922b55 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1679,9 +1679,9 @@ License URL: https://github.com/kubernetes/kubectl/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kubernetes/pkg -Version: v1.36.3 +Version: v1.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.3/LICENSE +License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg From a4a7fa07af153a8d214c4ac3995cd93b65515bf3 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 01:04:18 +0000 Subject: [PATCH 038/132] update(deps): update github.com/rook/rook/pkg/apis digest to c01991a (#722) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `efd510f` → `c01991a` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 0b8922b55..203c5056a 100644 --- a/NOTICE +++ b/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820212544-efd510f4cbcb +Version: v0.0.0-20260820225410-c01991a14138 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/efd510f4cbcb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/c01991a14138/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index c23b3d2b3..77420c841 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/argoproj/argo-cd/v3 v3.5.1 github.com/google/go-github/v74 v74.0.0 github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb + github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 ) require ( diff --git a/go.sum b/go.sum index ff2212109..ba185c978 100644 --- a/go.sum +++ b/go.sum @@ -4713,8 +4713,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb h1:orF3duoxWwsWV5mCEXpta10enkGZnZodry6cA3WTRPg= -github.com/rook/rook/pkg/apis v0.0.0-20260820212544-efd510f4cbcb/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 h1:0i8FwotSGj7yEOLDgf95hbjg6t5Jn9h7wDi5VGK1/Dc= +github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 0b8922b55..203c5056a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1157,9 +1157,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820212544-efd510f4cbcb +Version: v0.0.0-20260820225410-c01991a14138 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/efd510f4cbcb/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/c01991a14138/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 0dd33ce86126efb81e98296fdc95a812774f15d0 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 02:04:19 +0000 Subject: [PATCH 039/132] update(deps): update module k8s.io/streaming to v0.36.4 (#716) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/streaming](https://redirect.github.com/kubernetes/streaming) | `v0.36.3` → `v0.36.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fstreaming/v0.36.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fstreaming/v0.36.3/v0.36.4?slim=true) | --- ### Release Notes
kubernetes/streaming (k8s.io/streaming) ### [`v0.36.4`](https://redirect.github.com/kubernetes/streaming/compare/v0.36.3...v0.36.4) [Compare Source](https://redirect.github.com/kubernetes/streaming/compare/v0.36.3...v0.36.4)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 203c5056a..0ab41e0e6 100644 --- a/NOTICE +++ b/NOTICE @@ -1685,9 +1685,9 @@ License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/streaming/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/streaming/blob/v0.36.4/LICENSE ---------- Module: k8s.io/utils diff --git a/go.mod b/go.mod index 77420c841..039ddac95 100644 --- a/go.mod +++ b/go.mod @@ -728,4 +728,4 @@ replace ( replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.4 -replace k8s.io/streaming => k8s.io/streaming v0.36.3 +replace k8s.io/streaming => k8s.io/streaming v0.36.4 diff --git a/go.sum b/go.sum index ba185c978..1e786aa1e 100644 --- a/go.sum +++ b/go.sum @@ -6930,8 +6930,8 @@ k8s.io/kubelet v0.36.4 h1:mlmXnkrq3H02r/r0H/8M2jdPY7f4I4u4cA0tHnsPzY0= k8s.io/kubelet v0.36.4/go.mod h1:jcOhk4E8cdUBn7WswW67WH9waQTe37G057ttnYdcaKY= k8s.io/kubernetes v1.36.4 h1:08GT0ZOMtyCcRnslyvnpWurf1wm20KHbC/aRS+0LxSo= k8s.io/kubernetes v1.36.4/go.mod h1:ZyLkHB4+fxSZ4LqpShPGJhikj4ngJaYAFlaZKs7goP4= -k8s.io/streaming v0.36.3 h1:9rAaqBk0C0Pc7+/fqGekj07NV+/Xrew58p647A0JT8w= -k8s.io/streaming v0.36.3/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/streaming v0.36.4 h1:RS5YlhrdBN2pKGVjgygGntdu6SNdsduyjGWGe3cX0vo= +k8s.io/streaming v0.36.4/go.mod h1:tJ6S2bZa2HxIBauguBbCWSCYyd93Grfz1+z3tcOvlDE= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 203c5056a..0ab41e0e6 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1685,9 +1685,9 @@ License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg -Version: v0.36.3 +Version: v0.36.4 License: Apache-2.0 -License URL: https://github.com/kubernetes/streaming/blob/v0.36.3/LICENSE +License URL: https://github.com/kubernetes/streaming/blob/v0.36.4/LICENSE ---------- Module: k8s.io/utils From 975303983048bc18c3e5d3797d392949e6d02fde Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:03:21 +0000 Subject: [PATCH 040/132] update(deps): update go module directive to v1.27.0 (#709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [go](https://go.dev/) ([source](https://redirect.github.com/golang/go)) | golang | minor | `1.26.6` → `1.27.0` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 306 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 150 insertions(+), 156 deletions(-) diff --git a/go.mod b/go.mod index 039ddac95..f0e46700d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/codesphere-cloud/oms -go 1.26.6 +go 1.27.0 replace ( // GoReleaser pulls github.com/chrismellard/docker-credential-acr-env, @@ -30,16 +30,23 @@ require ( cloud.google.com/go/resourcemanager v1.16.0 cloud.google.com/go/serviceusage v1.15.0 filippo.io/age v1.3.1 + github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/semver/v3 v3.5.0 + github.com/argoproj/argo-cd/v3 v3.5.1 github.com/cloudnative-pg/cloudnative-pg v1.30.0 github.com/codesphere-cloud/cs-go v1.23.0 github.com/creativeprojects/go-selfupdate v1.6.0 + github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 + github.com/golang-jwt/jwt/v5 v5.3.1 + github.com/google/go-github/v74 v74.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 + github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 + github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 @@ -57,14 +64,7 @@ require ( k8s.io/client-go v12.0.0+incompatible k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 sigs.k8s.io/controller-runtime v0.24.1 -) - -require ( - github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/argoproj/argo-cd/v3 v3.5.1 - github.com/google/go-github/v74 v74.0.0 - github.com/lib/pq v1.12.3 - github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 + sigs.k8s.io/yaml v1.6.0 ) require ( @@ -84,9 +84,13 @@ require ( code.gitea.io/sdk/gitea v0.25.1 // indirect codeberg.org/chavacava/garif v0.2.1 // indirect codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect + cyphar.com/go-pathrs v0.2.2 // indirect dario.cat/mergo v1.0.2 // indirect dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect + dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect dev.gaijin.team/go/golib v0.8.1 // indirect + filippo.io/edwards25519 v1.2.0 // indirect + filippo.io/hpke v0.4.0 // indirect github.com/42wim/httpsig v1.2.4 // indirect github.com/4meepo/tagalign v1.4.3 // indirect github.com/Abirdcfly/dupword v0.1.8 // indirect @@ -114,12 +118,15 @@ require ( github.com/Azure/go-autorest/tracing v0.6.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.7.2 // indirect github.com/BurntSushi/toml v1.6.0 // indirect + github.com/ClickHouse/clickhouse-go-linter v1.2.1 // indirect github.com/Djarvur/go-err113 v0.1.1 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.34.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.58.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.58.0 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/MirrexOne/unqueryvet v1.5.4 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect @@ -133,17 +140,21 @@ require ( github.com/alingse/asasalint v0.0.11 // indirect github.com/alingse/nilnesserr v0.2.0 // indirect github.com/anchore/go-macholibre v0.1.0 // indirect + github.com/argoproj/argo-cd/gitops-engine v0.7.1-0.20250908182407-97ad5b59a627 // indirect + github.com/argoproj/pkg/v2 v2.0.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/ashanbrown/forbidigo/v2 v2.3.1 // indirect github.com/ashanbrown/makezero/v2 v2.2.1 // indirect github.com/atc0005/go-teams-notify/v2 v2.14.0 // indirect github.com/avast/retry-go/v4 v4.7.0 // indirect + github.com/avast/retry-go/v5 v5.0.0 // indirect github.com/aws/aws-sdk-go-v2 v1.43.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.31 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.34 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect @@ -168,10 +179,14 @@ require ( github.com/blacktop/go-macho v1.1.281 // indirect github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect github.com/blang/semver v3.5.1+incompatible // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bluesky-social/indigo v0.0.0-20260611225325-2e8287f2f1bb // indirect + github.com/bmatcuk/doublestar/v4 v4.10.0 // indirect + github.com/bombsimon/logrusr/v4 v4.1.0 // indirect github.com/bombsimon/wsl/v4 v4.7.0 // indirect github.com/bombsimon/wsl/v5 v5.9.0 // indirect + github.com/bradleyfalzon/ghinstallation/v2 v2.19.0 // indirect github.com/breml/bidichk v0.3.3 // indirect github.com/breml/errchkjson v0.4.1 // indirect github.com/brunoga/deep v1.3.1 // indirect @@ -182,12 +197,16 @@ require ( github.com/caarlos0/go-reddit/v3 v3.0.1 // indirect github.com/caarlos0/go-version v0.2.2 // indirect github.com/caarlos0/log v0.6.2 // indirect + github.com/casbin/casbin/v2 v2.135.0 // indirect + github.com/casbin/govaluate v1.10.0 // indirect github.com/catenacyber/perfsprint v0.10.1 // indirect github.com/cavaliergopher/cpio v1.0.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.4 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chai2010/gettext-go v1.0.3 // indirect + github.com/chainguard-dev/git-urls v1.0.2 // indirect github.com/charithe/durationcheck v0.0.11 // indirect github.com/charmbracelet/colorprofile v0.4.3 // indirect github.com/charmbracelet/fang v1.0.0 // indirect @@ -200,58 +219,80 @@ require ( github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect github.com/ckaznocha/intrange v0.3.1 // indirect github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cloudflare/circl v1.6.4 // indirect + github.com/cloudnative-pg/barman-cloud v0.5.1 // indirect + github.com/cloudnative-pg/cnpg-i v0.5.0 // indirect + github.com/cloudnative-pg/machinery v0.5.0 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containernetworking/cni v1.2.3 // indirect github.com/coreos/go-oidc/v3 v3.20.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/daixiang0/gci v0.14.0 // indirect github.com/dave/dst v0.27.4 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidmz/go-pageant v1.0.2 // indirect + github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/dghubble/go-twitter v0.0.0-20221104224141-912508c3888b // indirect github.com/dghubble/oauth1 v0.7.3 // indirect github.com/dghubble/sling v1.4.2 // indirect github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c // indirect github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea // indirect github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/distribution/reference v0.6.0 + github.com/dlclark/regexp2 v1.12.0 // indirect + github.com/dlclark/regexp2/v2 v2.2.2 // indirect github.com/docker/cli v29.6.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.9.8 // indirect github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dylibso/observe-sdk/go v0.0.0-20240828172851-9145d8ad07e1 // indirect github.com/earthboundkid/versioninfo/v2 v2.24.1 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/ettle/strcase v0.2.0 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/extism/go-sdk v1.7.1 // indirect + github.com/fatih/camelcase v1.0.0 // indirect github.com/fatih/color v1.19.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/firefart/nonamedreturns v1.0.8 // indirect + github.com/fluxcd/cli-utils v1.2.1 // indirect github.com/fsnotify/fsnotify v1.10.1 // indirect + github.com/fxamacker/cbor/v2 v2.9.2 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.13 // indirect + github.com/getsops/gopgagent v0.0.0-20241224165529-7044f28e491e // indirect github.com/ghostiam/protogetter v0.3.21 // indirect github.com/github/smimesign v0.2.0 // indirect github.com/go-critic/go-critic v0.14.4 // indirect + github.com/go-errors/errors v1.5.1 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.9.1 // indirect github.com/go-git/go-git/v5 v5.19.2 // indirect + github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/analysis v0.25.2 // indirect github.com/go-openapi/errors v0.22.8 // indirect github.com/go-openapi/jsonpointer v0.23.1 // indirect github.com/go-openapi/jsonreference v0.21.6 // indirect github.com/go-openapi/loads v0.24.0 // indirect github.com/go-openapi/runtime v0.32.3 // indirect + github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect github.com/go-openapi/spec v0.22.6 // indirect github.com/go-openapi/strfmt v0.26.3 // indirect github.com/go-openapi/swag v0.26.1 // indirect @@ -267,7 +308,9 @@ require ( github.com/go-openapi/swag/typeutils v0.26.1 // indirect github.com/go-openapi/swag/yamlutils v0.26.1 // indirect github.com/go-openapi/validate v0.26.0 // indirect + github.com/go-redis/cache/v9 v9.0.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.2.0 // indirect @@ -282,23 +325,36 @@ require ( github.com/gofrs/flock v0.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect - github.com/golang-jwt/jwt/v5 v5.3.1 github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect + github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect github.com/golangci/golangci-lint/v2 v2.13.1 // indirect github.com/golangci/golines v0.15.0 // indirect github.com/golangci/misspell v0.8.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect github.com/golangci/revgrep v0.8.0 // indirect + github.com/golangci/rowserrcheck v0.0.0-20260602201336-0ec5bd2741d7 // indirect github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/certificate-transparency-go v1.3.3 // indirect + github.com/google/gnostic-models v0.7.1 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-containerregistry v0.21.7 // indirect + github.com/google/go-github/v69 v69.2.0 // indirect + github.com/google/go-github/v86 v86.0.0 // indirect + github.com/google/go-github/v88 v88.0.0 // indirect + github.com/google/go-github/v89 v89.0.0 // indirect + github.com/google/go-licenses/v2 v2.0.1 // indirect + github.com/google/go-querystring v1.2.0 // indirect github.com/google/ko v0.19.1 // indirect + github.com/google/licenseclassifier/v2 v2.0.0 // indirect + github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0 // indirect github.com/google/rpmpack v0.7.1 // indirect github.com/google/s2a-go v0.1.9 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.1-0.20241114170450-2d3c2a9cc518 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect @@ -306,6 +362,7 @@ require ( github.com/gordonklaus/ineffassign v0.2.0 // indirect github.com/goreleaser/chglog v0.7.4 // indirect github.com/goreleaser/fileglob v1.4.0 // indirect + github.com/goreleaser/go-shellwords v1.0.13 // indirect github.com/goreleaser/goreleaser/v2 v2.17.1 // indirect github.com/goreleaser/nfpm/v2 v2.47.0 // indirect github.com/goreleaser/quill v0.0.0-20260630015114-8310f3e9a321 // indirect @@ -314,19 +371,30 @@ require ( github.com/gostaticanalysis/comment v1.5.0 // indirect github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect github.com/gostaticanalysis/nilerr v0.1.2 // indirect + github.com/gosuri/uitable v0.0.4 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.1-vault-7 // indirect + github.com/hashicorp/vault/api v1.23.0 // indirect + github.com/hashicorp/vault/api/auth/approle v0.8.0 // indirect + github.com/hashicorp/vault/api/auth/kubernetes v0.8.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/huandu/xstrings v1.5.0 // indirect + github.com/ianlancetaylor/demangle v0.0.0-20251118225945-96ee0021ea0f // indirect github.com/in-toto/attestation v1.2.0 // indirect github.com/in-toto/in-toto-golang v0.11.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/jsonschema v0.14.0 // indirect github.com/ipfs/bbloom v0.1.0 // indirect github.com/ipfs/boxo v0.41.0 // indirect @@ -344,8 +412,13 @@ require ( github.com/jedisct1/go-minisign v0.0.0-20260527172527-a09352b57a22 // indirect github.com/jgautheron/goconst v1.11.0 // indirect github.com/jjti/go-spancheck v0.6.5 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/jonboulle/clockwork v0.5.0 // indirect + github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/julz/importas v0.2.0 // indirect + github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.7 // indirect github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.6.0 // indirect github.com/kisielk/errcheck v1.20.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect @@ -360,9 +433,13 @@ require ( github.com/knadh/koanf/providers/structs v1.0.0 // indirect github.com/knadh/koanf/v2 v2.3.5 // indirect github.com/kr/fs v0.1.0 // indirect + github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 // indirect + github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 // indirect github.com/kulti/thelper v0.7.1 // indirect github.com/kunwardeep/paralleltest v1.0.15 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lasiar/canonicalheader v1.1.2 // indirect github.com/ldez/exptostd v0.4.5 // indirect github.com/ldez/gomoddirectives v0.9.0 // indirect @@ -371,6 +448,8 @@ require ( github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect + github.com/libopenstorage/secrets v0.0.0-20240416031220-a17cf7f72c6c // indirect + github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lucasb-eyer/go-colorful v1.4.1 // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect @@ -381,14 +460,23 @@ require ( github.com/mattn/go-colorable v0.1.15 // indirect github.com/mattn/go-isatty v0.0.23 // indirect github.com/mattn/go-mastodon v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.24 // indirect github.com/mgechev/revive v1.15.0 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/moby/api v1.55.0 // indirect + github.com/moby/moby/client v0.5.0 // indirect + github.com/moby/spdystream v0.5.1 // indirect github.com/moby/term v0.5.2 // indirect github.com/modelcontextprotocol/registry v1.8.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/moricho/tparallel v0.3.2 // indirect github.com/mr-tron/base58 v1.3.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect @@ -406,17 +494,28 @@ require ( github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.24.0 // indirect + github.com/oklog/ulid/v2 v2.1.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/openshift/api v0.0.0-20241216151652-de9de05a8e43 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/otiai10/copy v1.14.1 // indirect + github.com/otiai10/mint v1.6.3 // indirect + github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible // indirect + github.com/pb33f/ordered-map/v2 v2.3.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.4.3 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.90.0 // indirect + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/quasilyte/go-ruleguard v0.4.5 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect @@ -424,12 +523,20 @@ require ( github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect github.com/raeperd/recvcheck v0.3.0 // indirect + github.com/redis/go-redis/v9 v9.20.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/robfig/cron/v3 v3.0.2-0.20210106135023-bc59245fe10e // indirect + github.com/rogpeppe/go-internal v1.16.0 // indirect github.com/rs/zerolog v1.35.1 // indirect + github.com/rubenv/sql-migrate v1.8.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryancurrah/gomodguard v1.4.1 // indirect + github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect @@ -440,6 +547,7 @@ require ( github.com/sergi/go-diff v1.4.0 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect + github.com/sigstore/cosign/v3 v3.1.1 // indirect github.com/sigstore/protobuf-specs v0.5.1 // indirect github.com/sigstore/rekor v1.5.2 // indirect github.com/sigstore/rekor-tiles/v2 v2.3.0 // indirect @@ -455,14 +563,19 @@ require ( github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/spf13/viper v1.21.0 // indirect github.com/spiffe/go-spiffe/v2 v2.8.1 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect + github.com/stretchr/objx v0.5.3 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tetafro/godot v1.5.6 // indirect + github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 // indirect + github.com/tetratelabs/wazero v1.12.0 // indirect github.com/theupdateframework/go-tuf v0.7.0 // indirect github.com/theupdateframework/go-tuf/v2 v2.4.2 // indirect + github.com/thoas/go-funk v0.9.3 // indirect github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect github.com/timonwong/loggercheck v0.11.0 // indirect github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect @@ -470,22 +583,29 @@ require ( github.com/tomnomnom/linkheader v0.0.0-20250811210735-e5fe3b51442e // indirect github.com/transparency-dev/formats v0.1.1 // indirect github.com/transparency-dev/merkle v0.0.2 // indirect + github.com/ulikunitz/xz v0.5.16 // indirect github.com/ultraware/funlen v0.2.0 // indirect github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.1 // indirect github.com/uudashr/iface v1.5.0 // indirect github.com/vektra/mockery/v3 v3.7.3 // indirect + github.com/vmihailenco/go-tinylfu v0.2.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/wagoodman/go-progress v0.0.0-20260303201901-10176f79b2c0 // indirect github.com/whyrusleeping/cbor-gen v0.3.1 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xen0n/gosmopolitan v1.3.0 // indirect + github.com/xlab/treeprint v1.2.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.3.0 // indirect github.com/ykadowak/zerologlint v0.1.5 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect gitlab.com/bosi/decorder v0.4.2 // indirect gitlab.com/digitalxero/go-conventional-commit v1.0.7 // indirect gitlab.com/gitlab-org/api/client-go v1.46.0 // indirect @@ -493,6 +613,9 @@ require ( go-simpler.org/sloglint v0.12.0 // indirect go.augendre.info/arangolint v0.4.0 // indirect go.augendre.info/fatcontext v0.10.0 // indirect + go.digitalxero.dev/go-msix v0.3.1 // indirect + go.mozilla.org/pkcs7 v0.9.0 // indirect + go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.44.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0 // indirect @@ -502,168 +625,34 @@ require ( go.opentelemetry.io/otel/sdk v1.44.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect go.opentelemetry.io/otel/trace v1.44.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.6 // indirect gocloud.dev v0.46.0 // indirect golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f // indirect + golang.org/x/net v0.58.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.41.0 // indirect golang.org/x/time v0.15.0 // indirect + golang.org/x/tools v0.49.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto v0.0.0-20260720171339-e059f2f05d78 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260720171339-e059f2f05d78 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/validator.v2 v2.0.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - honnef.co/go/tools v0.8.0 // indirect - lukechampine.com/blake3 v1.4.1 // indirect - mvdan.cc/gofumpt v0.11.0 // indirect - mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 // indirect - sigs.k8s.io/kind v0.32.0 // indirect - sigs.k8s.io/yaml v1.6.0 - software.sslmate.com/src/go-pkcs12 v0.7.3 // indirect -) - -require ( - cyphar.com/go-pathrs v0.2.2 // indirect - dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect - filippo.io/edwards25519 v1.2.0 // indirect - filippo.io/hpke v0.4.0 // indirect - github.com/ClickHouse/clickhouse-go-linter v1.2.1 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/argoproj/argo-cd/gitops-engine v0.7.1-0.20250908182407-97ad5b59a627 // indirect - github.com/argoproj/pkg/v2 v2.0.1 // indirect - github.com/avast/retry-go/v5 v5.0.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.10.0 // indirect - github.com/bombsimon/logrusr/v4 v4.1.0 // indirect - github.com/bradleyfalzon/ghinstallation/v2 v2.19.0 // indirect - github.com/casbin/casbin/v2 v2.135.0 // indirect - github.com/casbin/govaluate v1.10.0 // indirect - github.com/chai2010/gettext-go v1.0.3 // indirect - github.com/chainguard-dev/git-urls v1.0.2 // indirect - github.com/clipperhouse/uax29/v2 v2.7.0 // indirect - github.com/cloudnative-pg/barman-cloud v0.5.1 // indirect - github.com/cloudnative-pg/cnpg-i v0.5.0 // indirect - github.com/cloudnative-pg/machinery v0.5.0 // indirect - github.com/containernetworking/cni v1.2.3 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/denis-tingaikin/go-header v0.5.0 // indirect - github.com/dlclark/regexp2 v1.12.0 // indirect - github.com/dlclark/regexp2/v2 v2.2.2 // indirect - github.com/dylibso/observe-sdk/go v0.0.0-20240828172851-9145d8ad07e1 // indirect - github.com/emicklei/go-restful/v3 v3.13.0 // indirect - github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect - github.com/extism/go-sdk v1.7.1 // indirect - github.com/fatih/camelcase v1.0.0 // indirect - github.com/fluxcd/cli-utils v1.2.1 // indirect - github.com/fxamacker/cbor/v2 v2.9.2 // indirect - github.com/getsops/gopgagent v0.0.0-20241224165529-7044f28e491e // indirect - github.com/go-errors/errors v1.5.1 // indirect - github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-logr/logr v1.4.4 // indirect - github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect - github.com/go-redis/cache/v9 v9.0.0 // indirect - github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect - github.com/golangci/rowserrcheck v0.0.0-20260602201336-0ec5bd2741d7 // indirect - github.com/google/btree v1.1.3 // indirect - github.com/google/gnostic-models v0.7.1 // indirect - github.com/google/go-cmp v0.7.0 // indirect - github.com/google/go-github/v69 v69.2.0 // indirect - github.com/google/go-github/v86 v86.0.0 // indirect - github.com/google/go-github/v88 v88.0.0 // indirect - github.com/google/go-github/v89 v89.0.0 // indirect - github.com/google/go-licenses/v2 v2.0.1 // indirect - github.com/google/go-querystring v1.2.0 // indirect - github.com/google/licenseclassifier/v2 v2.0.0 // indirect - github.com/google/pprof v0.0.0-20260709232956-b9395ee17fa0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/goreleaser/go-shellwords v1.0.13 // indirect - github.com/gosuri/uitable v0.0.4 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect - github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.7 // indirect - github.com/hashicorp/hcl v1.0.1-vault-7 // indirect - github.com/hashicorp/vault/api v1.23.0 // indirect - github.com/hashicorp/vault/api/auth/approle v0.8.0 // indirect - github.com/hashicorp/vault/api/auth/kubernetes v0.8.0 // indirect - github.com/ianlancetaylor/demangle v0.0.0-20251118225945-96ee0021ea0f // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmoiron/sqlx v1.4.0 // indirect - github.com/jonboulle/clockwork v0.5.0 // indirect - github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect - github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.7 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 // indirect - github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 // indirect - github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/libopenstorage/secrets v0.0.0-20240416031220-a17cf7f72c6c // indirect - github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mattn/go-runewidth v0.0.24 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect - github.com/moby/moby/api v1.55.0 // indirect - github.com/moby/moby/client v0.5.0 // indirect - github.com/moby/spdystream v0.5.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/oklog/ulid/v2 v2.1.1 // indirect - github.com/openshift/api v0.0.0-20241216151652-de9de05a8e43 // indirect - github.com/otiai10/copy v1.14.1 // indirect - github.com/otiai10/mint v1.6.3 // indirect - github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible // indirect - github.com/pb33f/ordered-map/v2 v2.3.1 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect - github.com/prometheus/common v0.70.1 // indirect - github.com/redis/go-redis/v9 v9.20.1 // indirect - github.com/robfig/cron/v3 v3.0.2-0.20210106135023-bc59245fe10e // indirect - github.com/rogpeppe/go-internal v1.16.0 // indirect - github.com/rubenv/sql-migrate v1.8.1 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect - github.com/sigstore/cosign/v3 v3.1.1 // indirect - github.com/spf13/pflag v1.0.10 // indirect - github.com/stretchr/objx v0.5.3 // indirect - github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 // indirect - github.com/tetratelabs/wazero v1.12.0 // indirect - github.com/thoas/go-funk v0.9.3 // indirect - github.com/ulikunitz/xz v0.5.16 // indirect - github.com/vmihailenco/go-tinylfu v0.2.2 // indirect - github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/x448/float16 v0.8.4 // indirect - github.com/xlab/treeprint v1.2.0 // indirect - github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect - go.digitalxero.dev/go-msix v0.3.1 // indirect - go.mozilla.org/pkcs7 v0.9.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.10.0 // indirect - go.yaml.in/yaml/v4 v4.0.0-rc.6 // indirect - golang.org/x/net v0.58.0 // indirect - golang.org/x/sync v0.22.0 // indirect - golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.41.0 // indirect - golang.org/x/tools v0.49.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + honnef.co/go/tools v0.8.0 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect k8s.io/apiserver v0.36.4 // indirect k8s.io/cli-runtime v0.36.4 // indirect @@ -676,12 +665,17 @@ require ( k8s.io/kubectl v0.36.1 // indirect k8s.io/kubernetes v1.36.1 // indirect k8s.io/streaming v0.36.4 // indirect + lukechampine.com/blake3 v1.4.1 // indirect + mvdan.cc/gofumpt v0.11.0 // indirect + mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 // indirect oras.land/oras-go/v2 v2.6.2 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/kind v0.32.0 // indirect sigs.k8s.io/kustomize/api v0.21.1 // indirect sigs.k8s.io/kustomize/kyaml v0.21.1 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + software.sslmate.com/src/go-pkcs12 v0.7.3 // indirect ) tool ( From 364c5df090ee6bf4ce4f99170b7f574a1e56bde6 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 04:03:18 +0000 Subject: [PATCH 041/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.27.0 (#710) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.23.0` → `v1.27.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.27.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.23.0/v1.27.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.27.0`](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.26.0...v1.27.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.26.0...v1.27.0) ### [`v1.26.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.26.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.25.0...v1.26.0) #### Changelog - [`9d8a47b`](https://redirect.github.com/codesphere-cloud/cs-go/commit/9d8a47b45518187b00e322ecf63f0377fd7a2657) update(deps): update actions/setup-go action to v7 ([#​312](https://redirect.github.com/codesphere-cloud/cs-go/issues/312)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser). ### [`v1.25.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.25.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.24.0...v1.25.0) #### Changelog - [`e69f800`](https://redirect.github.com/codesphere-cloud/cs-go/commit/e69f8001706cfd81f3b39d0d9b32448a8336bad1) update(deps): update actions/checkout action to v7 ([#​311](https://redirect.github.com/codesphere-cloud/cs-go/issues/311)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser). ### [`v1.24.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.24.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.23.0...v1.24.0) #### Changelog - [`b7e8d53`](https://redirect.github.com/codesphere-cloud/cs-go/commit/b7e8d53c3389b6cd4bdf5794e94ae1a9f18bb62f) refac: big refactor to verb folder based command structure ([#​301](https://redirect.github.com/codesphere-cloud/cs-go/issues/301)) - [`5b6a325`](https://redirect.github.com/codesphere-cloud/cs-go/commit/5b6a3255861486419e8f9ddee388c960f0238a45) update(deps): update actions/checkout digest to [`d23441a`](https://redirect.github.com/codesphere-cloud/cs-go/commit/d23441a) ([#​306](https://redirect.github.com/codesphere-cloud/cs-go/issues/306)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 0ab41e0e6..aa977a531 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.23.0 +Version: v1.27.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.23.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.27.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index f0e46700d..f900b9c77 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.1 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.23.0 + github.com/codesphere-cloud/cs-go v1.27.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 1e786aa1e..4f7246f19 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.23.0 h1:1utr5apaFPAHmysXsV2T3qddLGAUDWdrjcm6N+tshh4= -github.com/codesphere-cloud/cs-go v1.23.0/go.mod h1:0TVlynPmXCVvxyi996r9UDd7iLyS0pcEI2y/JCo5vU4= +github.com/codesphere-cloud/cs-go v1.27.0 h1:n2zqnn2uw2KPvSHvNFQSnxE5LsIBKUZAKthE6SPtaMg= +github.com/codesphere-cloud/cs-go v1.27.0/go.mod h1:EdOmH9+DhL9uubFvopOxKwuOXodDQ9HS2xQkUu/pEq0= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 0ab41e0e6..aa977a531 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.23.0 +Version: v1.27.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.23.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.27.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From a84f0fdb17380f13a1d825e83a0a5f72fdc74373 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 05:03:23 +0000 Subject: [PATCH 042/132] update(deps): update actions/checkout action to v7 (#713) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/checkout](https://redirect.github.com/actions/checkout) | action | major | `v6` → `v7` | --- ### Release Notes
actions/checkout (actions/checkout) ### [`v7.0.1`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v701) [Compare Source](https://redirect.github.com/actions/checkout/compare/v7...v7.0.1) - Skip running unsafe pr check if input is default by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2518](https://redirect.github.com/actions/checkout/pull/2518) - Trim only ascii whitespace for branch by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2521](https://redirect.github.com/actions/checkout/pull/2521) - Escape values passed to --unset by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2530](https://redirect.github.com/actions/checkout/pull/2530) - Various dependency updates ### [`v7.0.0`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v700) [Compare Source](https://redirect.github.com/actions/checkout/compare/v7...v7) - Block checking out fork PR for pull\_request\_target and workflow\_run by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2454](https://redirect.github.com/actions/checkout/pull/2454) - Various dependency updates ### [`v7`](https://redirect.github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v701) [Compare Source](https://redirect.github.com/actions/checkout/compare/v6.1.0...v7) - Skip running unsafe pr check if input is default by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2518](https://redirect.github.com/actions/checkout/pull/2518) - Trim only ascii whitespace for branch by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2521](https://redirect.github.com/actions/checkout/pull/2521) - Escape values passed to --unset by [@​aiqiaoy](https://redirect.github.com/aiqiaoy) in [#​2530](https://redirect.github.com/actions/checkout/pull/2530) - Various dependency updates
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- .github/workflows/cli-build_test.yml | 4 ++-- .github/workflows/go-lint.yml | 2 +- .github/workflows/integration-test.yml | 2 +- .github/workflows/tag-release.yml | 2 +- .github/workflows/update-docs-and-licenses.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cli-build_test.yml b/.github/workflows/cli-build_test.yml index 2ba2dfc5a..f501ead18 100644 --- a/.github/workflows/cli-build_test.yml +++ b/.github/workflows/cli-build_test.yml @@ -17,7 +17,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 @@ -42,7 +42,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 diff --git a/.github/workflows/go-lint.yml b/.github/workflows/go-lint.yml index 5797a5cad..a2c691e93 100644 --- a/.github/workflows/go-lint.yml +++ b/.github/workflows/go-lint.yml @@ -17,7 +17,7 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 0884cfbfb..58222cf29 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -13,7 +13,7 @@ jobs: integration-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index dc4f141e9..026358326 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest needs: integration-tests steps: - - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-tags: true fetch-depth: 0 diff --git a/.github/workflows/update-docs-and-licenses.yml b/.github/workflows/update-docs-and-licenses.yml index c6a26b771..b52080117 100644 --- a/.github/workflows/update-docs-and-licenses.yml +++ b/.github/workflows/update-docs-and-licenses.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: # on push to main, use main; on PR, check out the PR head ref: ${{ github.event.pull_request.head.ref || github.ref }} From 529be6c9c46e5ad41073258f9d83cad6416d4b6a Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 06:03:44 +0000 Subject: [PATCH 043/132] update(deps): update actions/setup-go action to v7 (#718) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [actions/setup-go](https://redirect.github.com/actions/setup-go) | action | major | `v6` → `v7` | --- ### Release Notes
actions/setup-go (actions/setup-go) ### [`v7.0.0`](https://redirect.github.com/actions/setup-go/releases/tag/v7.0.0) [Compare Source](https://redirect.github.com/actions/setup-go/compare/v7.0.0...v7.0.0) ##### What's Changed - Migrate to ESM and upgrade dependencies by [@​priyagupta108](https://redirect.github.com/priyagupta108) in [#​763](https://redirect.github.com/actions/setup-go/pull/763) - chore(deps): bump [@​actions/cache](https://redirect.github.com/actions/cache) to 6.2.0 by [@​philip-gai](https://redirect.github.com/philip-gai) in [#​771](https://redirect.github.com/actions/setup-go/pull/771) ##### New Contributors - [@​philip-gai](https://redirect.github.com/philip-gai) made their first contribution in [#​771](https://redirect.github.com/actions/setup-go/pull/771) **Full Changelog**: ### [`v7`](https://redirect.github.com/actions/setup-go/compare/v6.5.0...v7.0.0) [Compare Source](https://redirect.github.com/actions/setup-go/compare/v6.5.0...v7.0.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- .github/workflows/cli-build_test.yml | 4 ++-- .github/workflows/go-lint.yml | 2 +- .github/workflows/integration-test.yml | 2 +- .github/workflows/tag-release.yml | 2 +- .github/workflows/update-docs-and-licenses.yml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cli-build_test.yml b/.github/workflows/cli-build_test.yml index f501ead18..f11fabd12 100644 --- a/.github/workflows/cli-build_test.yml +++ b/.github/workflows/cli-build_test.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' diff --git a/.github/workflows/go-lint.yml b/.github/workflows/go-lint.yml index a2c691e93..535ba94d0 100644 --- a/.github/workflows/go-lint.yml +++ b/.github/workflows/go-lint.yml @@ -21,7 +21,7 @@ jobs: with: fetch-depth: 0 - - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 58222cf29..e32a02c53 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Go - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 026358326..f50289713 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -27,7 +27,7 @@ jobs: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' diff --git a/.github/workflows/update-docs-and-licenses.yml b/.github/workflows/update-docs-and-licenses.yml index b52080117..07b8c8319 100644 --- a/.github/workflows/update-docs-and-licenses.yml +++ b/.github/workflows/update-docs-and-licenses.yml @@ -25,7 +25,7 @@ jobs: token: ${{ secrets.PAT_UPDATE_DOCS }} - name: Set up Go - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 with: go-version-file: 'go.mod' From 9f13adbd7e864640daca12a34e4c5c1b7428fc63 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 07:03:44 +0000 Subject: [PATCH 044/132] update(deps): update endbug/add-and-commit action to v11 (#719) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [EndBug/add-and-commit](https://redirect.github.com/EndBug/add-and-commit) | action | major | `v9` → `v11` | --- ### Release Notes
EndBug/add-and-commit (EndBug/add-and-commit) ### [`v11.1.1`](https://redirect.github.com/EndBug/add-and-commit/releases/tag/v11.1.1) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v11.1.0...v11.1.1) #### What's Changed - docs: highlight untrusted git-arg interpolation as a warning callout by [@​EndBug](https://redirect.github.com/EndBug) in [#​781](https://redirect.github.com/EndBug/add-and-commit/pull/781) - fix: Remove GH var interpolation in action.yml docstring by [@​dzcode](https://redirect.github.com/dzcode) in [#​783](https://redirect.github.com/EndBug/add-and-commit/pull/783) - fix: validate denylisted git args on every token by [@​EndBug](https://redirect.github.com/EndBug) in [#​784](https://redirect.github.com/EndBug/add-and-commit/pull/784) #### New Contributors - [@​dzcode](https://redirect.github.com/dzcode) made their first contribution in [#​783](https://redirect.github.com/EndBug/add-and-commit/pull/783) **Full Changelog**: ### [`v11.1.0`](https://redirect.github.com/EndBug/add-and-commit/releases/tag/v11.1.0) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v11...v11.1.0) #### What's Changed - feat: add push\_attempts to retry failed pushes by [@​EndBug](https://redirect.github.com/EndBug) in [#​764](https://redirect.github.com/EndBug/add-and-commit/pull/764) - test: add integration tests for the shipped action by [@​EndBug](https://redirect.github.com/EndBug) in [#​766](https://redirect.github.com/EndBug/add-and-commit/pull/766) - feat: add dry\_run input by [@​EndBug](https://redirect.github.com/EndBug) in [#​765](https://redirect.github.com/EndBug/add-and-commit/pull/765) - docs: add nmattia as a contributor for ideas by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​767](https://redirect.github.com/EndBug/add-and-commit/pull/767) - docs: add jcbhmr as a contributor for ideas by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​768](https://redirect.github.com/EndBug/add-and-commit/pull/768) - fix: reject remote-helper overrides skipped by -u by [@​EndBug](https://redirect.github.com/EndBug) in [#​770](https://redirect.github.com/EndBug/add-and-commit/pull/770) - fix: block scheme:: remote helpers and restrict git transports by [@​EndBug](https://redirect.github.com/EndBug) in [#​771](https://redirect.github.com/EndBug/add-and-commit/pull/771) - fix: resolve absolute cwd without dumping the minified bundle ([#​495](https://redirect.github.com/EndBug/add-and-commit/issues/495)) by [@​EndBug](https://redirect.github.com/EndBug) in [#​772](https://redirect.github.com/EndBug/add-and-commit/pull/772) - feat: treat pull: true as a default git pull by [@​EndBug](https://redirect.github.com/EndBug) in [#​773](https://redirect.github.com/EndBug/add-and-commit/pull/773) - docs: add ross-spencer as a contributor for bug by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​774](https://redirect.github.com/EndBug/add-and-commit/pull/774) - docs: add louisabraham as a contributor for ideas by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​775](https://redirect.github.com/EndBug/add-and-commit/pull/775) - fix: reject --pathspec-from-file to prevent log disclosure by [@​EndBug](https://redirect.github.com/EndBug) in [#​777](https://redirect.github.com/EndBug/add-and-commit/pull/777) - fix: neutralize workflow-command injection in info logs by [@​EndBug](https://redirect.github.com/EndBug) in [#​776](https://redirect.github.com/EndBug/add-and-commit/pull/776) - fix: reject glued quotes that string-argv would split into extra git flags by [@​EndBug](https://redirect.github.com/EndBug) in [#​778](https://redirect.github.com/EndBug/add-and-commit/pull/778) - chore(deps): bump js-yaml from 5.2.3 to 5.3.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​780](https://redirect.github.com/EndBug/add-and-commit/pull/780) - chore(deps-dev): bump [@​vercel/ncc](https://redirect.github.com/vercel/ncc) from 0.44.1 to 0.45.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​779](https://redirect.github.com/EndBug/add-and-commit/pull/779) **Full Changelog**: ### [`v11.0.0`](https://redirect.github.com/EndBug/add-and-commit/releases/tag/v11.0.0) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v11...v11) #### What's Changed - chore(deps): bump picomatch by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​724](https://redirect.github.com/EndBug/add-and-commit/pull/724) - chore(deps-dev): bump handlebars from 4.7.8 to 4.7.9 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​725](https://redirect.github.com/EndBug/add-and-commit/pull/725) - chore(deps): bump lodash from 4.17.23 to 4.18.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​728](https://redirect.github.com/EndBug/add-and-commit/pull/728) - chore(deps-dev): bump ts-jest from 29.4.6 to 29.4.9 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​727](https://redirect.github.com/EndBug/add-and-commit/pull/727) - chore(deps): bump [@​actions/github](https://redirect.github.com/actions/github) from 9.0.0 to 9.1.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​729](https://redirect.github.com/EndBug/add-and-commit/pull/729) - chore(deps): bump [@​actions/github](https://redirect.github.com/actions/github) from 9.1.0 to 9.1.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​732](https://redirect.github.com/EndBug/add-and-commit/pull/732) - chore(deps): bump [@​actions/core](https://redirect.github.com/actions/core) from 3.0.0 to 3.0.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​733](https://redirect.github.com/EndBug/add-and-commit/pull/733) - ci(deps): bump actions/dependency-review-action from 4 to 5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​734](https://redirect.github.com/EndBug/add-and-commit/pull/734) - chore(deps-dev): bump ts-jest from 29.4.9 to 29.4.11 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​736](https://redirect.github.com/EndBug/add-and-commit/pull/736) - chore(deps-dev): bump jest from 30.3.0 to 30.4.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​735](https://redirect.github.com/EndBug/add-and-commit/pull/735) - chore(deps-dev): bump eslint-plugin-prettier from 5.5.5 to 5.5.6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​738](https://redirect.github.com/EndBug/add-and-commit/pull/738) - chore(deps): bump js-yaml from 4.1.1 to 4.2.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​739](https://redirect.github.com/EndBug/add-and-commit/pull/739) - ci(deps): bump actions/checkout from 6 to 7 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​741](https://redirect.github.com/EndBug/add-and-commit/pull/741) - chore(deps): bump undici from 6.24.1 to 6.27.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​744](https://redirect.github.com/EndBug/add-and-commit/pull/744) - ci(deps): bump actions/setup-node from 6 to 7 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​749](https://redirect.github.com/EndBug/add-and-commit/pull/749) - chore(deps-dev): bump [@​vercel/ncc](https://redirect.github.com/vercel/ncc) from 0.38.4 to 0.44.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​746](https://redirect.github.com/EndBug/add-and-commit/pull/746) - chore(deps): bump js-yaml from 4.2.0 to 5.2.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​747](https://redirect.github.com/EndBug/add-and-commit/pull/747) - chore(deps-dev): bump ts-jest from 29.4.11 to 29.4.12 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​750](https://redirect.github.com/EndBug/add-and-commit/pull/750) - chore(deps): bump js-yaml from 5.2.1 to 5.2.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​751](https://redirect.github.com/EndBug/add-and-commit/pull/751) - chore(deps): bump undici from 6.27.0 to 6.28.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​753](https://redirect.github.com/EndBug/add-and-commit/pull/753) - fix: reject remote-helper git flags that enable RCE by [@​EndBug](https://redirect.github.com/EndBug) in [#​754](https://redirect.github.com/EndBug/add-and-commit/pull/754) - fix: prevent git option injection via new\_branch by [@​EndBug](https://redirect.github.com/EndBug) in [#​755](https://redirect.github.com/EndBug/add-and-commit/pull/755) - fix: verify committed lib/ matches source in CI by [@​EndBug](https://redirect.github.com/EndBug) in [#​756](https://redirect.github.com/EndBug/add-and-commit/pull/756) - fix: stop logging full git config (credential leak) by [@​EndBug](https://redirect.github.com/EndBug) in [#​758](https://redirect.github.com/EndBug/add-and-commit/pull/758) - fix: reject -F/--file git args that can exfiltrate runner files by [@​EndBug](https://redirect.github.com/EndBug) in [#​759](https://redirect.github.com/EndBug/add-and-commit/pull/759) - fix: reject unmatched quotes in matchGitArgs to prevent flag injection by [@​EndBug](https://redirect.github.com/EndBug) in [#​760](https://redirect.github.com/EndBug/add-and-commit/pull/760) - fix: refuse unexpected gitlinks staged by git add by [@​EndBug](https://redirect.github.com/EndBug) in [#​761](https://redirect.github.com/EndBug/add-and-commit/pull/761) - fix: do not report committed=true for empty commit SHA by [@​EndBug](https://redirect.github.com/EndBug) in [#​757](https://redirect.github.com/EndBug/add-and-commit/pull/757) - ci: pin actions-tagger and restrict release workflow permissions by [@​EndBug](https://redirect.github.com/EndBug) in [#​762](https://redirect.github.com/EndBug/add-and-commit/pull/762) - fix: neutralize bidi and control chars in action logs by [@​EndBug](https://redirect.github.com/EndBug) in [#​763](https://redirect.github.com/EndBug/add-and-commit/pull/763) **Full Changelog**: ### [`v11`](https://redirect.github.com/EndBug/add-and-commit/compare/v10.0.0...v11) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v10.0.0...v11) ### [`v10.0.0`](https://redirect.github.com/EndBug/add-and-commit/releases/tag/v10.0.0) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v10.0.0...v10.0.0) #### What's Changed - chore(deps-dev): bump husky from 8.0.3 to 9.0.6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​617](https://redirect.github.com/EndBug/add-and-commit/pull/617) - chore(deps-dev): bump [@​typescript-eslint/parser](https://redirect.github.com/typescript-eslint/parser) from 6.19.0 to 6.19.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​618](https://redirect.github.com/EndBug/add-and-commit/pull/618) - chore(deps-dev): bump prettier from 3.2.4 to 3.2.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​619](https://redirect.github.com/EndBug/add-and-commit/pull/619) - chore(deps-dev): bump [@​typescript-eslint/eslint-plugin](https://redirect.github.com/typescript-eslint/eslint-plugin) from 6.19.1 to 6.21.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​623](https://redirect.github.com/EndBug/add-and-commit/pull/623) - chore(deps-dev): bump [@​typescript-eslint/parser](https://redirect.github.com/typescript-eslint/parser) from 6.19.1 to 6.21.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​624](https://redirect.github.com/EndBug/add-and-commit/pull/624) - chore(deps-dev): bump husky from 9.0.6 to 9.0.11 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​626](https://redirect.github.com/EndBug/add-and-commit/pull/626) - chore: switch to GTS for linting by [@​EndBug](https://redirect.github.com/EndBug) in [#​636](https://redirect.github.com/EndBug/add-and-commit/pull/636) - chore(deps-dev): bump gts from 5.2.0 to 5.3.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​637](https://redirect.github.com/EndBug/add-and-commit/pull/637) - chore(deps-dev): bump typescript from 5.2.2 to 5.4.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​639](https://redirect.github.com/EndBug/add-and-commit/pull/639) - chore(deps-dev): bump gts from 5.3.0 to 5.3.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​642](https://redirect.github.com/EndBug/add-and-commit/pull/642) - chore(deps-dev): bump braces from 3.0.2 to 3.0.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​641](https://redirect.github.com/EndBug/add-and-commit/pull/641) - chore(deps-dev): bump typescript from 5.4.5 to 5.5.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​644](https://redirect.github.com/EndBug/add-and-commit/pull/644) - Adds examples of input arrays. by [@​tommie](https://redirect.github.com/tommie) in [#​645](https://redirect.github.com/EndBug/add-and-commit/pull/645) - chore(deps-dev): bump typescript from 5.5.2 to 5.5.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​649](https://redirect.github.com/EndBug/add-and-commit/pull/649) - docs: add tommie as a contributor for doc by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​647](https://redirect.github.com/EndBug/add-and-commit/pull/647) - chore(deps-dev): bump husky from 9.0.11 to 9.1.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​650](https://redirect.github.com/EndBug/add-and-commit/pull/650) - chore(deps-dev): bump typescript from 5.5.3 to 5.5.4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​653](https://redirect.github.com/EndBug/add-and-commit/pull/653) - chore(deps-dev): bump husky from 9.1.1 to 9.1.4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​655](https://redirect.github.com/EndBug/add-and-commit/pull/655) - chore(deps-dev): bump husky from 9.1.4 to 9.1.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​659](https://redirect.github.com/EndBug/add-and-commit/pull/659) - chore(deps-dev): bump husky from 9.1.5 to 9.1.6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​660](https://redirect.github.com/EndBug/add-and-commit/pull/660) - chore(deps-dev): bump typescript from 5.5.4 to 5.6.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​661](https://redirect.github.com/EndBug/add-and-commit/pull/661) - chore(deps-dev): bump [@​vercel/ncc](https://redirect.github.com/vercel/ncc) from 0.38.1 to 0.38.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​662](https://redirect.github.com/EndBug/add-and-commit/pull/662) - chore(deps): bump [@​actions/core](https://redirect.github.com/actions/core) from 1.10.1 to 1.11.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​663](https://redirect.github.com/EndBug/add-and-commit/pull/663) - chore(deps-dev): bump typescript from 5.6.2 to 5.6.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​664](https://redirect.github.com/EndBug/add-and-commit/pull/664) - chore(deps-dev): bump gts from 5.3.1 to 6.0.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​665](https://redirect.github.com/EndBug/add-and-commit/pull/665) - chore(deps-dev): bump gts from 6.0.0 to 6.0.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​666](https://redirect.github.com/EndBug/add-and-commit/pull/666) - chore(deps-dev): bump [@​vercel/ncc](https://redirect.github.com/vercel/ncc) from 0.38.2 to 0.38.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​669](https://redirect.github.com/EndBug/add-and-commit/pull/669) - chore(deps): bump cross-spawn by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​670](https://redirect.github.com/EndBug/add-and-commit/pull/670) - docs: add icemac as a contributor for doc by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​674](https://redirect.github.com/EndBug/add-and-commit/pull/674) - chore(deps-dev): bump husky from 9.1.6 to 9.1.7 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​672](https://redirect.github.com/EndBug/add-and-commit/pull/672) - chore(deps-dev): bump typescript from 5.6.3 to 5.7.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​671](https://redirect.github.com/EndBug/add-and-commit/pull/671) - chore(deps-dev): bump typescript from 5.7.2 to 5.7.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​676](https://redirect.github.com/EndBug/add-and-commit/pull/676) - chore(deps-dev): bump eslint-config-prettier from 9.1.0 to 10.0.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​677](https://redirect.github.com/EndBug/add-and-commit/pull/677) - chore(deps-dev): bump eslint-config-prettier from 10.0.1 to 10.0.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​678](https://redirect.github.com/EndBug/add-and-commit/pull/678) - chore(deps-dev): bump typescript from 5.7.3 to 5.8.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​679](https://redirect.github.com/EndBug/add-and-commit/pull/679) - chore(deps-dev): bump eslint-config-prettier from 10.0.2 to 10.1.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​680](https://redirect.github.com/EndBug/add-and-commit/pull/680) - chore(deps-dev): bump typescript from 5.8.2 to 5.8.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​681](https://redirect.github.com/EndBug/add-and-commit/pull/681) - chore(deps-dev): bump eslint-config-prettier from 10.1.1 to 10.1.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​682](https://redirect.github.com/EndBug/add-and-commit/pull/682) - chore(deps-dev): bump eslint-config-prettier from 10.1.2 to 10.1.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​683](https://redirect.github.com/EndBug/add-and-commit/pull/683) - chore(deps-dev): bump eslint-config-prettier from 10.1.5 to 10.1.8 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​686](https://redirect.github.com/EndBug/add-and-commit/pull/686) - ci(deps): bump actions/checkout from 4 to 5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​688](https://redirect.github.com/EndBug/add-and-commit/pull/688) - ci(deps): bump actions/setup-node from 4 to 5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​690](https://redirect.github.com/EndBug/add-and-commit/pull/690) - chore(deps-dev): bump [@​vercel/ncc](https://redirect.github.com/vercel/ncc) from 0.38.3 to 0.38.4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​691](https://redirect.github.com/EndBug/add-and-commit/pull/691) - chore(deps-dev): bump typescript from 5.8.3 to 5.9.3 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​694](https://redirect.github.com/EndBug/add-and-commit/pull/694) - ci(deps): bump actions/setup-node from 5 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​697](https://redirect.github.com/EndBug/add-and-commit/pull/697) - ci(deps): bump github/codeql-action from 3 to 4 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​696](https://redirect.github.com/EndBug/add-and-commit/pull/696) - Removes the redundant JSON array parsing. by [@​tommie](https://redirect.github.com/tommie) in [#​652](https://redirect.github.com/EndBug/add-and-commit/pull/652) - docs: add tommie as a contributor for code, and test by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​699](https://redirect.github.com/EndBug/add-and-commit/pull/699) - chore(deps): bump js-yaml from 4.1.0 to 4.1.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​700](https://redirect.github.com/EndBug/add-and-commit/pull/700) - ci(deps): bump actions/checkout from 4 to 5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​703](https://redirect.github.com/EndBug/add-and-commit/pull/703) - chore(deps-dev): bump jest and [@​types/jest](https://redirect.github.com/types/jest) by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​701](https://redirect.github.com/EndBug/add-and-commit/pull/701) - ci(deps): bump actions/setup-node from 4 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​702](https://redirect.github.com/EndBug/add-and-commit/pull/702) - ci(deps): bump actions/checkout from 5 to 6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​704](https://redirect.github.com/EndBug/add-and-commit/pull/704) - Improve documentation around pathspec error behavior by [@​tomas-kovanda](https://redirect.github.com/tomas-kovanda) in [#​706](https://redirect.github.com/EndBug/add-and-commit/pull/706) - docs: add tomas-kovanda as a contributor for doc by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​707](https://redirect.github.com/EndBug/add-and-commit/pull/707) - chore(deps-dev): bump ts-jest from 29.4.5 to 29.4.6 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​708](https://redirect.github.com/EndBug/add-and-commit/pull/708) - chore(deps): bump [@​actions/core](https://redirect.github.com/actions/core) from 1.11.1 to 2.0.1 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​709](https://redirect.github.com/EndBug/add-and-commit/pull/709) - chore(deps): bump [@​actions/core](https://redirect.github.com/actions/core) from 2.0.1 to 2.0.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​711](https://redirect.github.com/EndBug/add-and-commit/pull/711) - chore(deps): bump lodash from 4.17.21 to 4.17.23 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​715](https://redirect.github.com/EndBug/add-and-commit/pull/715) - chore(deps-dev): bump eslint-plugin-prettier from 5.5.4 to 5.5.5 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​712](https://redirect.github.com/EndBug/add-and-commit/pull/712) - chore(deps): bump minimatch by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​718](https://redirect.github.com/EndBug/add-and-commit/pull/718) - chore(deps): bump [@​actions/core](https://redirect.github.com/actions/core) from 2.0.2 to 3.0.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​716](https://redirect.github.com/EndBug/add-and-commit/pull/716) - chore(deps-dev): bump jest from 30.2.0 to 30.3.0 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​721](https://redirect.github.com/EndBug/add-and-commit/pull/721) - feat!: use node version 24 by [@​CodeReaper](https://redirect.github.com/CodeReaper) in [#​720](https://redirect.github.com/EndBug/add-and-commit/pull/720) - chore(deps-dev): bump flatted from 3.3.3 to 3.4.2 by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​722](https://redirect.github.com/EndBug/add-and-commit/pull/722) - docs: add CodeReaper as a contributor for maintenance by [@​allcontributors](https://redirect.github.com/allcontributors)\[bot] in [#​723](https://redirect.github.com/EndBug/add-and-commit/pull/723) #### New Contributors - [@​tommie](https://redirect.github.com/tommie) made their first contribution in [#​645](https://redirect.github.com/EndBug/add-and-commit/pull/645) - [@​tomas-kovanda](https://redirect.github.com/tomas-kovanda) made their first contribution in [#​706](https://redirect.github.com/EndBug/add-and-commit/pull/706) - [@​CodeReaper](https://redirect.github.com/CodeReaper) made their first contribution in [#​720](https://redirect.github.com/EndBug/add-and-commit/pull/720) **Full Changelog**: ### [`v10`](https://redirect.github.com/EndBug/add-and-commit/compare/v9.1.4...v10.0.0) [Compare Source](https://redirect.github.com/EndBug/add-and-commit/compare/v9.1.4...v10.0.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- .github/workflows/update-docs-and-licenses.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-docs-and-licenses.yml b/.github/workflows/update-docs-and-licenses.yml index 07b8c8319..d67552668 100644 --- a/.github/workflows/update-docs-and-licenses.yml +++ b/.github/workflows/update-docs-and-licenses.yml @@ -34,7 +34,7 @@ jobs: ./hack/update-docs-and-licenses.sh - name: Commit and push auto-generated changes - uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9 + uses: EndBug/add-and-commit@cc9c08ba6c8df3b93a8f2db63e89b98368ae2ae8 # v11 with: # Use the PR author's identity for the commit author_name: ${{ github.event.pull_request.user.login }} From 0884cacdf38f22528e44c71e331b594d60d18e4e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 08:04:25 +0000 Subject: [PATCH 045/132] update(deps): update module github.com/azure/azure-sdk-for-go to v68 (#721) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/Azure/azure-sdk-for-go](https://redirect.github.com/Azure/azure-sdk-for-go) | `v46.4.0+incompatible` → `v68.0.0+incompatible` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fAzure%2fazure-sdk-for-go/v68.0.0+incompatible?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fAzure%2fazure-sdk-for-go/v46.4.0+incompatible/v68.0.0+incompatible?slim=true) | --- ### Release Notes
Azure/azure-sdk-for-go (github.com/Azure/azure-sdk-for-go) ### [`v68.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.4.0...v68.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.4.0...v68.0.0) ### [`v67.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.3.0...v67.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.3.0...v67.4.0) ### [`v67.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.2.0...v67.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.2.0...v67.3.0) ### [`v67.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.1.0...v67.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.1.0...v67.2.0) ### [`v67.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.0.0...v67.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v67.0.0...v67.1.0) ### [`v67.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v66.0.0...v67.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v66.0.0...v67.0.0) ### [`v66.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v65.0.0...v66.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v65.0.0...v66.0.0) ### [`v65.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.2.0...v65.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.2.0...v65.0.0) ### [`v64.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.1.0...v64.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.1.0...v64.2.0) ### [`v64.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.0.0...v64.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v64.0.0...v64.1.0) ### [`v64.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.4.0...v64.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.4.0...v64.0.0) ### [`v63.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.3.0...v63.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.3.0...v63.4.0) ### [`v63.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.2.0...v63.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.2.0...v63.3.0) ### [`v63.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.1.0...v63.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.1.0...v63.2.0) ### [`v63.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.0.0...v63.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v63.0.0...v63.1.0) ### [`v63.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.3.0...v63.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.3.0...v63.0.0) ### [`v62.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.2.0...v62.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.2.0...v62.3.0) ### [`v62.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.1.0...v62.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.1.0...v62.2.0) ### [`v62.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.0.0...v62.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v62.0.0...v62.1.0) ### [`v62.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.6.0...v62.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.6.0...v62.0.0) ### [`v61.6.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.5.0...v61.6.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.5.0...v61.6.0) ### [`v61.5.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.4.0...v61.5.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.4.0...v61.5.0) ### [`v61.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.3.0...v61.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.3.0...v61.4.0) ### [`v61.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.2.0...v61.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.2.0...v61.3.0) ### [`v61.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.1.0...v61.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.1.0...v61.2.0) ### [`v61.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.0.0...v61.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v61.0.0...v61.1.0) ### [`v61.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.3.0...v61.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.3.0...v61.0.0) ### [`v60.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.2.0...v60.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.2.0...v60.3.0) ### [`v60.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.1.0...v60.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.1.0...v60.2.0) ### [`v60.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.0.0...v60.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v60.0.0...v60.1.0) ### [`v60.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.4.0...v60.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.4.0...v60.0.0) ### [`v59.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.3.0...v59.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.3.0...v59.4.0) ### [`v59.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.2.0...v59.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.2.0...v59.3.0) ### [`v59.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.1.0...v59.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.1.0...v59.2.0) ### [`v59.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.0.0...v59.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v59.0.0...v59.1.0) ### [`v59.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.3.0...v59.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.3.0...v59.0.0) ### [`v58.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.2.0...v58.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.2.0...v58.3.0) ### [`v58.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.1.0...v58.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.1.0...v58.2.0) ### [`v58.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.0.0...v58.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v58.0.0...v58.1.0) ### [`v58.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.4.0...v58.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.4.0...v58.0.0) ### [`v57.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.3.0...v57.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.3.0...v57.4.0) ### [`v57.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.2.0...v57.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.2.0...v57.3.0) ### [`v57.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.1.0...v57.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.1.0...v57.2.0) ### [`v57.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.0.0...v57.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v57.0.0...v57.1.0) ### [`v57.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.3.0...v57.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.3.0...v57.0.0) ### [`v56.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.2.0...v56.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.2.0...v56.3.0) ### [`v56.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.1.0...v56.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.1.0...v56.2.0) ### [`v56.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.0.0...v56.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v56.0.0...v56.1.0) ### [`v56.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.8.0...v56.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.8.0...v56.0.0) ### [`v55.8.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.7.0...v55.8.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.7.0...v55.8.0) ### [`v55.7.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.6.0...v55.7.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.6.0...v55.7.0) ### [`v55.6.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.5.0...v55.6.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.5.0...v55.6.0) ### [`v55.5.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.4.0...v55.5.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.4.0...v55.5.0) ### [`v55.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.3.0...v55.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.3.0...v55.4.0) ### [`v55.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.2.0...v55.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.2.0...v55.3.0) ### [`v55.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.1.0...v55.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.1.0...v55.2.0) ### [`v55.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.0.0...v55.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v55.0.0...v55.1.0) ### [`v55.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.3.0...v55.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.3.0...v55.0.0) ### [`v54.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.2.1...v54.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.2.1...v54.3.0) ### [`v54.2.1+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.2.0...v54.2.1) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.2.0...v54.2.1) ### [`v54.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.1.0...v54.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.1.0...v54.2.0) ### [`v54.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.0.0...v54.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v54.0.0...v54.1.0) ### [`v54.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.4.0...v54.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.4.0...v54.0.0) ### [`v53.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.3.0...v53.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.3.0...v53.4.0) ### [`v53.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.2.0...v53.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.2.0...v53.3.0) ### [`v53.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.1.0...v53.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.1.0...v53.2.0) ### [`v53.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.0.0...v53.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v53.0.0...v53.1.0) ### [`v53.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.6.0...v53.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.6.0...v53.0.0) ### [`v52.6.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.5.0...v52.6.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.5.0...v52.6.0) ### [`v52.5.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.4.0...v52.5.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.4.0...v52.5.0) ### [`v52.4.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.3.1...v52.4.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.3.1...v52.4.0) ### [`v52.3.1+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.3.0...v52.3.1) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.3.0...v52.3.1) ### [`v52.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.2.0...v52.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.2.0...v52.3.0) ### [`v52.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.1.0...v52.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.1.0...v52.2.0) ### [`v52.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.0.0...v52.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v52.0.0...v52.1.0) ### [`v52.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.3.0...v52.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.3.0...v52.0.0) ### [`v51.3.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.2.0...v51.3.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.2.0...v51.3.0) ### [`v51.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.1.0...v51.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.1.0...v51.2.0) ### [`v51.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.0.0...v51.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v51.0.0...v51.1.0) ### [`v51.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.2.0...v51.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.2.0...v51.0.0) ### [`v50.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.1.0...v50.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.1.0...v50.2.0) ### [`v50.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.0.0...v50.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v50.0.0...v50.1.0) ### [`v50.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.2.1...v50.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.2.1...v50.0.0) ### [`v49.2.1+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.2.0...v49.2.1) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.2.0...v49.2.1) ### [`v49.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.1.1...v49.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.1.1...v49.2.0) ### [`v49.1.1+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.1.0...v49.1.1) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.1.0...v49.1.1) ### [`v49.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.0.0...v49.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v49.0.0...v49.1.0) ### [`v49.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.2...v49.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.2...v49.0.0) ### [`v48.2.2+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.1...v48.2.2) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.1...v48.2.2) ### [`v48.2.1+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.0...v48.2.1) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.2.0...v48.2.1) ### [`v48.2.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.1.0...v48.2.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.1.0...v48.2.0) ### [`v48.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.0.0...v48.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v48.0.0...v48.1.0) ### [`v48.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v47.1.0...v48.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v47.1.0...v48.0.0) ### [`v47.1.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v47.0.0...v47.1.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v47.0.0...v47.1.0) ### [`v47.0.0+incompatible`](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v46.4.0...v47.0.0) [Compare Source](https://redirect.github.com/Azure/azure-sdk-for-go/compare/v46.4.0...v47.0.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f900b9c77..39a0a8470 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ replace ( // which imports github.com/Azure/azure-sdk-for-go/version. Azure SDK // v68 removed that package, so keep the legacy monorepo on the version // requested by the credential helper, which still provides it. - github.com/Azure/azure-sdk-for-go => github.com/Azure/azure-sdk-for-go v46.4.0+incompatible + github.com/Azure/azure-sdk-for-go => github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // argo-cd's go.mod resolves its nested gitops-engine module through a local // directory replace, which does not carry over to consumers, so pin it here. // The commit tagged for argo-cd v3.4.6 still imports the autoscaling v2beta* diff --git a/go.sum b/go.sum index 4f7246f19..d4ec461b0 100644 --- a/go.sum +++ b/go.sum @@ -2713,8 +2713,8 @@ github.com/Antonboom/nilnil v1.1.2 h1:aNlFuJhaEseXe4fHO3xbjXlSeEiQVYa2lEkWD2s2hA github.com/Antonboom/nilnil v1.1.2/go.mod h1:0ynwvphOLmAuMwTNDyBnDZmSwZoDpcFXmUHmzoHH2WA= github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= -github.com/Azure/azure-sdk-for-go v46.4.0+incompatible h1:fCN6Pi+tEiEwFa8RSmtVlFHRXEZ+DJm9gfx/MKqYWw4= -github.com/Azure/azure-sdk-for-go v46.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= +github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= From 0bf81180171b4274a8a72f04c10193452e758628 Mon Sep 17 00:00:00 2001 From: Tim Schrodi Date: Fri, 21 Aug 2026 17:24:01 +0200 Subject: [PATCH 046/132] feat(cli): add oms copy package command for transferring images between registries (#708) Introduces a new `oms copy` command group with a `package` subcommand that copies container images and OCI Helm charts referenced in a BOM between registries. Adds supporting package-copy logic in internal/installer, extends the BOM model, and adds a trailing newline to bootstrap step/substep log lines so copy progress output doesn't run together. --- NOTICE | 36 ++++- cli/cmd/copy.go | 27 ++++ cli/cmd/copy_package.go | 176 ++++++++++++++++++++++++ cli/cmd/copy_package_test.go | 164 ++++++++++++++++++++++ cli/cmd/download_package.go | 40 +----- cli/cmd/download_package_test.go | 2 +- cli/cmd/root.go | 1 + docs/README.md | 1 + docs/oms.md | 1 + docs/oms_copy.md | 20 +++ docs/oms_copy_package.md | 47 +++++++ go.mod | 12 +- go.sum | 9 ++ internal/installer/bom/bom.go | 31 +++++ internal/installer/bom/bom_test.go | 30 ++++ internal/installer/package_copy.go | 140 +++++++++++++++++++ internal/installer/package_copy_test.go | 98 +++++++++++++ internal/portal/download.go | 73 ++++++++++ internal/tmpl/NOTICE | 36 ++++- 19 files changed, 898 insertions(+), 46 deletions(-) create mode 100644 cli/cmd/copy.go create mode 100644 cli/cmd/copy_package.go create mode 100644 cli/cmd/copy_package_test.go create mode 100644 docs/oms_copy.md create mode 100644 docs/oms_copy_package.md create mode 100644 internal/installer/package_copy.go create mode 100644 internal/installer/package_copy_test.go create mode 100644 internal/portal/download.go diff --git a/NOTICE b/NOTICE index aa977a531..bdfa3f4e8 100644 --- a/NOTICE +++ b/NOTICE @@ -357,6 +357,18 @@ Version: v1.12.0 License: MIT License URL: https://github.com/dlclark/regexp2/blob/v1.12.0/LICENSE +---------- +Module: github.com/docker/cli/cli/config +Version: v29.6.2 +License: Apache-2.0 +License URL: https://github.com/docker/cli/blob/v29.6.2/LICENSE + +---------- +Module: github.com/docker/docker-credential-helpers +Version: v0.9.8 +License: MIT +License URL: https://github.com/docker/docker-credential-helpers/blob/v0.9.8/LICENSE + ---------- Module: github.com/dylibso/observe-sdk/go Version: v0.0.0-20240828172851-9145d8ad07e1 @@ -651,6 +663,12 @@ Version: v0.7.0 License: BSD-3-Clause License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE +---------- +Module: github.com/google/go-containerregistry +Version: v0.21.7 +License: Apache-2.0 +License URL: https://github.com/google/go-containerregistry/blob/v0.21.7/LICENSE + ---------- Module: github.com/google/go-github/v69/github Version: v69.2.0 @@ -868,29 +886,41 @@ License: MIT License URL: https://github.com/kevinburke/ssh_config/blob/v1.6.0/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: MIT License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: Apache-2.0 License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: BSD-3-Clause License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +---------- +Module: github.com/klauspost/compress/internal/snapref +Version: v1.19.1 +License: BSD-3-Clause +License URL: https://github.com/klauspost/compress/blob/v1.19.1/internal/snapref/LICENSE + ---------- Module: github.com/klauspost/compress/s2 Version: v1.19.1 License: BSD-3-Clause License URL: https://github.com/klauspost/compress/blob/v1.19.1/s2/LICENSE +---------- +Module: github.com/klauspost/compress/zstd/internal/xxhash +Version: v1.19.1 +License: MIT +License URL: https://github.com/klauspost/compress/blob/v1.19.1/zstd/internal/xxhash/LICENSE.txt + ---------- Module: github.com/klauspost/cpuid/v2 Version: v2.3.0 diff --git a/cli/cmd/copy.go b/cli/cmd/copy.go new file mode 100644 index 000000000..34fcf2475 --- /dev/null +++ b/cli/cmd/copy.go @@ -0,0 +1,27 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/spf13/cobra" +) + +// CopyCmd represents the copy command. +type CopyCmd struct { + cmd *cobra.Command +} + +// AddCopyCmd adds the copy command group to the root command. +func AddCopyCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { + copyCmd := CopyCmd{cmd: &cobra.Command{ + Use: "copy", + Short: "Copy resources between locations", + Long: csio.Long(`Copy resources managed by OMS between locations, + e.g. package container images and OCI Helm charts between registries.`), + }} + util.AddCmd(rootCmd, copyCmd.cmd) + AddCopyPackageCmd(copyCmd.cmd, opts) +} diff --git a/cli/cmd/copy_package.go b/cli/cmd/copy_package.go new file mode 100644 index 000000000..8d97ca177 --- /dev/null +++ b/cli/cmd/copy_package.go @@ -0,0 +1,176 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "context" + "fmt" + "log" + "os" + "path/filepath" + + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/codesphere-cloud/oms/internal/env" + "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/portal" + "github.com/codesphere-cloud/oms/internal/prompt" + intutil "github.com/codesphere-cloud/oms/internal/util" + "github.com/google/go-containerregistry/pkg/logs" + "github.com/spf13/cobra" +) + +const defaultInstallerPackageArtifact = "installer-lite.tar.gz" + +// CopyPackageCmd represents the copy package command. +type CopyPackageCmd struct { + cmd *cobra.Command + Opts CopyPackageOpts + Env env.Env + FileWriter intutil.FileIO + Prompter prompt.Prompter +} + +// CopyPackageOpts holds the flags accepted by the copy package command. +type CopyPackageOpts struct { + *util.GlobalOptions + Package string + Version string + Hash string + Filename string + Dest string + Yes bool + Force bool + Insecure bool + Verbose bool + ShowArtifacts bool +} + +// RunE resolves the installer package and executes its artifact transfers. +func (c *CopyPackageCmd) RunE(cmd *cobra.Command, _ []string) error { + packagePath, err := c.resolvePackage(portal.NewPortalClient()) + if err != nil { + return err + } + + packageManager := installer.NewPackage(c.Env.GetOmsWorkdir(), packagePath) + + if c.Opts.Verbose { + logs.Debug.SetOutput(os.Stderr) + } + + return c.CopyPackage(cmd.Context(), packageManager, &installer.CraneArtifactCopier{ + Insecure: c.Opts.Insecure, + }) +} + +// AddCopyPackageCmd adds the package subcommand to the copy command. +func AddCopyPackageCmd(parent *cobra.Command, opts *util.GlobalOptions) { + c := &CopyPackageCmd{ + cmd: &cobra.Command{ + Use: "package", + Short: "Copy all images and Helm charts from an installer package", + Long: csio.Long(`Read all container images and OCI Helm charts from an installer package BOM + and copy them to another registry. + + Use --package for a local installer package or --version to download one + from the OMS portal. The source repository paths are preserved below --dest.`), + Args: cobra.NoArgs, + Example: util.FormatExamples("copy package", []csio.Example{ + {Cmd: "--package codesphere-v1.70.0-installer-lite.tar.gz --dest registry.example.com/mirror", Desc: "Copy artifacts from a local package"}, + {Cmd: "--version codesphere-v1.70.0 --dest registry.example.com/mirror --yes", Desc: "Download an upstream package and copy without prompting"}, + }), + }, + Opts: CopyPackageOpts{GlobalOptions: opts, Filename: defaultInstallerPackageArtifact}, + Env: env.NewEnv(), + FileWriter: intutil.NewFilesystemWriter(), + Prompter: prompt.NewPrompter(true), + } + c.cmd.PreRunE = func(_ *cobra.Command, _ []string) error { + if (c.Opts.Package == "") == (c.Opts.Version == "") { + return fmt.Errorf("exactly one of --package or --version must be specified") + } + + return nil + } + + flags := c.cmd.Flags() + flags.StringVarP(&c.Opts.Package, "package", "p", "", "Path to a local installer package") + flags.StringVarP(&c.Opts.Version, "version", "V", "", "Codesphere package version to download from the OMS portal") + flags.StringVarP(&c.Opts.Hash, "hash", "H", "", "Build hash used to disambiguate an upstream package version") + flags.StringVarP(&c.Opts.Filename, "file", "f", defaultInstallerPackageArtifact, "Installer artifact to download for an upstream package") + flags.StringVar(&c.Opts.Dest, "dest", "", "Destination registry or repository prefix") + flags.BoolVar(&c.Opts.Insecure, "insecure", false, "Allow image references to be fetched without TLS") + flags.BoolVarP(&c.Opts.Yes, "yes", "y", false, "Copy without prompting for confirmation") + flags.BoolVarP(&c.Opts.Verbose, "verbose", "v", false, "Enable debug logs") + flags.BoolVar(&c.Opts.Force, "force", false, "Re-extract the installer package") + flags.BoolVar(&c.Opts.ShowArtifacts, "show-artifacts", false, "Print the source and destination of every artifact to copy") + util.MarkFlagRequired(c.cmd, "dest") + + util.AddCmd(parent, c.cmd) + c.cmd.RunE = c.RunE +} + +// CopyPackage extracts the package, prints the complete transfer plan, asks +// for confirmation, and then copies each artifact. +func (c *CopyPackageCmd) CopyPackage(ctx context.Context, packageManager installer.PackageManager, copier installer.ArtifactCopier) error { + if err := packageManager.Extract(c.Opts.Force); err != nil { + return fmt.Errorf("failed to extract package: %w", err) + } + + artifacts, err := installer.ReadPackageArtifacts(packageManager.GetDependencyPath("bom.json"), c.Opts.Dest) + if err != nil { + return fmt.Errorf("failed to read package BOM: %w", err) + } + + if len(artifacts) == 0 { + return fmt.Errorf("package BOM contains no container images or OCI Helm charts") + } + + if c.Opts.ShowArtifacts { + log.Printf("Artifacts to copy (%d):", len(artifacts)) + for _, artifact := range artifacts { + log.Printf(" %s -> %s", artifact.Source, artifact.Destination) + } + } else { + log.Printf("Artifacts to copy: %d", len(artifacts)) + } + + if !c.Opts.Yes && !c.Prompter.Bool("Copy these artifacts?", false) { + return fmt.Errorf("transfer cancelled") + } + + log.Printf("Copying %d package artifacts...", len(artifacts)) + if err := installer.CopyPackageArtifacts(ctx, copier, artifacts); err != nil { + return fmt.Errorf("failed to copy package artifacts: %w", err) + } + + log.Printf("Successfully copied %d package artifacts to %s", len(artifacts), c.Opts.Dest) + + return nil +} + +func (c *CopyPackageCmd) resolvePackage(portalClient portal.Portal) (string, error) { + if c.Opts.Package != "" { + return c.Opts.Package, nil + } + + workdir := c.Env.GetOmsWorkdir() + if err := os.MkdirAll(workdir, 0755); err != nil { + return "", fmt.Errorf("failed to create OMS workdir: %w", err) + } + + build, err := portalClient.GetBuild(portal.CodesphereProduct, c.Opts.Version, c.Opts.Hash) + if err != nil { + return "", fmt.Errorf("failed to get upstream package: %w", err) + } + + destination := filepath.Join(workdir, build.BuildPackageFilename(c.Opts.Filename)) + + if err := portal.DownloadAndVerifyBuild(portalClient, c.FileWriter, portal.CodesphereProduct, build, c.Opts.Filename, destination, portal.DownloadOptions{}); err != nil { + return "", fmt.Errorf("failed to download upstream package: %w", err) + } + + return destination, nil +} diff --git a/cli/cmd/copy_package_test.go b/cli/cmd/copy_package_test.go new file mode 100644 index 000000000..fcee3b377 --- /dev/null +++ b/cli/cmd/copy_package_test.go @@ -0,0 +1,164 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "github.com/codesphere-cloud/oms/internal/env" + "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/portal" + "github.com/codesphere-cloud/oms/internal/prompt" + intutil "github.com/codesphere-cloud/oms/internal/util" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/stretchr/testify/mock" +) + +type commandRecordingCopier struct { + copies []installer.PackageArtifact +} + +func (c *commandRecordingCopier) Copy(_ context.Context, source, destination string) error { + c.copies = append(c.copies, installer.PackageArtifact{Source: source, Destination: destination}) + return nil +} + +var _ = Describe("CopyPackageCmd", func() { + var ( + packageManager *installer.MockPackageManager + bomPath string + ) + + BeforeEach(func() { + packageManager = installer.NewMockPackageManager(GinkgoT()) + bomPath = filepath.Join(GinkgoT().TempDir(), "bom.json") + Expect(os.WriteFile(bomPath, []byte(`{ + "components": {"codesphere": {"containerImages": {"api": "ghcr.io/codesphere/api:v1"}}} + }`), 0644)).To(Succeed()) + }) + + preparePackageManager := func() { + packageManager.EXPECT().Extract(false).Return(nil) + packageManager.EXPECT().GetDependencyPath("bom.json").Return(bomPath) + } + + It("asks for confirmation before copying", func() { + preparePackageManager() + + prompter := prompt.NewMockPrompter(GinkgoT()) + prompter.EXPECT().Bool("Copy these artifacts?", false).Return(true) + + copier := &commandRecordingCopier{} + command := &CopyPackageCmd{ + Opts: CopyPackageOpts{Dest: "registry.example.com/mirror"}, + Prompter: prompter, + } + + Expect(command.CopyPackage(context.Background(), packageManager, copier)).To(Succeed()) + Expect(copier.copies).To(Equal([]installer.PackageArtifact{{ + Source: "ghcr.io/codesphere/api:v1", + Destination: "registry.example.com/mirror/codesphere/api:v1", + }})) + }) + + It("cancels without copying when confirmation is declined", func() { + preparePackageManager() + + prompter := prompt.NewMockPrompter(GinkgoT()) + prompter.EXPECT().Bool("Copy these artifacts?", false).Return(false) + + copier := &commandRecordingCopier{} + command := &CopyPackageCmd{ + Opts: CopyPackageOpts{Dest: "registry.example.com/mirror"}, + Prompter: prompter, + } + + err := command.CopyPackage(context.Background(), packageManager, copier) + Expect(err).To(MatchError("transfer cancelled")) + Expect(copier.copies).To(BeEmpty()) + }) + + It("skips confirmation with --yes", func() { + preparePackageManager() + + copier := &commandRecordingCopier{} + command := &CopyPackageCmd{ + Opts: CopyPackageOpts{Dest: "registry.example.com/mirror", Yes: true}, + Prompter: prompt.NewMockPrompter(GinkgoT()), + } + + Expect(command.CopyPackage(context.Background(), packageManager, copier)).To(Succeed()) + Expect(copier.copies).To(HaveLen(1)) + }) + + It("registers the command and validates package source flags", func() { + root := GetRootCmd() + copyPackage, _, err := root.Find([]string{"copy", "package"}) + Expect(err).NotTo(HaveOccurred()) + Expect(copyPackage).NotTo(BeNil()) + Expect(copyPackage.Flags().Lookup("dest")).NotTo(BeNil()) + Expect(copyPackage.Flags().Lookup("yes")).NotTo(BeNil()) + + root.SetArgs([]string{"copy", "package", "--dest", "registry.example.com", "--yes"}) + Expect(root.Execute()).To(MatchError("exactly one of --package or --version must be specified")) + }) + + Describe("resolvePackage with --version", func() { + var ( + mockEnv *env.MockEnv + mockPortal *portal.MockPortal + mockFileWriter *intutil.MockFileIO + workdir string + build portal.Build + command *CopyPackageCmd + ) + + BeforeEach(func() { + workdir = GinkgoT().TempDir() + mockEnv = env.NewMockEnv(GinkgoT()) + mockEnv.EXPECT().GetOmsWorkdir().Return(workdir) + + mockPortal = portal.NewMockPortal(GinkgoT()) + mockFileWriter = intutil.NewMockFileIO(GinkgoT()) + + build = portal.Build{ + Version: "codesphere-v1.70.0", + Hash: "abc1234567", + Artifacts: []portal.Artifact{{Filename: defaultInstallerPackageArtifact}}, + } + + command = &CopyPackageCmd{ + Opts: CopyPackageOpts{Version: build.Version, Filename: defaultInstallerPackageArtifact}, + Env: mockEnv, + FileWriter: mockFileWriter, + } + }) + + It("downloads and verifies the upstream package", func() { + mockPortal.EXPECT().GetBuild(portal.CodesphereProduct, build.Version, "").Return(build, nil) + + destination := filepath.Join(workdir, build.BuildPackageFilename(defaultInstallerPackageArtifact)) + fakeFile := os.NewFile(uintptr(0), destination) + mockFileWriter.EXPECT().Create(destination).Return(fakeFile, nil) + mockFileWriter.EXPECT().Open(destination).Return(fakeFile, nil) + mockPortal.EXPECT().DownloadBuildArtifact(portal.CodesphereProduct, mock.Anything, mock.Anything, 0, false).Return(nil) + mockPortal.EXPECT().VerifyBuildArtifactDownload(mock.Anything, mock.Anything).Return(nil) + + path, err := command.resolvePackage(mockPortal) + Expect(err).NotTo(HaveOccurred()) + Expect(path).To(Equal(destination)) + }) + + It("returns an error when the upstream package cannot be found", func() { + mockPortal.EXPECT().GetBuild(portal.CodesphereProduct, build.Version, "").Return(portal.Build{}, fmt.Errorf("build not found")) + + _, err := command.resolvePackage(mockPortal) + Expect(err).To(MatchError(ContainSubstring("failed to get upstream package"))) + }) + }) +}) diff --git a/cli/cmd/download_package.go b/cli/cmd/download_package.go index fa671a2bc..eec532c75 100644 --- a/cli/cmd/download_package.go +++ b/cli/cmd/download_package.go @@ -96,43 +96,13 @@ func AddDownloadPackageCmd(download *cobra.Command, opts *util.GlobalOptions) { } func (c *DownloadPackageCmd) DownloadBuild(p portal.Portal, build portal.Build, filename string) error { - download, err := build.GetBuildForDownload(filename) - if err != nil { - return fmt.Errorf("failed to find artifact in package: %w", err) - } - fullFilename := build.BuildPackageFilename(filename) - out, err := c.FileWriter.OpenAppend(fullFilename) - if err != nil { - out, err = c.FileWriter.Create(fullFilename) - if err != nil { - return fmt.Errorf("failed to create file %s: %w", fullFilename, err) - } - } - defer intutil.CloseFileIgnoreError(out) - - // get already downloaded file size of fullFilename - fileSize := 0 - fileInfo, err := out.Stat() - if err == nil { - fileSize = int(fileInfo.Size()) - } - err = p.DownloadBuildArtifact("codesphere", download, out, fileSize, c.Opts.Quiet) - if err != nil { - return fmt.Errorf("failed to download build: %w", err) + if err := portal.DownloadAndVerifyBuild(p, c.FileWriter, portal.CodesphereProduct, build, filename, fullFilename, portal.DownloadOptions{ + Resume: true, + Quiet: c.Opts.Quiet, + }); err != nil { + return fmt.Errorf("failed to download and verify build: %w", err) } - - verifyFile, err := c.FileWriter.Open(fullFilename) - if err != nil { - return err - } - defer intutil.CloseFileIgnoreError(verifyFile) - - err = p.VerifyBuildArtifactDownload(verifyFile, download) - if err != nil { - return fmt.Errorf("failed to verify artifact: %w", err) - } - return nil } diff --git a/cli/cmd/download_package_test.go b/cli/cmd/download_package_test.go index c38fe1dc8..93c388627 100644 --- a/cli/cmd/download_package_test.go +++ b/cli/cmd/download_package_test.go @@ -242,7 +242,7 @@ var _ = Describe("DownloadPackages", func() { Context("File doesn't exist in build", func() { It("Returns an error", func() { err := c.DownloadBuild(mockPortal, build, "installer-lite.tar.gz") - Expect(err).To(MatchError("failed to find artifact in package: artifact not found: installer-lite.tar.gz")) + Expect(err).To(MatchError("failed to download and verify build: failed to find artifact in package: artifact not found: installer-lite.tar.gz")) }) }) }) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 591b1c8b0..e27db81ba 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -61,6 +61,7 @@ func GetRootCmd() *cobra.Command { // Package commands AddListCmd(rootCmd, opts) AddDownloadCmd(rootCmd, opts) + AddCopyCmd(rootCmd, opts) AddInstallCmd(rootCmd, opts) AddInitCmd(rootCmd, opts) AddTemplateCmd(rootCmd, opts) diff --git a/docs/README.md b/docs/README.md index dbbe2f036..e9dcd6a79 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,6 +20,7 @@ like downloading new versions. * [oms add-cluster-admin](oms_add-cluster-admin.md) - Set the cluster admin email in a Kubernetes secret * [oms beta](oms_beta.md) - Commands for early testing * [oms build](oms_build.md) - Build and push images to a registry +* [oms copy](oms_copy.md) - Copy resources between locations * [oms create](oms_create.md) - Create resources for Codesphere * [oms download](oms_download.md) - Download resources available through OMS * [oms init](oms_init.md) - Initialize configuration files diff --git a/docs/oms.md b/docs/oms.md index dbbe2f036..e9dcd6a79 100644 --- a/docs/oms.md +++ b/docs/oms.md @@ -20,6 +20,7 @@ like downloading new versions. * [oms add-cluster-admin](oms_add-cluster-admin.md) - Set the cluster admin email in a Kubernetes secret * [oms beta](oms_beta.md) - Commands for early testing * [oms build](oms_build.md) - Build and push images to a registry +* [oms copy](oms_copy.md) - Copy resources between locations * [oms create](oms_create.md) - Create resources for Codesphere * [oms download](oms_download.md) - Download resources available through OMS * [oms init](oms_init.md) - Initialize configuration files diff --git a/docs/oms_copy.md b/docs/oms_copy.md new file mode 100644 index 000000000..1bec67719 --- /dev/null +++ b/docs/oms_copy.md @@ -0,0 +1,20 @@ +## oms copy + +Copy resources between locations + +### Synopsis + +Copy resources managed by OMS between locations, +e.g. package container images and OCI Helm charts between registries. + +### Options + +``` + -h, --help help for copy +``` + +### SEE ALSO + +* [oms](oms.md) - Codesphere Operations Management System (OMS) +* [oms copy package](oms_copy_package.md) - Copy all images and Helm charts from an installer package + diff --git a/docs/oms_copy_package.md b/docs/oms_copy_package.md new file mode 100644 index 000000000..884df9bb4 --- /dev/null +++ b/docs/oms_copy_package.md @@ -0,0 +1,47 @@ +## oms copy package + +Copy all images and Helm charts from an installer package + +### Synopsis + +Read all container images and OCI Helm charts from an installer package BOM +and copy them to another registry. + +Use --package for a local installer package or --version to download one +from the OMS portal. The source repository paths are preserved below --dest. + +``` +oms copy package [flags] +``` + +### Examples + +``` +# Copy artifacts from a local package +$ oms copy package --package codesphere-v1.70.0-installer-lite.tar.gz --dest registry.example.com/mirror + +# Download an upstream package and copy without prompting +$ oms copy package --version codesphere-v1.70.0 --dest registry.example.com/mirror --yes + +``` + +### Options + +``` + --dest string Destination registry or repository prefix + -f, --file string Installer artifact to download for an upstream package (default "installer-lite.tar.gz") + --force Re-extract the installer package + -H, --hash string Build hash used to disambiguate an upstream package version + -h, --help help for package + --insecure Allow image references to be fetched without TLS + -p, --package string Path to a local installer package + --show-artifacts Print the source and destination of every artifact to copy + -v, --verbose Enable debug logs + -V, --version string Codesphere package version to download from the OMS portal + -y, --yes Copy without prompting for confirmation +``` + +### SEE ALSO + +* [oms copy](oms_copy.md) - Copy resources between locations + diff --git a/go.mod b/go.mod index 39a0a8470..c5f633874 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 + github.com/google/go-containerregistry v0.21.7 github.com/google/go-github/v74 v74.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 @@ -46,6 +47,9 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 + github.com/prometheus/client_golang v1.24.1 + github.com/prometheus/common v0.70.1 + github.com/prometheus/prometheus v0.51.0 github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 @@ -57,6 +61,7 @@ require ( google.golang.org/api v0.293.0 google.golang.org/grpc v1.83.1 google.golang.org/protobuf v1.36.12 + gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 k8s.io/api v0.36.4 @@ -342,7 +347,6 @@ require ( github.com/google/certificate-transparency-go v1.3.3 // indirect github.com/google/gnostic-models v0.7.1 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/go-containerregistry v0.21.7 // indirect github.com/google/go-github/v69 v69.2.0 // indirect github.com/google/go-github/v86 v86.0.0 // indirect github.com/google/go-github/v88 v88.0.0 // indirect @@ -372,6 +376,7 @@ require ( github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/gosuri/uitable v0.0.4 // indirect + github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -414,6 +419,7 @@ require ( github.com/jjti/go-spancheck v0.6.5 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/julz/importas v0.2.0 // indirect github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.7 // indirect @@ -490,6 +496,7 @@ require ( github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-varint v0.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect @@ -513,9 +520,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.90.0 // indirect github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect - github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/quasilyte/go-ruleguard v0.4.5 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect @@ -651,7 +656,6 @@ require ( gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/validator.v2 v2.0.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.8.0 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect k8s.io/apiserver v0.36.4 // indirect diff --git a/go.sum b/go.sum index d4ec461b0..6d7499e69 100644 --- a/go.sum +++ b/go.sum @@ -3504,6 +3504,7 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= @@ -3513,6 +3514,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -3974,6 +3977,8 @@ github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+ github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/graph-gophers/graphql-go v1.9.0 h1:yu0ucKHLc5qGpRwLYKIWtr9bOoxovkWasuBrPQwlHls= github.com/graph-gophers/graphql-go v1.9.0/go.mod h1:23olKZ7duEvHlF/2ELEoSZaY1aNPfShjP782SOoNTyM= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -4158,6 +4163,7 @@ github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7X github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -4443,6 +4449,7 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= @@ -4672,6 +4679,8 @@ github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlT github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= +github.com/prometheus/prometheus v0.51.0 h1:aRdjTnmHLved29ILtdzZN2GNvOjWATtA/z+3fYuexOc= +github.com/prometheus/prometheus v0.51.0/go.mod h1:yv4MwOn3yHMQ6MZGHPg/U7Fcyqf+rxqiZfSur6myVtc= github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= diff --git a/internal/installer/bom/bom.go b/internal/installer/bom/bom.go index a532acb79..a83ca1af2 100644 --- a/internal/installer/bom/bom.go +++ b/internal/installer/bom/bom.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "os" + "sort" "github.com/distribution/reference" ) @@ -17,6 +18,36 @@ type Config struct { Migrations MigrationsConfig `json:"migrations"` } +// GetOCIArtifacts returns every container image and OCI Helm chart referenced +// by the BOM. Duplicate references are returned only once and the result is +// sorted so callers can present a stable transfer plan. +func (b *Config) GetOCIArtifacts() []string { + artifacts := map[string]struct{}{} + + for _, component := range b.Components { + for _, image := range component.ContainerImages { + if image != "" { + artifacts[image] = struct{}{} + } + } + + for _, file := range component.Files { + if file.OciRef != "" { + artifacts[file.OciRef] = struct{}{} + } + } + } + + result := make([]string, 0, len(artifacts)) + for artifact := range artifacts { + result = append(result, artifact) + } + + sort.Strings(result) + + return result +} + // ComponentConfig represents a component in the BOM. type ComponentConfig struct { ContainerImages map[string]string `json:"containerImages,omitempty"` diff --git a/internal/installer/bom/bom_test.go b/internal/installer/bom/bom_test.go index 0576388bd..2c71d4f44 100644 --- a/internal/installer/bom/bom_test.go +++ b/internal/installer/bom/bom_test.go @@ -213,4 +213,34 @@ var _ = Describe("Bom", func() { Expect(images).To(BeEmpty()) }) }) + + Describe("GetOCIArtifacts", func() { + It("returns sorted unique container images and OCI Helm charts from all components", func() { + cfg := &bom.Config{Components: map[string]bom.ComponentConfig{ + "codesphere": { + ContainerImages: map[string]string{ + "api": "ghcr.io/codesphere/api:v1", + }, + Files: map[string]bom.FileRef{ + "chart": {OciRef: "oci://ghcr.io/codesphere/charts/codesphere:v1"}, + }, + }, + "dependency": { + ContainerImages: map[string]string{ + "duplicate": "ghcr.io/codesphere/api:v1", + "redis": "docker.io/library/redis:7", + }, + Files: map[string]bom.FileRef{ + "not-oci": {SrcUrl: "https://example.com/file.tgz"}, + }, + }, + }} + + Expect(cfg.GetOCIArtifacts()).To(Equal([]string{ + "docker.io/library/redis:7", + "ghcr.io/codesphere/api:v1", + "oci://ghcr.io/codesphere/charts/codesphere:v1", + })) + }) + }) }) diff --git a/internal/installer/package_copy.go b/internal/installer/package_copy.go new file mode 100644 index 000000000..304c1f823 --- /dev/null +++ b/internal/installer/package_copy.go @@ -0,0 +1,140 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/codesphere-cloud/oms/internal/installer/bom" + "github.com/google/go-containerregistry/pkg/crane" + "github.com/google/go-containerregistry/pkg/logs" + "github.com/google/go-containerregistry/pkg/name" +) + +// PackageArtifact describes one image or OCI Helm chart transfer. +type PackageArtifact struct { + Source string + Destination string +} + +// ArtifactCopier copies an image or OCI artifact between registries. +type ArtifactCopier interface { + Copy(ctx context.Context, source, destination string) error +} + +// CraneArtifactCopier uses go-containerregistry's crane package for transfers. +type CraneArtifactCopier struct { + Insecure bool +} + +// Copy transfers one remote image or OCI artifact with crane. +func (c *CraneArtifactCopier) Copy(ctx context.Context, source, destination string) error { + options := []crane.Option{crane.WithContext(ctx), crane.WithNondistributable()} + if c.Insecure { + options = append(options, crane.Insecure) + } + if err := crane.Copy(source, destination, options...); err != nil { + return fmt.Errorf("crane copy failed: %w", err) + } + + return nil +} + +// ReadPackageArtifacts reads all images and OCI Helm charts from a BOM and +// builds their destination references. The original repository path is kept +// below dest so repositories with the same basename cannot collide. +func ReadPackageArtifacts(bomPath, dest string) ([]PackageArtifact, error) { + bomConfig, err := bom.Parse(bomPath) + if err != nil { + return nil, fmt.Errorf("failed to parse BOM: %w", err) + } + + references := bomConfig.GetOCIArtifacts() + + artifacts := make([]PackageArtifact, 0, len(references)) + for _, source := range references { + destination, err := PackageArtifactDestination(source, dest) + if err != nil { + return nil, err + } + + artifacts = append(artifacts, PackageArtifact{ + Source: strings.TrimPrefix(source, "oci://"), + Destination: destination, + }) + } + + return artifacts, nil +} + +// PackageArtifactDestination maps a source reference below a destination +// registry or repository prefix while preserving its tag or digest. +func PackageArtifactDestination(source, dest string) (string, error) { + source = strings.TrimPrefix(source, "oci://") + + dest = strings.TrimSuffix(strings.TrimPrefix(dest, "oci://"), "/") + if dest == "" { + return "", fmt.Errorf("destination registry must not be empty") + } + + sourceRef, err := name.ParseReference(source) + if err != nil { + return "", fmt.Errorf("invalid package artifact reference %q: %w", source, err) + } + + separator := ":" + if _, ok := sourceRef.(name.Digest); ok { + separator = "@" + } + + candidate := dest + "/" + sourceRef.Context().RepositoryStr() + separator + sourceRef.Identifier() + + destinationRef, err := name.ParseReference(candidate) + if err != nil { + return "", fmt.Errorf("invalid destination reference %q: %w", candidate, err) + } + + return destinationRef.Name(), nil +} + +// CopyPackageArtifacts transfers the prepared package artifacts in order, +// printing a single updating progress bar. Crane's own log output is +// captured rather than written to the terminal, so it doesn't clutter the +// progress bar; it's only surfaced if a copy fails. +func CopyPackageArtifacts(ctx context.Context, copier ArtifactCopier, artifacts []PackageArtifact) error { + total := len(artifacts) + start := time.Now() + + var craneOutput bytes.Buffer + logs.Warn.SetOutput(&craneOutput) + logs.Progress.SetOutput(&craneOutput) + defer func() { + logs.Warn.SetOutput(io.Discard) + logs.Progress.SetOutput(io.Discard) + }() + + for i, artifact := range artifacts { + craneOutput.Reset() + fmt.Printf("\r\033[2K%3d%% (%d/%d) %s %s -> %s", i*100/max(total, 1), i, total, time.Since(start).Round(time.Second), artifact.Source, artifact.Destination) + + if err := copier.Copy(ctx, artifact.Source, artifact.Destination); err != nil { + fmt.Println() + if craneOutput.Len() > 0 { + fmt.Fprint(os.Stderr, craneOutput.String()) + } + + return fmt.Errorf("failed to copy %s to %s: %w", artifact.Source, artifact.Destination, err) + } + } + + fmt.Printf("\r\033[2KCopied %d artifacts in %s\n", total, time.Since(start).Round(time.Second)) + + return nil +} diff --git a/internal/installer/package_copy_test.go b/internal/installer/package_copy_test.go new file mode 100644 index 000000000..81db16a5f --- /dev/null +++ b/internal/installer/package_copy_test.go @@ -0,0 +1,98 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer_test + +import ( + "context" + "errors" + "os" + "path/filepath" + + "github.com/codesphere-cloud/oms/internal/installer" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +type recordingArtifactCopier struct { + copies []installer.PackageArtifact + err error +} + +func (c *recordingArtifactCopier) Copy(_ context.Context, source, destination string) error { + c.copies = append(c.copies, installer.PackageArtifact{Source: source, Destination: destination}) + return c.err +} + +var _ = Describe("Package artifact copying", func() { + Describe("PackageArtifactDestination", func() { + It("preserves the source repository path and tag below the destination", func() { + destination, err := installer.PackageArtifactDestination( + "oci://ghcr.io/codesphere-cloud/charts/pc-apps:1.2.3", + "oci://registry.example.com/private-cloud/", + ) + + Expect(err).NotTo(HaveOccurred()) + Expect(destination).To(Equal("registry.example.com/private-cloud/codesphere-cloud/charts/pc-apps:1.2.3")) + }) + + It("preserves digests", func() { + destination, err := installer.PackageArtifactDestination( + "ghcr.io/codesphere-cloud/api@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "registry.example.com/mirror", + ) + + Expect(err).NotTo(HaveOccurred()) + Expect(destination).To(Equal("registry.example.com/mirror/codesphere-cloud/api@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) + }) + + It("rejects an empty destination", func() { + _, err := installer.PackageArtifactDestination("ghcr.io/codesphere/api:v1", "") + Expect(err).To(MatchError("destination registry must not be empty")) + }) + }) + + Describe("ReadPackageArtifacts", func() { + It("reads images and charts and prepares a stable transfer plan", func() { + tempDir := GinkgoT().TempDir() + bomPath := filepath.Join(tempDir, "bom.json") + Expect(os.WriteFile(bomPath, []byte(`{ + "components": { + "codesphere": { + "containerImages": {"api": "ghcr.io/codesphere/api:v1"}, + "files": {"chart": {"ociRef": "oci://ghcr.io/codesphere/charts/app:v1"}} + } + } + }`), 0644)).To(Succeed()) + + artifacts, err := installer.ReadPackageArtifacts(bomPath, "registry.example.com/mirror") + Expect(err).NotTo(HaveOccurred()) + Expect(artifacts).To(Equal([]installer.PackageArtifact{ + {Source: "ghcr.io/codesphere/api:v1", Destination: "registry.example.com/mirror/codesphere/api:v1"}, + {Source: "ghcr.io/codesphere/charts/app:v1", Destination: "registry.example.com/mirror/codesphere/charts/app:v1"}, + })) + }) + }) + + Describe("CopyPackageArtifacts", func() { + It("copies all artifacts in order", func() { + copier := &recordingArtifactCopier{} + artifacts := []installer.PackageArtifact{ + {Source: "source/one:v1", Destination: "dest/one:v1"}, + {Source: "source/two:v2", Destination: "dest/two:v2"}, + } + + Expect(installer.CopyPackageArtifacts(context.Background(), copier, artifacts)).To(Succeed()) + Expect(copier.copies).To(Equal(artifacts)) + }) + + It("adds source and destination context to copy failures", func() { + copier := &recordingArtifactCopier{err: errors.New("denied")} + err := installer.CopyPackageArtifacts(context.Background(), copier, []installer.PackageArtifact{ + {Source: "source/one:v1", Destination: "dest/one:v1"}, + }) + + Expect(err).To(MatchError("failed to copy source/one:v1 to dest/one:v1: denied")) + }) + }) +}) diff --git a/internal/portal/download.go b/internal/portal/download.go new file mode 100644 index 000000000..3052b2818 --- /dev/null +++ b/internal/portal/download.go @@ -0,0 +1,73 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package portal + +import ( + "fmt" + "os" + + intutil "github.com/codesphere-cloud/oms/internal/util" +) + +// DownloadOptions configures DownloadAndVerifyBuild. +type DownloadOptions struct { + // Resume appends to an existing partial download at destination instead + // of always starting over. + Resume bool + // Quiet suppresses download progress output. + Quiet bool +} + +// DownloadAndVerifyBuild downloads the named artifact from build to destination +// and verifies its checksum. It is shared by the download and copy package +// commands so their download and verify behavior stays in sync. +func DownloadAndVerifyBuild(p Portal, fileWriter intutil.FileIO, product Product, build Build, filename, destination string, opts DownloadOptions) error { + download, err := build.GetBuildForDownload(filename) + if err != nil { + return fmt.Errorf("failed to find artifact in package: %w", err) + } + + out, err := openDestination(fileWriter, destination, opts.Resume) + if err != nil { + return fmt.Errorf("failed to open pckage destination file: %w", err) + } + defer intutil.CloseFileIgnoreError(out) + + fileSize := 0 + if opts.Resume { + if fileInfo, statErr := out.Stat(); statErr == nil { + fileSize = int(fileInfo.Size()) + } + } + + if err := p.DownloadBuildArtifact(product, download, out, fileSize, opts.Quiet); err != nil { + return fmt.Errorf("failed to download build: %w", err) + } + + verifyFile, err := fileWriter.Open(destination) + if err != nil { + return fmt.Errorf("failed to open %q: %w", destination, err) + } + defer intutil.CloseFileIgnoreError(verifyFile) + + if err := p.VerifyBuildArtifactDownload(verifyFile, download); err != nil { + return fmt.Errorf("failed to verify artifact: %w", err) + } + + return nil +} + +func openDestination(fileWriter intutil.FileIO, destination string, resume bool) (*os.File, error) { + if resume { + if out, err := fileWriter.OpenAppend(destination); err == nil { + return out, nil + } + } + + file, err := fileWriter.Create(destination) + if err != nil { + return nil, fmt.Errorf("failed to open file at %q: %w", destination, err) + } + return file, nil +} diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index aa977a531..bdfa3f4e8 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -357,6 +357,18 @@ Version: v1.12.0 License: MIT License URL: https://github.com/dlclark/regexp2/blob/v1.12.0/LICENSE +---------- +Module: github.com/docker/cli/cli/config +Version: v29.6.2 +License: Apache-2.0 +License URL: https://github.com/docker/cli/blob/v29.6.2/LICENSE + +---------- +Module: github.com/docker/docker-credential-helpers +Version: v0.9.8 +License: MIT +License URL: https://github.com/docker/docker-credential-helpers/blob/v0.9.8/LICENSE + ---------- Module: github.com/dylibso/observe-sdk/go Version: v0.0.0-20240828172851-9145d8ad07e1 @@ -651,6 +663,12 @@ Version: v0.7.0 License: BSD-3-Clause License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE +---------- +Module: github.com/google/go-containerregistry +Version: v0.21.7 +License: Apache-2.0 +License URL: https://github.com/google/go-containerregistry/blob/v0.21.7/LICENSE + ---------- Module: github.com/google/go-github/v69/github Version: v69.2.0 @@ -868,29 +886,41 @@ License: MIT License URL: https://github.com/kevinburke/ssh_config/blob/v1.6.0/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: MIT License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: Apache-2.0 License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE ---------- -Module: github.com/klauspost/compress/internal +Module: github.com/klauspost/compress Version: v1.19.1 License: BSD-3-Clause License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +---------- +Module: github.com/klauspost/compress/internal/snapref +Version: v1.19.1 +License: BSD-3-Clause +License URL: https://github.com/klauspost/compress/blob/v1.19.1/internal/snapref/LICENSE + ---------- Module: github.com/klauspost/compress/s2 Version: v1.19.1 License: BSD-3-Clause License URL: https://github.com/klauspost/compress/blob/v1.19.1/s2/LICENSE +---------- +Module: github.com/klauspost/compress/zstd/internal/xxhash +Version: v1.19.1 +License: MIT +License URL: https://github.com/klauspost/compress/blob/v1.19.1/zstd/internal/xxhash/LICENSE.txt + ---------- Module: github.com/klauspost/cpuid/v2 Version: v2.3.0 From 9a4198a39a41961356e06018167e11f498a818df Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 17:04:22 +0000 Subject: [PATCH 047/132] update(deps): update module github.com/prometheus/prometheus to v0.311.3 [security] (#724) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/prometheus/prometheus](https://redirect.github.com/prometheus/prometheus) | `v0.51.0` → `v0.311.3` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fprometheus%2fprometheus/v0.311.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fprometheus%2fprometheus/v0.51.0/v0.311.3?slim=true) | --- ### Prometheus has Stored XSS via metric names and label values in Prometheus web UI tooltips and metrics explorer [CVE-2026-40179](https://nvd.nist.gov/vuln/detail/CVE-2026-40179) / [GHSA-vffh-x6r8-xx99](https://redirect.github.com/advisories/GHSA-vffh-x6r8-xx99)
More information #### Details ##### Impact Stored cross-site scripting (XSS) via crafted metric names in the Prometheus web UI: * **Old React UI + New Mantine UI:** When a user hovers over a chart tooltip on the Graph page, metric names containing HTML/JavaScript are injected into `innerHTML` without escaping, causing arbitrary script execution in the user's browser. * **Old React UI only:** When a user opens the Metric Explorer (globe icon next to the PromQL expression input field), and a metric name containing HTML/JavaScript is rendered in the fuzzy search results, it is injected into `innerHTML` without escaping, causing arbitrary script execution in the user's browser. * **Old React UI only:** When a user views a heatmap chart and hovers over a cell, the `le` label values of the underlying histogram buckets are interpolated into `innerHTML` without escaping. While `le` is conventionally a numeric bucket boundary, Prometheus does not enforce this — arbitrary UTF-8 strings are accepted as label values, allowing script injection via a crafted scrape target or remote write. With Prometheus v3.x defaulting to UTF-8 metric and label name validation, characters like `<`, `>`, and `"` are now valid in metric names and labels, making this exploitable. An attacker who can inject metrics (via a compromised scrape target, remote write, or OTLP receiver endpoint) can execute JavaScript in the browser of any Prometheus user who views the metric in the Graph UI. From the XSS context, an attacker could for example: - Read `/api/v1/status/config` to extract sensitive configuration (although credentials / secrets are redacted by the server) - Call `/-/quit` to shut down Prometheus (only if `--web.enable-lifecycle` is set) - Call `/api/v1/admin/tsdb/delete_series` to delete data (only if `--web.enable-admin-api` is set) - Exfiltrate metric data to an external server Both the new Mantine UI and the old React UI are affected. The vulnerable code paths are: - `web/ui/mantine-ui/src/pages/query/uPlotChartHelpers.ts` — tooltip `innerHTML` with unescaped `labels.__name__` - `web/ui/react-app/src/pages/graph/GraphHelpers.ts` — tooltip content with unescaped `labels.__name__` - `web/ui/react-app/src/pages/graph/MetricsExplorer.tsx` — fuzzy search results rendered via `dangerouslySetInnerHTML` without sanitization - `web/ui/react-app/src/vendor/flot/jquery.flot.heatmap.js` — heatmap tooltip with unescaped label values ##### Patches A patch has been published in Prometheus 3.5.2 LTS and Prometheus 3.11.2. The fix applies `escapeHTML()` to all user-controlled values (metric names and label values) before inserting them into `innerHTML`. This advisory will be updated with the patched version once released. ##### Workarounds - If using the remote write receiver (`--web.enable-remote-write-receiver`), ensure it is not exposed to untrusted sources. - If using the OTLP receiver (`--web.enable-otlp-receiver`), ensure it is not exposed to untrusted sources. - Ensure scrape targets are trusted and not under attacker control. - Do not enable admin / mutating API endpoints (e.g. `--web.enable-admin-api` or `web.enable-lifecycle`) in cases where you cannot prevent untrusted data from being ingested. - Users should avoid clicking untrusted links, especially those containing functions such as label_replace, as they may generate poisoned label names and values. ##### Acknowledgements Thanks to @​gladiator9797 (Duc Anh Nguyen from TinyxLab) for reporting this. #### Severity - CVSS Score: 5.3 / 10 (Medium) - Vector String: `CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N` #### References - [https://github.com/prometheus/prometheus/security/advisories/GHSA-vffh-x6r8-xx99](https://redirect.github.com/prometheus/prometheus/security/advisories/GHSA-vffh-x6r8-xx99) - [https://github.com/prometheus/prometheus/pull/18506](https://redirect.github.com/prometheus/prometheus/pull/18506) - [https://github.com/prometheus/prometheus/commit/07c6232d159bfb474a077788be184d87adcfac3c](https://redirect.github.com/prometheus/prometheus/commit/07c6232d159bfb474a077788be184d87adcfac3c) - [https://nvd.nist.gov/vuln/detail/CVE-2026-40179](https://nvd.nist.gov/vuln/detail/CVE-2026-40179) - [https://github.com/advisories/GHSA-vffh-x6r8-xx99](https://redirect.github.com/advisories/GHSA-vffh-x6r8-xx99) This data is provided by the [GitHub Advisory Database](https://redirect.github.com/advisories/GHSA-vffh-x6r8-xx99) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
--- ### Prometheus Azure AD remote write OAuth client secret exposed via config API [CVE-2026-42151](https://nvd.nist.gov/vuln/detail/CVE-2026-42151) / [GHSA-wg65-39gg-5wfj](https://redirect.github.com/advisories/GHSA-wg65-39gg-5wfj)
More information #### Details ##### Impact Users who use Azure AD remote write with OAuth authentication are impacted. The `client_secret` field in the Azure AD remote write OAuth configuration (`storage/remote/azuread`) was typed as `string` instead of `Secret`. Prometheus redacts fields of type `Secret` when serving the configuration via the `/-/config` HTTP API endpoint. Because the field was a plain string, the Azure OAuth client secret was exposed in plaintext to any user or process with access to that endpoint. ##### Patches The problem has been patched by changing `ClientSecret` in `OAuthConfig` to `Secret`. Users should upgrade to 3.11.3 or 3.5.3 LTS. ##### Workarounds Users who can not upgrade can switch to Managed Identity or Workload Identity authentication for Azure AD remote write, which do not involve a client secret. #### Severity - CVSS Score: 7.5 / 10 (High) - Vector String: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N` #### References - [https://github.com/prometheus/prometheus/security/advisories/GHSA-wg65-39gg-5wfj](https://redirect.github.com/prometheus/prometheus/security/advisories/GHSA-wg65-39gg-5wfj) - [https://nvd.nist.gov/vuln/detail/CVE-2026-42151](https://nvd.nist.gov/vuln/detail/CVE-2026-42151) - [https://github.com/prometheus/prometheus/pull/18587](https://redirect.github.com/prometheus/prometheus/pull/18587) - [https://github.com/prometheus/prometheus/pull/18590](https://redirect.github.com/prometheus/prometheus/pull/18590) - [https://github.com/prometheus/prometheus/releases/tag/v3.11.3](https://redirect.github.com/prometheus/prometheus/releases/tag/v3.11.3) - [https://github.com/prometheus/prometheus/releases/tag/v3.5.3](https://redirect.github.com/prometheus/prometheus/releases/tag/v3.5.3) - [https://github.com/advisories/GHSA-wg65-39gg-5wfj](https://redirect.github.com/advisories/GHSA-wg65-39gg-5wfj) This data is provided by the [GitHub Advisory Database](https://redirect.github.com/advisories/GHSA-wg65-39gg-5wfj) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
--- ### Prometheus vulnerable to stored XSS via crafted histogram bucket label values in the old web UI heatmap display [CVE-2026-44903](https://nvd.nist.gov/vuln/detail/CVE-2026-44903) / [GHSA-fw8g-cg8f-9j28](https://redirect.github.com/advisories/GHSA-fw8g-cg8f-9j28)
More information #### Details ##### Impact In the Prometheus server's legacy web UI (enabled via the command-line flag `--enable-feature=old-ui`), the histogram heatmap chart view does not escape `le` label values when inserting them into the HTML for use as axis tick mark labels. An attacker who can inject crafted metrics (e.g. via a compromised scrape target, remote write, or OTLP receiver endpoint) can execute JavaScript in the browser of any Prometheus user who views the metric in the heatmap chart UI. From the XSS context, an attacker could for example: - Read `/api/v1/status/config` to extract sensitive configuration (although credentials / secrets are redacted by the server) - Call `/-/quit` to shut down Prometheus (only if `--web.enable-lifecycle` is set) - Call `/api/v1/admin/tsdb/delete_series` to delete data (only if `--web.enable-admin-api` is set) - Exfiltrate metric data to an external server Note that this only affects users who have explicitly enabled the legacy Prometheus web UI using the `--enable-feature=old-ui` command-line flag. ##### Patches https://github.com/prometheus/prometheus/commit/38f23b9075ced1de2b82d2dad8b2bebb1ecd5b7d ##### Workarounds If at all possible, disable the legacy web UI by removing the `--enable-feature=old-ui` command-line flag). If this is not an option, take the following precautions: - If using the remote write receiver (`--web.enable-remote-write-receiver`), ensure it is not exposed to untrusted sources. - If using the OTLP receiver (`--web.enable-otlp-receiver`), ensure it is not exposed to untrusted sources. - Ensure scrape targets are trusted and not under attacker control. - Do not enable admin / mutating API endpoints (e.g. `--web.enable-admin-api` or `web.enable-lifecycle`) in cases where you cannot prevent untrusted data from being ingested. - Users should avoid clicking untrusted links, especially those containing functions such as `label_replace`, as they may generate poisoned label names and values. ##### References - CVE-2019-10215 — prior stored DOM XSS vulnerability in Prometheus query history, fixed in v2.7.2 - CVE-2026-40179 — prior stored DOM XSS vulnerability in Prometheus web UI (hover tooltips and metrics explorer), fixed in v3.11.2 #### Severity - CVSS Score: 5.1 / 10 (Medium) - Vector String: `CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N` #### References - [https://github.com/prometheus/prometheus/security/advisories/GHSA-fw8g-cg8f-9j28](https://redirect.github.com/prometheus/prometheus/security/advisories/GHSA-fw8g-cg8f-9j28) - [https://github.com/prometheus/prometheus/commit/38f23b9075ced1de2b82d2dad8b2bebb1ecd5b7d](https://redirect.github.com/prometheus/prometheus/commit/38f23b9075ced1de2b82d2dad8b2bebb1ecd5b7d) - [https://nvd.nist.gov/vuln/detail/CVE-2026-44903](https://nvd.nist.gov/vuln/detail/CVE-2026-44903) - [https://github.com/advisories/GHSA-fw8g-cg8f-9j28](https://redirect.github.com/advisories/GHSA-fw8g-cg8f-9j28) This data is provided by the [GitHub Advisory Database](https://redirect.github.com/advisories/GHSA-fw8g-cg8f-9j28) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
--- ### Prometheus: Remote read endpoint allows denial of service via crafted snappy payload [CVE-2026-42154](https://nvd.nist.gov/vuln/detail/CVE-2026-42154) / [GHSA-8rm2-7qqf-34qm](https://redirect.github.com/advisories/GHSA-8rm2-7qqf-34qm)
More information #### Details ##### Impact The remote read endpoint (`/api/v1/read`) does not validate the declared decoded length in a snappy-compressed request body before allocating memory. An unauthenticated attacker can send a small payload that causes a huge heap allocation per request. Under concurrent load this can exhaust available memory and crash the Prometheus process. ##### Patches _Has the problem been patched? What versions should users upgrade to?_ Fixed in 3.11.3 and 3.5.3 LTS. Users should upgrade to these versions or later. ##### Workarounds User who can not upgrade can place Prometheus behind a reverse proxy or firewall that requires authentication before requests reach /api/v1/read. #### Severity - CVSS Score: 7.5 / 10 (High) - Vector String: `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H` #### References - [https://github.com/prometheus/prometheus/security/advisories/GHSA-8rm2-7qqf-34qm](https://redirect.github.com/prometheus/prometheus/security/advisories/GHSA-8rm2-7qqf-34qm) - [https://nvd.nist.gov/vuln/detail/CVE-2026-42154](https://nvd.nist.gov/vuln/detail/CVE-2026-42154) - [https://github.com/prometheus/prometheus/pull/18584](https://redirect.github.com/prometheus/prometheus/pull/18584) - [https://github.com/prometheus/prometheus/pull/18585](https://redirect.github.com/prometheus/prometheus/pull/18585) - [https://github.com/prometheus/prometheus/releases/tag/v3.11.3](https://redirect.github.com/prometheus/prometheus/releases/tag/v3.11.3) - [https://github.com/prometheus/prometheus/releases/tag/v3.5.3](https://redirect.github.com/prometheus/prometheus/releases/tag/v3.5.3) - [https://github.com/advisories/GHSA-8rm2-7qqf-34qm](https://redirect.github.com/advisories/GHSA-8rm2-7qqf-34qm) This data is provided by the [GitHub Advisory Database](https://redirect.github.com/advisories/GHSA-8rm2-7qqf-34qm) ([CC-BY 4.0](https://redirect.github.com/github/advisory-database/blob/main/LICENSE.md)).
--- ### Release Notes
prometheus/prometheus (github.com/prometheus/prometheus) ### [`v0.311.3`](https://redirect.github.com/prometheus/prometheus/compare/v0.311.2...v0.311.3) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.311.2...v0.311.3) ### [`v0.311.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.311.1...v0.311.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.311.1...v0.311.2) ### [`v0.311.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.311.0...v0.311.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.311.0...v0.311.1) ### [`v0.311.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.310.0...v0.311.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.310.0...v0.311.0) ### [`v0.310.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.309.1...v0.310.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.309.1...v0.310.0) ### [`v0.309.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.309.0...v0.309.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.309.0...v0.309.1) ### [`v0.309.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.308.1...v0.309.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.308.1...v0.309.0) ### [`v0.308.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.308.0...v0.308.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.308.0...v0.308.1) ### [`v0.308.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.307.3...v0.308.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.307.3...v0.308.0) ### [`v0.307.3`](https://redirect.github.com/prometheus/prometheus/compare/v0.307.2...v0.307.3) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.307.2...v0.307.3) ### [`v0.307.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.307.1...v0.307.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.307.1...v0.307.2) ### [`v0.307.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.307.0...v0.307.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.307.0...v0.307.1) ### [`v0.307.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.306.0...v0.307.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.306.0...v0.307.0) ### [`v0.306.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.5...v0.306.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.5...v0.306.0) ### [`v0.305.5`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.4...v0.305.5) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.4...v0.305.5) ### [`v0.305.4`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.3...v0.305.4) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.3...v0.305.4) ### [`v0.305.3`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.2...v0.305.3) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.2...v0.305.3) ### [`v0.305.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.1...v0.305.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.1...v0.305.2) ### [`v0.305.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.305.0...v0.305.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.305.0...v0.305.1) ### [`v0.305.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.304.2...v0.305.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.304.2...v0.305.0) ### [`v0.304.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.304.1...v0.304.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.304.1...v0.304.2) ### [`v0.304.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.304.0...v0.304.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.304.0...v0.304.1) ### [`v0.304.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.303.1...v0.304.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.303.1...v0.304.0) ### [`v0.303.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.303.0...v0.303.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.303.0...v0.303.1) ### [`v0.303.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.302.1...v0.303.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.302.1...v0.303.0) ### [`v0.302.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.302.0...v0.302.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.302.0...v0.302.1) ### [`v0.302.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.301.0...v0.302.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.301.0...v0.302.0) ### [`v0.301.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.300.1...v0.301.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.300.1...v0.301.0) ### [`v0.300.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.300.0...v0.300.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.300.0...v0.300.1) ### [`v0.300.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.55.1...v0.300.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.55.1...v0.300.0) ### [`v0.55.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.55.0...v0.55.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.55.0...v0.55.1) ### [`v0.55.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.54.1...v0.55.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.54.1...v0.55.0) ### [`v0.54.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.54.0...v0.54.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.54.0...v0.54.1) ### [`v0.54.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.53.4...v0.54.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.53.4...v0.54.0) ### [`v0.53.4`](https://redirect.github.com/prometheus/prometheus/compare/v0.53.3...v0.53.4) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.53.3...v0.53.4) ### [`v0.53.3`](https://redirect.github.com/prometheus/prometheus/compare/v0.53.2...v0.53.3) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.53.2...v0.53.3) ### [`v0.53.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.53.1...v0.53.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.53.1...v0.53.2) ### [`v0.53.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.53.0...v0.53.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.53.0...v0.53.1) ### [`v0.53.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.52.1...v0.53.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.52.1...v0.53.0) ### [`v0.52.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.52.0...v0.52.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.52.0...v0.52.1) ### [`v0.52.0`](https://redirect.github.com/prometheus/prometheus/compare/v0.51.2...v0.52.0) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.51.2...v0.52.0) ### [`v0.51.2`](https://redirect.github.com/prometheus/prometheus/compare/v0.51.1...v0.51.2) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.51.1...v0.51.2) ### [`v0.51.1`](https://redirect.github.com/prometheus/prometheus/compare/v0.51.0...v0.51.1) [Compare Source](https://redirect.github.com/prometheus/prometheus/compare/v0.51.0...v0.51.1)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 10 +++------- go.sum | 9 --------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index c5f633874..0fbd44bd7 100644 --- a/go.mod +++ b/go.mod @@ -47,9 +47,6 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/prometheus/client_golang v1.24.1 - github.com/prometheus/common v0.70.1 - github.com/prometheus/prometheus v0.51.0 github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 @@ -61,7 +58,6 @@ require ( google.golang.org/api v0.293.0 google.golang.org/grpc v1.83.1 google.golang.org/protobuf v1.36.12 - gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 k8s.io/api v0.36.4 @@ -376,7 +372,6 @@ require ( github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/gosuri/uitable v0.0.4 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -419,7 +414,6 @@ require ( github.com/jjti/go-spancheck v0.6.5 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect - github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/julz/importas v0.2.0 // indirect github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.7.7 // indirect @@ -496,7 +490,6 @@ require ( github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-varint v0.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect @@ -520,7 +513,9 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.90.0 // indirect github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.92.0 // indirect + github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/procfs v0.21.1 // indirect github.com/quasilyte/go-ruleguard v0.4.5 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect @@ -656,6 +651,7 @@ require ( gopkg.in/mail.v2 v2.3.1 // indirect gopkg.in/validator.v2 v2.0.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.8.0 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect k8s.io/apiserver v0.36.4 // indirect diff --git a/go.sum b/go.sum index 6d7499e69..d4ec461b0 100644 --- a/go.sum +++ b/go.sum @@ -3504,7 +3504,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= @@ -3514,8 +3513,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -3977,8 +3974,6 @@ github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+ github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/graph-gophers/graphql-go v1.9.0 h1:yu0ucKHLc5qGpRwLYKIWtr9bOoxovkWasuBrPQwlHls= github.com/graph-gophers/graphql-go v1.9.0/go.mod h1:23olKZ7duEvHlF/2ELEoSZaY1aNPfShjP782SOoNTyM= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -4163,7 +4158,6 @@ github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7X github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -4449,7 +4443,6 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= @@ -4679,8 +4672,6 @@ github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlT github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= -github.com/prometheus/prometheus v0.51.0 h1:aRdjTnmHLved29ILtdzZN2GNvOjWATtA/z+3fYuexOc= -github.com/prometheus/prometheus v0.51.0/go.mod h1:yv4MwOn3yHMQ6MZGHPg/U7Fcyqf+rxqiZfSur6myVtc= github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= From f6d29c235a9700387d1fbe467c09fe2396a4094e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 18:04:53 +0000 Subject: [PATCH 048/132] update(deps): update module github.com/google/go-containerregistry to v0.21.9 (#726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/google/go-containerregistry](https://redirect.github.com/google/go-containerregistry) | `v0.21.7` → `v0.21.9` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgoogle%2fgo-containerregistry/v0.21.9?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgoogle%2fgo-containerregistry/v0.21.7/v0.21.9?slim=true) | --- ### Release Notes
google/go-containerregistry (github.com/google/go-containerregistry) ### [`v0.21.9`](https://redirect.github.com/google/go-containerregistry/releases/tag/v0.21.9) [Compare Source](https://redirect.github.com/google/go-containerregistry/compare/v0.21.8...v0.21.9) #### What's Changed - actions: pin slsa generator by version by [@​Subserial](https://redirect.github.com/Subserial) in [#​2395](https://redirect.github.com/google/go-containerregistry/pull/2395) - fix: prevent data race on scope refreshes within remote.writer by [@​Subserial](https://redirect.github.com/Subserial) in [#​2396](https://redirect.github.com/google/go-containerregistry/pull/2396) - fix: remove '.' from unsafe path prefixes by [@​Subserial](https://redirect.github.com/Subserial) in [#​2400](https://redirect.github.com/google/go-containerregistry/pull/2400) - build(deps): bump the actions group with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2398](https://redirect.github.com/google/go-containerregistry/pull/2398) **Full Changelog**: ### [`v0.21.8`](https://redirect.github.com/google/go-containerregistry/releases/tag/v0.21.8) [Compare Source](https://redirect.github.com/google/go-containerregistry/compare/v0.21.7...v0.21.8) The artifacts attached to this release are missing SLSA provenance, see [#​2390](https://redirect.github.com/google/go-containerregistry/issues/2390). #### What's Changed - build(deps): bump the go-deps group across 1 directory with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2353](https://redirect.github.com/google/go-containerregistry/pull/2353) - build(deps): bump golang.org/x/crypto from 0.45.0 to 0.52.0 in /cmd/krane by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2367](https://redirect.github.com/google/go-containerregistry/pull/2367) - build(deps): bump golang.org/x/crypto from 0.50.0 to 0.52.0 in /pkg/authn/k8schain by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2368](https://redirect.github.com/google/go-containerregistry/pull/2368) - build(deps): bump golang.org/x/net from 0.49.0 to 0.55.0 in /pkg/authn/kubernetes by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2363](https://redirect.github.com/google/go-containerregistry/pull/2363) - build(deps): bump the go-deps group across 3 directories with 7 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2377](https://redirect.github.com/google/go-containerregistry/pull/2377) - build(deps): bump the actions group across 1 directory with 5 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2375](https://redirect.github.com/google/go-containerregistry/pull/2375) - Reject unsafe Windows archive paths in Extract by [@​Haihan-Jiang](https://redirect.github.com/Haihan-Jiang) in [#​2330](https://redirect.github.com/google/go-containerregistry/pull/2330) - feat(goreleaser): add loong64 build support for crane/gcrane/krane by [@​xuxiaowei-com-cn](https://redirect.github.com/xuxiaowei-com-cn) in [#​2358](https://redirect.github.com/google/go-containerregistry/pull/2358) - Document tag and digest reference semantics by [@​Haihan-Jiang](https://redirect.github.com/Haihan-Jiang) in [#​2325](https://redirect.github.com/google/go-containerregistry/pull/2325) - remote: release pull limiter slot when body is read to EOF by [@​knQzx](https://redirect.github.com/knQzx) in [#​2373](https://redirect.github.com/google/go-containerregistry/pull/2373) - tarball: bounds-check layer index in uncompressed LayerByDiffID by [@​arpitjain099](https://redirect.github.com/arpitjain099) in [#​2370](https://redirect.github.com/google/go-containerregistry/pull/2370) - authn: read Podman auth from XDG config by [@​vigneshakaviki](https://redirect.github.com/vigneshakaviki) in [#​2379](https://redirect.github.com/google/go-containerregistry/pull/2379) - transport: per-host bearer token exchange on cross-host redirect by [@​amitzig](https://redirect.github.com/amitzig) in [#​2360](https://redirect.github.com/google/go-containerregistry/pull/2360) - mutate: bounds-check layer index when building rebase addendums by [@​arpitjain099](https://redirect.github.com/arpitjain099) in [#​2371](https://redirect.github.com/google/go-containerregistry/pull/2371) - fix(daemon): copy ExposedPorts from source config in computeImageConfig by [@​x64vps](https://redirect.github.com/x64vps) in [#​2356](https://redirect.github.com/google/go-containerregistry/pull/2356) - feat(remote): add WithReferrersTagFallback option by [@​kevinmdavis](https://redirect.github.com/kevinmdavis) in [#​2366](https://redirect.github.com/google/go-containerregistry/pull/2366) - mutate: apply opaque-directory whiteouts (.wh..wh..opq) in Extract by [@​sadmanf](https://redirect.github.com/sadmanf) in [#​2372](https://redirect.github.com/google/go-containerregistry/pull/2372) - tarball: use correct file extension for zstd/uncompressed by [@​milas](https://redirect.github.com/milas) in [#​2382](https://redirect.github.com/google/go-containerregistry/pull/2382) - build(deps): bump github.com/moby/moby/client from 0.5.0 to 0.5.1 in the go-deps group across 1 directory by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2380](https://redirect.github.com/google/go-containerregistry/pull/2380) - actions: update actions to be pinned by hash by [@​Subserial](https://redirect.github.com/Subserial) in [#​2384](https://redirect.github.com/google/go-containerregistry/pull/2384) - Bump go version to 1.26.5 by [@​Subserial](https://redirect.github.com/Subserial) in [#​2388](https://redirect.github.com/google/go-containerregistry/pull/2388) #### New Contributors - [@​xuxiaowei-com-cn](https://redirect.github.com/xuxiaowei-com-cn) made their first contribution in [#​2358](https://redirect.github.com/google/go-containerregistry/pull/2358) - [@​knQzx](https://redirect.github.com/knQzx) made their first contribution in [#​2373](https://redirect.github.com/google/go-containerregistry/pull/2373) - [@​arpitjain099](https://redirect.github.com/arpitjain099) made their first contribution in [#​2370](https://redirect.github.com/google/go-containerregistry/pull/2370) - [@​vigneshakaviki](https://redirect.github.com/vigneshakaviki) made their first contribution in [#​2379](https://redirect.github.com/google/go-containerregistry/pull/2379) - [@​amitzig](https://redirect.github.com/amitzig) made their first contribution in [#​2360](https://redirect.github.com/google/go-containerregistry/pull/2360) - [@​x64vps](https://redirect.github.com/x64vps) made their first contribution in [#​2356](https://redirect.github.com/google/go-containerregistry/pull/2356) - [@​kevinmdavis](https://redirect.github.com/kevinmdavis) made their first contribution in [#​2366](https://redirect.github.com/google/go-containerregistry/pull/2366) - [@​sadmanf](https://redirect.github.com/sadmanf) made their first contribution in [#​2372](https://redirect.github.com/google/go-containerregistry/pull/2372) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 4 ++-- go.sum | 8 ++++---- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NOTICE b/NOTICE index bdfa3f4e8..2cc44b707 100644 --- a/NOTICE +++ b/NOTICE @@ -665,9 +665,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.21.7 +Version: v0.21.9 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.21.7/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.21.9/LICENSE ---------- Module: github.com/google/go-github/v69/github diff --git a/go.mod b/go.mod index 0fbd44bd7..ee973ba90 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 - github.com/google/go-containerregistry v0.21.7 + github.com/google/go-containerregistry v0.21.9 github.com/google/go-github/v74 v74.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 @@ -470,7 +470,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/moby/api v1.55.0 // indirect - github.com/moby/moby/client v0.5.0 // indirect + github.com/moby/moby/client v0.5.1 // indirect github.com/moby/spdystream v0.5.1 // indirect github.com/moby/term v0.5.2 // indirect github.com/modelcontextprotocol/registry v1.8.0 // indirect diff --git a/go.sum b/go.sum index d4ec461b0..e46d0eae1 100644 --- a/go.sum +++ b/go.sum @@ -3799,8 +3799,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.21.7 h1:/vPFuVXDjtFREsVArW+0h1CIl5urnOhzei4X2DMW9IU= -github.com/google/go-containerregistry v0.21.7/go.mod h1:kjSbt7/zMsKLWfnHrIvKvhXHUw91jbe9DNjPPJ32gXE= +github.com/google/go-containerregistry v0.21.9 h1:F+D4uZ3iA3DLMJLfhaqMdHJbzeqm/216WGQq2dokuLs= +github.com/google/go-containerregistry v0.21.9/go.mod h1:dP5XNKcL7kMFF/TB3LfvWmVhAcv7iqkHb3oDK8aauTo= github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE= github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM= github.com/google/go-github/v74 v74.0.0 h1:yZcddTUn8DPbj11GxnMrNiAnXH14gNs559AsUpNpPgM= @@ -4390,8 +4390,8 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/moby/api v1.55.0 h1:2/sexvQyqIWS8pRSCFddBfpW2qE7vR7FCL+vN8pxwMc= github.com/moby/moby/api v1.55.0/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= -github.com/moby/moby/client v0.5.0 h1:5XhyPk2fuOWf6RlSFa3MkIIgDZkF25xToXW8Q/BH7cc= -github.com/moby/moby/client v0.5.0/go.mod h1:rcVpF8ncl9vo5gaIBdol6CnbEtSj1uxMvEV/UrykF/s= +github.com/moby/moby/client v0.5.1 h1:tYNaJno4c0HXz12y5BiqEDy0rVTYkWzI26lGvnTMiJw= +github.com/moby/moby/client v0.5.1/go.mod h1:odLstlZ6uSnfvAgVxMpvgmb8SUdd+siH2T0GBuxVAlM= github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y= github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/user v0.4.1 h1:RgjRlaDKi/Xmyrz4t8lyzXT6v2ooFeO/7xtchmhVWE0= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index bdfa3f4e8..2cc44b707 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -665,9 +665,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.21.7 +Version: v0.21.9 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.21.7/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.21.9/LICENSE ---------- Module: github.com/google/go-github/v69/github From cf1486f03650c9be3a613202db8a6f17469f4654 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 19:02:03 +0000 Subject: [PATCH 049/132] update(deps): update github.com/rook/rook/pkg/apis digest to 5fae22d (#725) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `c01991a` → `5fae22d` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 2cc44b707..491c58abf 100644 --- a/NOTICE +++ b/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820225410-c01991a14138 +Version: v0.0.0-20260821173026-5fae22dd737f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/c01991a14138/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5fae22dd737f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index ee973ba90..b5cfb2ba8 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 + github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index e46d0eae1..cea94e286 100644 --- a/go.sum +++ b/go.sum @@ -4713,8 +4713,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138 h1:0i8FwotSGj7yEOLDgf95hbjg6t5Jn9h7wDi5VGK1/Dc= -github.com/rook/rook/pkg/apis v0.0.0-20260820225410-c01991a14138/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f h1:aYno2ZTb5C9ksKoScqRWWLNjPZfWjt1M+W6KMWT/tpU= +github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 2cc44b707..491c58abf 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260820225410-c01991a14138 +Version: v0.0.0-20260821173026-5fae22dd737f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/c01991a14138/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5fae22dd737f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 5aa1f4864176df9e4784362040cef2d1f27fd1aa Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2026 00:01:54 +0000 Subject: [PATCH 050/132] update(deps): update github.com/rook/rook/pkg/apis digest to d0c3b9c (#727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `5fae22d` → `d0c3b9c` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 491c58abf..4f653944e 100644 --- a/NOTICE +++ b/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260821173026-5fae22dd737f +Version: v0.0.0-20260821220733-d0c3b9ce6d64 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5fae22dd737f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/d0c3b9ce6d64/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b5cfb2ba8..2d7513305 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f + github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index cea94e286..27f210b16 100644 --- a/go.sum +++ b/go.sum @@ -4713,8 +4713,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f h1:aYno2ZTb5C9ksKoScqRWWLNjPZfWjt1M+W6KMWT/tpU= -github.com/rook/rook/pkg/apis v0.0.0-20260821173026-5fae22dd737f/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64 h1:BmEIuumk5ASCCaWB/4PQgs5a6nEChdLb+0sqAURXnuA= +github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 491c58abf..4f653944e 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1187,9 +1187,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260821173026-5fae22dd737f +Version: v0.0.0-20260821220733-d0c3b9ce6d64 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5fae22dd737f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/d0c3b9ce6d64/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From f7b4c2a980bf6237f3cdc39a6cff03ba1dbd1e94 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 07:01:10 +0000 Subject: [PATCH 051/132] update(deps): update module github.com/vektra/mockery/v3 to v3.7.4 (#728) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/vektra/mockery/v3](https://redirect.github.com/vektra/mockery) | `v3.7.3` → `v3.7.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fvektra%2fmockery%2fv3/v3.7.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fvektra%2fmockery%2fv3/v3.7.3/v3.7.4?slim=true) | --- ### Release Notes
vektra/mockery (github.com/vektra/mockery/v3) ### [`v3.7.4`](https://redirect.github.com/vektra/mockery/releases/tag/v3.7.4) [Compare Source](https://redirect.github.com/vektra/mockery/compare/v3.7.3...v3.7.4) #### What's Changed - fix: bump golang.org/x/tools to v0.49.0 for Go 1.27 support by [@​ergousha](https://redirect.github.com/ergousha) in [#​1172](https://redirect.github.com/vektra/mockery/pull/1172) - fix(ci): Upgrade for Go 1.27 by [@​LandonTClipp](https://redirect.github.com/LandonTClipp) in [#​1174](https://redirect.github.com/vektra/mockery/pull/1174) #### New Contributors - [@​ergousha](https://redirect.github.com/ergousha) made their first contribution in [#​1172](https://redirect.github.com/vektra/mockery/pull/1172) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2d7513305..237982596 100644 --- a/go.mod +++ b/go.mod @@ -588,7 +588,7 @@ require ( github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.1 // indirect github.com/uudashr/iface v1.5.0 // indirect - github.com/vektra/mockery/v3 v3.7.3 // indirect + github.com/vektra/mockery/v3 v3.7.4 // indirect github.com/vmihailenco/go-tinylfu v0.2.2 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 27f210b16..98f485867 100644 --- a/go.sum +++ b/go.sum @@ -4954,8 +4954,8 @@ github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= github.com/uudashr/iface v1.5.0 h1:PgdMt4uAettGG8K/Kbamc4B9FABgUgnS3TLbl6fnjEk= github.com/uudashr/iface v1.5.0/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= -github.com/vektra/mockery/v3 v3.7.3 h1:xL6MqWo4yDgiueMDsggt1eTNoDEkwYNQeVXN5vyaJG0= -github.com/vektra/mockery/v3 v3.7.3/go.mod h1:fbChccNiUvQaUVaCHS6/7OL5/D65KljJVk31LuPPUjY= +github.com/vektra/mockery/v3 v3.7.4 h1:t2qElHpzlKKJA63nrEmnkdwy+OaBV1t6uAf/YpHu4EU= +github.com/vektra/mockery/v3 v3.7.4/go.mod h1:K+L72OoFVizA9eWtO4L+kU65oylgreiJEJ57Gu8g9Ew= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vmihailenco/go-tinylfu v0.2.2 h1:H1eiG6HM36iniK6+21n9LLpzx1G9R3DJa2UjUjbynsI= From 082f5623df71d8552088825ee9bab93020c9509a Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 09:01:37 +0000 Subject: [PATCH 052/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.28.0 (#729) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.27.0` → `v1.28.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.28.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.27.0/v1.28.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.28.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.28.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.27.0...v1.28.0) #### Changelog - [`bc27350`](https://redirect.github.com/codesphere-cloud/cs-go/commit/bc2735082fb911e6638cb1992303488b32817e8a) update(deps): update module github.com/vektra/mockery/v3 to v3.7.4 ([#​316](https://redirect.github.com/codesphere-cloud/cs-go/issues/316)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 4f653944e..d2f58db30 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.27.0 +Version: v1.28.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.27.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.28.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 237982596..cb9cbaa47 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.1 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.27.0 + github.com/codesphere-cloud/cs-go v1.28.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 98f485867..ba3c4fd0d 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.27.0 h1:n2zqnn2uw2KPvSHvNFQSnxE5LsIBKUZAKthE6SPtaMg= -github.com/codesphere-cloud/cs-go v1.27.0/go.mod h1:EdOmH9+DhL9uubFvopOxKwuOXodDQ9HS2xQkUu/pEq0= +github.com/codesphere-cloud/cs-go v1.28.0 h1:nTCrbWareNVCOsqUp46fWX39DoZTGOJoys17KTfCvgw= +github.com/codesphere-cloud/cs-go v1.28.0/go.mod h1:Jixj8kmFsdAnSq9Eu31hl/AR0YOxFkcz5N9Vgc07RiE= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 4f653944e..d2f58db30 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.27.0 +Version: v1.28.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.27.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.28.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 0b11a6bb38ad790b8afe4776ecb831975a487b8c Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 02:03:38 +0000 Subject: [PATCH 053/132] update(deps): update module github.com/goreleaser/goreleaser/v2 to v2.18.0 (#730) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/goreleaser/goreleaser/v2](https://redirect.github.com/goreleaser/goreleaser) | `v2.17.1` → `v2.18.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgoreleaser%2fgoreleaser%2fv2/v2.18.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgoreleaser%2fgoreleaser%2fv2/v2.17.1/v2.18.0?slim=true) | --- ### Release Notes
goreleaser/goreleaser (github.com/goreleaser/goreleaser/v2) ### [`v2.18.0`](https://redirect.github.com/goreleaser/goreleaser/releases/tag/v2.18.0) [Compare Source](https://redirect.github.com/goreleaser/goreleaser/compare/v2.17.1...v2.18.0) #### Announcement Read the official announcement: [Announcing GoReleaser v2.18](https://goreleaser.com/blog/goreleaser-v2.18/). #### Changelog ##### New Features - [`601cd87`](https://redirect.github.com/goreleaser/goreleaser/commit/601cd877957f6dba2180a5405886acace8f2e022): feat(ko): support templating for local\_domain, base\_image, and repositories ([#​6741](https://redirect.github.com/goreleaser/goreleaser/issues/6741)) ([@​mrueg](https://redirect.github.com/mrueg)) - [`de88f38`](https://redirect.github.com/goreleaser/goreleaser/commit/de88f3820cf137cd665c30ba8f54304ec1dd0b07): feat(winget): support publishing additional locale manifests ([#​6733](https://redirect.github.com/goreleaser/goreleaser/issues/6733)) ([@​MohammedAnasuddinZaid](https://redirect.github.com/MohammedAnasuddinZaid)) - [`cefbc6f`](https://redirect.github.com/goreleaser/goreleaser/commit/cefbc6faba0c5746ba2edefa32204c77cc26b1fd): feat: add iru custom apps publisher ([#​6709](https://redirect.github.com/goreleaser/goreleaser/issues/6709)) ([@​wimwenigerkind](https://redirect.github.com/wimwenigerkind)) - [`1d6e7c0`](https://redirect.github.com/goreleaser/goreleaser/commit/1d6e7c06e47ec4bf283bb3231ae1348500e0bf3b): feat: allow PR creation to use a different auth token ([#​6717](https://redirect.github.com/goreleaser/goreleaser/issues/6717)) ([@​emily-curry](https://redirect.github.com/emily-curry)) - [`4c41ac0`](https://redirect.github.com/goreleaser/goreleaser/commit/4c41ac0e2fe68b30f2035ca9f760c1329b7330a5): feat: preflight checks ([#​6704](https://redirect.github.com/goreleaser/goreleaser/issues/6704)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`060260a`](https://redirect.github.com/goreleaser/goreleaser/commit/060260ae7c0ba358a494c2ce175beceee9d7382b): feat: release summary ([#​6810](https://redirect.github.com/goreleaser/goreleaser/issues/6810)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`82a5aba`](https://redirect.github.com/goreleaser/goreleaser/commit/82a5aba0a9a3d7907da4163b89512f1d3da658ab): feat: update to Go 1.27 ([#​6802](https://redirect.github.com/goreleaser/goreleaser/issues/6802)) ([@​caarlos0](https://redirect.github.com/caarlos0)) ##### Security updates - [`b1cafd4`](https://redirect.github.com/goreleaser/goreleaser/commit/b1cafd427fa798312d3429c63781512bb45d7dca): sec(deps): bump go-openapi/spec and go-openapi/validade ([#​6766](https://redirect.github.com/goreleaser/goreleaser/issues/6766)) ([@​caarlos0](https://redirect.github.com/caarlos0)) ##### Bug fixes - [`1970443`](https://redirect.github.com/goreleaser/goreleaser/commit/197044372e624c80bfb982b356f4bdf0ddf2ffb6): fix(aur): expand description templates before escaping quotes ([#​6791](https://redirect.github.com/goreleaser/goreleaser/issues/6791)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​caarlos0](https://redirect.github.com/caarlos0)) - [`a27402d`](https://redirect.github.com/goreleaser/goreleaser/commit/a27402dd9f2ce59a31aed5e4ded249cd6502e1e7): fix(blob): honor s3\_force\_path\_style without a custom endpoint ([#​6789](https://redirect.github.com/goreleaser/goreleaser/issues/6789)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​caarlos0](https://redirect.github.com/caarlos0)) - [`db65b99`](https://redirect.github.com/goreleaser/goreleaser/commit/db65b99a43786ae3cebbf39637f530534fa8d485): fix(brew): a formula without a repository stops the ones after it ([#​6783](https://redirect.github.com/goreleaser/goreleaser/issues/6783)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`2b5fb31`](https://redirect.github.com/goreleaser/goreleaser/commit/2b5fb317cb771bedb09c5b2acb592fa37da64431): fix(build): node windows targets get no .exe extension ([#​6777](https://redirect.github.com/goreleaser/goreleaser/issues/6777)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`951fc57`](https://redirect.github.com/goreleaser/goreleaser/commit/951fc57101613cb5fc86a9ae55a05febe7b25aa8): fix(cask): a cask without a repository stops the ones after it ([#​6785](https://redirect.github.com/goreleaser/goreleaser/issues/6785)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`54a6c8e`](https://redirect.github.com/goreleaser/goreleaser/commit/54a6c8e941da2236e1704e23d8481ca3311fc726): fix(cask): emit Casks that pass brew style ([#​6752](https://redirect.github.com/goreleaser/goreleaser/issues/6752)) ([@​r0h1tb](https://redirect.github.com/r0h1tb)) - [`2d6b235`](https://redirect.github.com/goreleaser/goreleaser/commit/2d6b235930f39c538fcdd58eba8ef045b47f31a6): fix(changelog): a commit matching two include filters is listed twice ([#​6773](https://redirect.github.com/goreleaser/goreleaser/issues/6773)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​caarlos0](https://redirect.github.com/caarlos0)) - [`c4cc86f`](https://redirect.github.com/goreleaser/goreleaser/commit/c4cc86f7b8436e6735c9929f5b2ebfa7684eabe6): fix(chocolatey): error on multiple archives for the same platform ([#​6792](https://redirect.github.com/goreleaser/goreleaser/issues/6792)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`1a246da`](https://redirect.github.com/goreleaser/goreleaser/commit/1a246da4164ae81e3b435228995074164f9c701e): fix(config): type retry durations as strings in schema ([#​6801](https://redirect.github.com/goreleaser/goreleaser/issues/6801)) ([@​skatkov](https://redirect.github.com/skatkov)) - [`8be344b`](https://redirect.github.com/goreleaser/goreleaser/commit/8be344b19e5bb723590a207c46b124d383458fc1): fix(docker): add gpg-agent to the image ([#​6763](https://redirect.github.com/goreleaser/goreleaser/issues/6763)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`5282589`](https://redirect.github.com/goreleaser/goreleaser/commit/5282589091a7a0df652ae039467bfc5be9187346): fix(dockers/v2): annotation scopes ([#​6800](https://redirect.github.com/goreleaser/goreleaser/issues/6800)) ([@​CraigAstillRVU](https://redirect.github.com/CraigAstillRVU) and [@​caarlos0](https://redirect.github.com/caarlos0)) - [`5560bb9`](https://redirect.github.com/goreleaser/goreleaser/commit/5560bb9acf609f23de14d2c4f7d31808d46b364e): fix(flatpak): a disabled flatpak stops the ones after it ([#​6781](https://redirect.github.com/goreleaser/goreleaser/issues/6781)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`b68113a`](https://redirect.github.com/goreleaser/goreleaser/commit/b68113a4a78e95de2efcde8384a61d526279625f): fix(git): tag templates strip apostrophes from the message ([#​6779](https://redirect.github.com/goreleaser/goreleaser/issues/6779)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`1bc6ec7`](https://redirect.github.com/goreleaser/goreleaser/commit/1bc6ec7dfe77db0961b44588a4f8efe5120b7f84): fix(healthcheck): register upx and makeself dependency checkers ([#​6793](https://redirect.github.com/goreleaser/goreleaser/issues/6793)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`9d7d49f`](https://redirect.github.com/goreleaser/goreleaser/commit/9d7d49ff17546abd01f4588636a04201cf3d6bf7): fix(krew): a manifest without a name stops the ones after it ([#​6787](https://redirect.github.com/goreleaser/goreleaser/issues/6787)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`4276c51`](https://redirect.github.com/goreleaser/goreleaser/commit/4276c5174e80a4240dee31d3af8d11438cbfeae0): fix(krew): apply the documented goarm default ([#​6775](https://redirect.github.com/goreleaser/goreleaser/issues/6775)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`9700230`](https://redirect.github.com/goreleaser/goreleaser/commit/97002309efe9b11cee15426c940a42c44a9f55b2): fix(mcp): mcp.disable is documented but never read ([#​6795](https://redirect.github.com/goreleaser/goreleaser/issues/6795)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`1d79a09`](https://redirect.github.com/goreleaser/goreleaser/commit/1d79a09e56ea59226ff554959ba562c172db9ca9): fix(milestone): a milestone with close disabled stops the ones after it ([#​6778](https://redirect.github.com/goreleaser/goreleaser/issues/6778)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`2a0393d`](https://redirect.github.com/goreleaser/goreleaser/commit/2a0393dc951468dff3cf37603b9a92d3fb268d09): fix(nfpm): don't set deb arch variant for goamd64 v1 ([#​6765](https://redirect.github.com/goreleaser/goreleaser/issues/6765)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`912704c`](https://redirect.github.com/goreleaser/goreleaser/commit/912704c71ce0649ef87d41d427fc103e69544b45): fix(nfpm): overrides ignore package\_name, epoch, release and prerelease ([#​6782](https://redirect.github.com/goreleaser/goreleaser/issues/6782)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`3cf25c0`](https://redirect.github.com/goreleaser/goreleaser/commit/3cf25c0db61ed7b1684a974995deb3ff29d09ecf): fix(nfpm): record the conventional extension, not the format name ([#​6776](https://redirect.github.com/goreleaser/goreleaser/issues/6776)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`ad028a3`](https://redirect.github.com/goreleaser/goreleaser/commit/ad028a32aa82dd98b5986e2a000a3ac9e9913f7f): fix(nix): a skipped nix entry stops the ones after it ([#​6788](https://redirect.github.com/goreleaser/goreleaser/issues/6788)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`b787cd2`](https://redirect.github.com/goreleaser/goreleaser/commit/b787cd207c28f5ec4664bde7bbd0cf181bf606a3): fix(notarize): cap macOS notarization timeout at 20m ([#​6758](https://redirect.github.com/goreleaser/goreleaser/issues/6758)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`81a5509`](https://redirect.github.com/goreleaser/goreleaser/commit/81a55090039d93c90a24a0d18139021522e4471d): fix(sign): artifacts: none masks real signing failures ([#​6790](https://redirect.github.com/goreleaser/goreleaser/issues/6790)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`4eb6037`](https://redirect.github.com/goreleaser/goreleaser/commit/4eb603712f4418671f76a97fe4cbd435e7b7fdd6): fix(snapcraft): a disabled snap stops the ones after it ([#​6784](https://redirect.github.com/goreleaser/goreleaser/issues/6784)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`d93d0f1`](https://redirect.github.com/goreleaser/goreleaser/commit/d93d0f196d4a76458c2531b6b0c4af61790a0d46): fix(snapcraft): assumes, hooks and plugs are dropped when apps is omitted ([#​6780](https://redirect.github.com/goreleaser/goreleaser/issues/6780)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​vxncxnx](https://redirect.github.com/vxncxnx)) - [`b3bbd53`](https://redirect.github.com/goreleaser/goreleaser/commit/b3bbd53334b2d5e9f545ecfcf65850548938a94f): fix(srpm): make documented rpm fields actually configurable ([#​6762](https://redirect.github.com/goreleaser/goreleaser/issues/6762)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`7304fdb`](https://redirect.github.com/goreleaser/goreleaser/commit/7304fdbd72f445fed66d5a206e2d2aa6bda1a1ff): fix(tmpl): register the documented join template function ([#​6772](https://redirect.github.com/goreleaser/goreleaser/issues/6772)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`6f88b00`](https://redirect.github.com/goreleaser/goreleaser/commit/6f88b00188cbc1afdc2995bbfe7374e540f32e85): fix(upload): a misconfigured upload stops the others ([#​6786](https://redirect.github.com/goreleaser/goreleaser/issues/6786)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`67e4c45`](https://redirect.github.com/goreleaser/goreleaser/commit/67e4c45090e842817467ca94a51b3d68f549b2b3): fix(winget): a skipped winget entry stops the ones after it ([#​6797](https://redirect.github.com/goreleaser/goreleaser/issues/6797)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`92453c1`](https://redirect.github.com/goreleaser/goreleaser/commit/92453c1dbdf592d227cb236600093a503f2351f3): fix(winget): count arm64 in the duplicate-archive check ([#​6774](https://redirect.github.com/goreleaser/goreleaser/issues/6774)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX) and [@​caarlos0](https://redirect.github.com/caarlos0)) - [`9a43dd0`](https://redirect.github.com/goreleaser/goreleaser/commit/9a43dd006d7cf164646c3f20df8bee715fc0cbd7): fix(winget): fall back to the default description in additional locales ([#​6771](https://redirect.github.com/goreleaser/goreleaser/issues/6771)) ([@​VXNCXNX](https://redirect.github.com/VXNCXNX)) - [`6127e0f`](https://redirect.github.com/goreleaser/goreleaser/commit/6127e0feff9cfaf54c25ca9562d4103a5fe9049c): fix: do not panic decoding a commit whose message contains a log marker ([#​6738](https://redirect.github.com/goreleaser/goreleaser/issues/6738)) ([@​arpitjain099](https://redirect.github.com/arpitjain099)) - [`02cfda7`](https://redirect.github.com/goreleaser/goreleaser/commit/02cfda7102906edff9dd067bcea516574fa68308): fix: lint ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`b990083`](https://redirect.github.com/goreleaser/goreleaser/commit/b9900831dd40b3d88df95fdc2e420713a88c85f9): fix: surface archive Close errors when writing release archives ([#​6690](https://redirect.github.com/goreleaser/goreleaser/issues/6690)) ([@​SebTardif](https://redirect.github.com/SebTardif) and [@​caarlos0](https://redirect.github.com/caarlos0)) ##### Documentation updates - [`33a3f22`](https://redirect.github.com/goreleaser/goreleaser/commit/33a3f227d1592e583e055368d309c685d1f052bf): docs(dockers\_v2): clarify that build and push are a single step ([#​6742](https://redirect.github.com/goreleaser/goreleaser/issues/6742)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`1eb0ee9`](https://redirect.github.com/goreleaser/goreleaser/commit/1eb0ee94b4a2987b063e312e1ecbbd3d394f27c0): docs: download SBOMs ([#​6803](https://redirect.github.com/goreleaser/goreleaser/issues/6803)) ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`16debcb`](https://redirect.github.com/goreleaser/goreleaser/commit/16debcb0a11d7f4792f02277841c74ebb0d81c10): docs: many fixes ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`ff2822a`](https://redirect.github.com/goreleaser/goreleaser/commit/ff2822a2b69b05eb8731ec4284dc2926c9e88aa8): docs: update dockers\_v2 ([@​caarlos0](https://redirect.github.com/caarlos0)) - [`686946e`](https://redirect.github.com/goreleaser/goreleaser/commit/686946ed407a7f68ab9757d92da9f4b8a7695852): docs: use correct script for debconf ([#​6759](https://redirect.github.com/goreleaser/goreleaser/issues/6759)) ([@​Daniel15](https://redirect.github.com/Daniel15)) - [`9921479`](https://redirect.github.com/goreleaser/goreleaser/commit/9921479b6b53236e88306d1641bda2b92f0f4d27): docs: use formats plural syntax ([#​6756](https://redirect.github.com/goreleaser/goreleaser/issues/6756)) ([@​FelicianoTech](https://redirect.github.com/FelicianoTech)) ##### Other work - [`2b80858`](https://redirect.github.com/goreleaser/goreleaser/commit/2b80858a3a93ba4df282e4cde697916281d90f15): chore: auto-update generated files ([#​6731](https://redirect.github.com/goreleaser/goreleaser/issues/6731)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`7df2cd5`](https://redirect.github.com/goreleaser/goreleaser/commit/7df2cd53abea0e92af6b5e498c8aea0fef3bbc01): chore: auto-update generated files ([#​6732](https://redirect.github.com/goreleaser/goreleaser/issues/6732)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`dd08c1f`](https://redirect.github.com/goreleaser/goreleaser/commit/dd08c1f12e373abfcdd5285da5cd836f301cd7c3): chore: auto-update generated files ([#​6740](https://redirect.github.com/goreleaser/goreleaser/issues/6740)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`ee0e3c1`](https://redirect.github.com/goreleaser/goreleaser/commit/ee0e3c11ede0ba9736e665bee11535ae2d581b57): chore: auto-update generated files ([#​6744](https://redirect.github.com/goreleaser/goreleaser/issues/6744)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`cab7c6e`](https://redirect.github.com/goreleaser/goreleaser/commit/cab7c6ef5d4ffc2429828f031ff7bb4645de7dad): chore: auto-update generated files ([#​6769](https://redirect.github.com/goreleaser/goreleaser/issues/6769)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`39552ca`](https://redirect.github.com/goreleaser/goreleaser/commit/39552ca8084090c91edbbcc7cf64b72b8acec863): chore: auto-update generated files ([#​6794](https://redirect.github.com/goreleaser/goreleaser/issues/6794)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`4a82792`](https://redirect.github.com/goreleaser/goreleaser/commit/4a827928ffbf07dd45be36841ed03003069b16ff): chore: auto-update generated files ([#​6798](https://redirect.github.com/goreleaser/goreleaser/issues/6798)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`ae88a14`](https://redirect.github.com/goreleaser/goreleaser/commit/ae88a148278f861ee8c0d170f270ca250d76e01b): chore: auto-update generated files ([#​6806](https://redirect.github.com/goreleaser/goreleaser/issues/6806)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) - [`52494d9`](https://redirect.github.com/goreleaser/goreleaser/commit/52494d90f59206a6aab8deefc58dd4b0be71a9e2): chore: auto-update generated files ([#​6809](https://redirect.github.com/goreleaser/goreleaser/issues/6809)) ([@​goreleaserbot](https://redirect.github.com/goreleaserbot)) **Full Changelog**: #### Helping out This release is only possible thanks to **all** the support of some **awesome people**! Want to be one of them? You can [sponsor](https://goreleaser.com/sponsors/), get a [Pro License](https://goreleaser.com/pro) or [contribute with code](https://goreleaser.com/contributing). #### Where to go next? - Find examples and commented usage of all options in our [website](https://goreleaser.com/intro/). - Reach out on [Discord](https://discord.gg/RGEBtg8vQ6), [Twitter](https://twitter.com/goreleaser), and [Telegram](https://t.me/goreleasernews)! GoReleaser logo
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 70 +++++++++-------- go.mod | 79 ++++++++++---------- go.sum | 174 ++++++++++++++++++++++--------------------- internal/tmpl/NOTICE | 70 +++++++++-------- 4 files changed, 204 insertions(+), 189 deletions(-) diff --git a/NOTICE b/NOTICE index d2f58db30..04f4fec0c 100644 --- a/NOTICE +++ b/NOTICE @@ -527,15 +527,15 @@ License URL: https://github.com/go-logr/zapr/blob/v1.3.0/LICENSE ---------- Module: github.com/go-openapi/jsonpointer -Version: v0.23.1 +Version: v1.0.0 License: Apache-2.0 -License URL: https://github.com/go-openapi/jsonpointer/blob/v0.23.1/LICENSE +License URL: https://github.com/go-openapi/jsonpointer/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/jsonreference -Version: v0.21.6 +Version: v1.0.0 License: Apache-2.0 -License URL: https://github.com/go-openapi/jsonreference/blob/v0.21.6/LICENSE +License URL: https://github.com/go-openapi/jsonreference/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/swag @@ -551,15 +551,15 @@ License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.26.1/cmdutils/L ---------- Module: github.com/go-openapi/swag/conv -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/conv/v0.26.1/conv/LICENSE +License URL: https://github.com/go-openapi/swag/blob/conv/v0.27.3/conv/LICENSE ---------- Module: github.com/go-openapi/swag/fileutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.26.1/fileutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.27.3/fileutils/LICENSE ---------- Module: github.com/go-openapi/swag/jsonname @@ -569,21 +569,21 @@ License URL: https://github.com/go-openapi/swag/blob/jsonname/v0.26.1/jsonname/L ---------- Module: github.com/go-openapi/swag/jsonutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/jsonutils/v0.26.1/jsonutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/jsonutils/v0.27.3/jsonutils/LICENSE ---------- Module: github.com/go-openapi/swag/loading -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/loading/v0.26.1/loading/LICENSE +License URL: https://github.com/go-openapi/swag/blob/loading/v0.27.3/loading/LICENSE ---------- Module: github.com/go-openapi/swag/mangling -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/mangling/v0.26.1/mangling/LICENSE +License URL: https://github.com/go-openapi/swag/blob/mangling/v0.27.3/mangling/LICENSE ---------- Module: github.com/go-openapi/swag/netutils @@ -591,23 +591,29 @@ Version: v0.26.1 License: Apache-2.0 License URL: https://github.com/go-openapi/swag/blob/netutils/v0.26.1/netutils/LICENSE +---------- +Module: github.com/go-openapi/swag/pools +Version: v0.27.3 +License: Apache-2.0 +License URL: https://github.com/go-openapi/swag/blob/pools/v0.27.3/pools/LICENSE + ---------- Module: github.com/go-openapi/swag/stringutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/stringutils/v0.26.1/stringutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/stringutils/v0.27.3/stringutils/LICENSE ---------- Module: github.com/go-openapi/swag/typeutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/typeutils/v0.26.1/typeutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/typeutils/v0.27.3/typeutils/LICENSE ---------- Module: github.com/go-openapi/swag/yamlutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/yamlutils/v0.26.1/yamlutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/yamlutils/v0.27.3/yamlutils/LICENSE ---------- Module: github.com/go-redis/cache/v9 @@ -887,39 +893,39 @@ License URL: https://github.com/kevinburke/ssh_config/blob/v1.6.0/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: MIT -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: Apache-2.0 -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress/internal/snapref -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/internal/snapref/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/internal/snapref/LICENSE ---------- Module: github.com/klauspost/compress/s2 -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/s2/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/s2/LICENSE ---------- Module: github.com/klauspost/compress/zstd/internal/xxhash -Version: v1.19.1 +Version: v1.19.2 License: MIT -License URL: https://github.com/klauspost/compress/blob/v1.19.1/zstd/internal/xxhash/LICENSE.txt +License URL: https://github.com/klauspost/compress/blob/v1.19.2/zstd/internal/xxhash/LICENSE.txt ---------- Module: github.com/klauspost/cpuid/v2 diff --git a/go.mod b/go.mod index cb9cbaa47..830083c01 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( cloud.google.com/go/auth v0.23.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/kms v1.32.0 // indirect + cloud.google.com/go/kms v1.33.0 // indirect cloud.google.com/go/longrunning v1.2.0 // indirect cloud.google.com/go/monitoring v1.30.0 // indirect cloud.google.com/go/storage v1.63.1 // indirect @@ -149,29 +149,29 @@ require ( github.com/atc0005/go-teams-notify/v2 v2.14.0 // indirect github.com/avast/retry-go/v4 v4.7.0 // indirect github.com/avast/retry-go/v5 v5.0.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.43.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.31 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.30 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 // indirect + github.com/aws/aws-sdk-go-v2 v1.43.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.36 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.34 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.14 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.58.4 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.39.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 // indirect github.com/aws/aws-sdk-go-v2/service/kms v1.54.1 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 // indirect - github.com/aws/smithy-go v1.27.4 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 // indirect + github.com/aws/smithy-go v1.27.8 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -287,28 +287,29 @@ require ( github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect - github.com/go-openapi/analysis v0.25.2 // indirect + github.com/go-openapi/analysis v0.25.5 // indirect github.com/go-openapi/errors v0.22.8 // indirect - github.com/go-openapi/jsonpointer v0.23.1 // indirect - github.com/go-openapi/jsonreference v0.21.6 // indirect - github.com/go-openapi/loads v0.24.0 // indirect + github.com/go-openapi/jsonpointer v1.0.0 // indirect + github.com/go-openapi/jsonreference v1.0.0 // indirect + github.com/go-openapi/loads v0.25.0 // indirect github.com/go-openapi/runtime v0.32.3 // indirect github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect - github.com/go-openapi/spec v0.22.6 // indirect - github.com/go-openapi/strfmt v0.26.3 // indirect + github.com/go-openapi/spec v0.22.9 // indirect + github.com/go-openapi/strfmt v0.27.0 // indirect github.com/go-openapi/swag v0.26.1 // indirect github.com/go-openapi/swag/cmdutils v0.26.1 // indirect - github.com/go-openapi/swag/conv v0.26.1 // indirect - github.com/go-openapi/swag/fileutils v0.26.1 // indirect + github.com/go-openapi/swag/conv v0.27.3 // indirect + github.com/go-openapi/swag/fileutils v0.27.3 // indirect github.com/go-openapi/swag/jsonname v0.26.1 // indirect - github.com/go-openapi/swag/jsonutils v0.26.1 // indirect - github.com/go-openapi/swag/loading v0.26.1 // indirect - github.com/go-openapi/swag/mangling v0.26.1 // indirect + github.com/go-openapi/swag/jsonutils v0.27.3 // indirect + github.com/go-openapi/swag/loading v0.27.3 // indirect + github.com/go-openapi/swag/mangling v0.27.3 // indirect github.com/go-openapi/swag/netutils v0.26.1 // indirect - github.com/go-openapi/swag/stringutils v0.26.1 // indirect - github.com/go-openapi/swag/typeutils v0.26.1 // indirect - github.com/go-openapi/swag/yamlutils v0.26.1 // indirect - github.com/go-openapi/validate v0.26.0 // indirect + github.com/go-openapi/swag/pools v0.27.3 // indirect + github.com/go-openapi/swag/stringutils v0.27.3 // indirect + github.com/go-openapi/swag/typeutils v0.27.3 // indirect + github.com/go-openapi/swag/yamlutils v0.27.3 // indirect + github.com/go-openapi/validate v0.26.1 // indirect github.com/go-redis/cache/v9 v9.0.0 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect @@ -363,7 +364,7 @@ require ( github.com/goreleaser/chglog v0.7.4 // indirect github.com/goreleaser/fileglob v1.4.0 // indirect github.com/goreleaser/go-shellwords v1.0.13 // indirect - github.com/goreleaser/goreleaser/v2 v2.17.1 // indirect + github.com/goreleaser/goreleaser/v2 v2.18.0 // indirect github.com/goreleaser/nfpm/v2 v2.47.0 // indirect github.com/goreleaser/quill v0.0.0-20260630015114-8310f3e9a321 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect @@ -422,7 +423,7 @@ require ( github.com/kevinburke/ssh_config v1.6.0 // indirect github.com/kisielk/errcheck v1.20.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect - github.com/klauspost/compress v1.19.1 // indirect + github.com/klauspost/compress v1.19.2 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/knadh/koanf/maps v0.1.2 // indirect @@ -473,7 +474,7 @@ require ( github.com/moby/moby/client v0.5.1 // indirect github.com/moby/spdystream v0.5.1 // indirect github.com/moby/term v0.5.2 // indirect - github.com/modelcontextprotocol/registry v1.8.0 // indirect + github.com/modelcontextprotocol/registry v1.8.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect @@ -557,7 +558,7 @@ require ( github.com/sirupsen/logrus v1.10.1 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/skeema/knownhosts v1.3.2 // indirect - github.com/slack-go/slack v0.27.0 // indirect + github.com/slack-go/slack v0.29.0 // indirect github.com/sonatard/noctx v0.5.1 // indirect github.com/sourcegraph/go-diff v0.8.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect diff --git a/go.sum b/go.sum index ba3c4fd0d..dcd84f70d 100644 --- a/go.sum +++ b/go.sum @@ -1461,8 +1461,8 @@ cloud.google.com/go/kms v1.20.2/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzD cloud.google.com/go/kms v1.20.4/go.mod h1:gPLsp1r4FblUgBYPOcvI/bUPpdMg2Jm1ZVKU4tQUfcc= cloud.google.com/go/kms v1.20.5/go.mod h1:C5A8M1sv2YWYy1AE6iSrnddSG9lRGdJq5XEdBy28Lmw= cloud.google.com/go/kms v1.21.0/go.mod h1:zoFXMhVVK7lQ3JC9xmhHMoQhnjEDZFoLAr5YMwzBLtk= -cloud.google.com/go/kms v1.32.0 h1:s+rEluaaZKhLVjrIWG7uNBsnWbiitElzNzFGyp6+nIg= -cloud.google.com/go/kms v1.32.0/go.mod h1:CSGvW6GnMQbY+1nOHcIzhMtHSbExXlOmCKjWtYVjcpA= +cloud.google.com/go/kms v1.33.0 h1:pG0X78m212b2pv9N4fdMoUO69LuZGQ9kSvn8sHBOFAo= +cloud.google.com/go/kms v1.33.0/go.mod h1:CSGvW6GnMQbY+1nOHcIzhMtHSbExXlOmCKjWtYVjcpA= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= @@ -2952,88 +2952,88 @@ github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZw github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2 v1.43.0 h1:fharf/WhbRAVZ1du0QL7roNFxZ6T/sWr+4Ni617bwSI= -github.com/aws/aws-sdk-go-v2 v1.43.0/go.mod h1:5pKeft2eJj+gElQ38Jqg4ibCqh+/AK33/0X3hip7IjM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14 h1:3IZY0XAJquT3aHzbkHfPzy4ACPcEjVG0x87KOwtpqGY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.14/go.mod h1:zwM6veDkhGgQFqkBy+uT28AAYpLu+uFMlPl+rCg/73E= +github.com/aws/aws-sdk-go-v2 v1.43.6 h1:RrmFcqCBxkJuf7g1axVo5krB4jM/AO8r5e5oujrgdoQ= +github.com/aws/aws-sdk-go-v2 v1.43.6/go.mod h1:tXpPM+v0D1lndmga+HqqLDIzUFJlEeR21aspVklHF00= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18 h1:LAfOuhAH331fmOjTQpAaOlH+Ftn7RzSDJ2VFwjdMMy4= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.18/go.mod h1:4e5xhuXHx1e4U9EthvbPP1r/DIMp5c2823OL8karzcM= github.com/aws/aws-sdk-go-v2/config v1.18.14/go.mod h1:0pI6JQBHKwd0JnwAZS3VCapLKMO++UL2BOkWwyyzTnA= github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= -github.com/aws/aws-sdk-go-v2/config v1.32.31 h1:n4nY9O3QKoHIkL85EX+V8RcMFtOhlpTFhGArg915PXk= -github.com/aws/aws-sdk-go-v2/config v1.32.31/go.mod h1:PN0NYDCCoOpGGsZ2+elDUidmHfQBPyYzN2GCgl8HEBs= +github.com/aws/aws-sdk-go-v2/config v1.32.37 h1:Ljl7LOJB6ym0liuEl0+TZ3d7f5I8MEZN1Cj9PINlj/g= +github.com/aws/aws-sdk-go-v2/config v1.32.37/go.mod h1:WJ7pe7ZPpmG8Q5kKS53zeypIV4FBGACxmte8Uc6SgUc= github.com/aws/aws-sdk-go-v2/credentials v1.13.14/go.mod h1:85ckagDuzdIOnZRwws1eLKnymJs3ZM1QwVC1XcuNGOY= github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= -github.com/aws/aws-sdk-go-v2/credentials v1.19.30 h1:TTCvvzFU6gXa4iJecNG/0F/B0oYTiazoRECr2XyLHrY= -github.com/aws/aws-sdk-go-v2/credentials v1.19.30/go.mod h1:jKxAp2AEncnliinzpgOSZDFv6+VjvWhjw/AtbfsWT9U= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36 h1:84s5xMme6ENYEdKG8rsbSFFg/8+lbHBeM9QYSO0gnDk= +github.com/aws/aws-sdk-go-v2/credentials v1.19.36/go.mod h1:c46BLdagDLIswjgt+GeQOslXgeS0E6wCacs5yZbxPGk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23/go.mod h1:mOtmAg65GT1HIL/HT/PynwPbS+UG0BgCZ6vhkPqnxWo= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31 h1:kfVL5wAunCJycL6MOQ6aNh6PlAYEymflcjuKmrWUA0o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.31/go.mod h1:nWfRNDAppujCQgOUd43lKT4yeLv9z3nJ3bw1G3BgQKo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37 h1:b5tb+CZItBkydC7r3hTNdSO3pszG1R2EtnA+7TePQPk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.37/go.mod h1:ZQ+6SU9X0oz6+7MUCSswv9Mjci4eaqZr21HI2RVy/yA= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.34 h1:Pn7OsMwBLbkZ6OnCxWHAjf0L/22H8cnhxZC0uPwtMtg= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.34/go.mod h1:eToXR/Gk1uqpn04eSmdgVXwfS0WvH8aG4eBFr8ygbpU= -github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5 h1:7ZFdtE1XEHH+58GZU4Mbhq6SO/UbColleDApOtlv3vo= -github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.5/go.mod h1:M/qt7xBBXqilBwNmrO1yiu0cywZwQx5aqtKpdJN9J2A= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.14 h1:ZH5pitzSx4Q7UUVVfTAJTxlbhmELBI8aafgF0wWF5l4= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.3.14/go.mod h1:Wl+WygckBndyBhVf1kOVUCYBtS4KI2pHgcN8jGsYhwE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31 h1:Z8F3hfCY33IGpJjFAnv0wvtv1FIKj1GHmRDEYqy64tw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.31/go.mod h1:aVyUoytEyOViR6jhq6jula0xkc5NfBE2hgeF6BvOrao= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37 h1:lznzIOvvbqjfe8UAaciCRJgBgJsxuTROKlhZuXQWfv8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.37/go.mod h1:otfkzyfQeMMLZAqX59GSXTL3o22BR/l6HFaRzzbWSqA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31 h1:hyOxUyXdh3AyjE93gBgsfziJag9ACwcs+ZpDBLzi8mw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.31/go.mod h1:OERqI9k0draSLB8O8woxY3q25ZWTELRK4RRoLMuMZFo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37 h1:zCEORWo0eU0gDjG+IyApE/2B+ZGG1m+GU7B263XV8ds= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.37/go.mod h1:i6c0PEl3TNOWxRbQ++KQcVenPWS/GoQeiklKhNuqzJ8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30/go.mod h1:vsbq62AOBwQ1LJ/GWKFxX8beUEYeRp/Agitrxee2/qM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32 h1:0MrUL35H/Y4kdFfItoR5jCgtDQ4Z/8LudAoIHRfA4hE= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.32/go.mod h1:2tNZkuWz54arj8mHVf+8Y7cKkcD8Wr/fBpENgEXpjLc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38 h1:A3UAuCmx7LyUcrixBTzKJYYIUZ2yTvn6ZhT8PB+7APk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.38/go.mod h1:1PDUYG9Z+JrbbsobsAZHjWOm9QBT/djiK3QbykTL5Z4= github.com/aws/aws-sdk-go-v2/service/ecr v1.58.4 h1:fo6cmbxkKq/OtKUG0sK70fDsYjtKuSkjIQZUJwt24YM= github.com/aws/aws-sdk-go-v2/service/ecr v1.58.4/go.mod h1:7VJFM2lSPHz2I1rRb0a+lbphoOp7hXIgYjGhSTOLY7k= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.39.6 h1:pI1S5+Z8cfN/fImioNCHCWKFgm49ZeBhnjffJfRWHYA= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.39.6/go.mod h1:VctLEHQ91HQAWosSGqbNykn4OoxuUVGbE+1SachaXa0= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13 h1:mbRIur/BiHK6SKPjoBIXSE/hJ6g6JGRLuxQy1jGjlN4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.13/go.mod h1:ITg9em2KbJx1s0y4aqRX5OYWG6HBZ5TVR//OdpEZ2CQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24 h1:mdPwDQPqxlw9Sc62Nt15yjEcARaDbPXkjRYtXsUripo= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.24/go.mod h1:ls5ytnwLTcQaUu32fMYXFI3MjpKuTwL840PAm9iqyEg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17 h1:OvYZOB3qA6zvfdRFiRFRzVSiElMYrz3GdntkXZxlp1o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.17/go.mod h1:JgR/2Ew50ACfIWau1oeMRX59tMtC0kM+PYQGEaT04cY= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30 h1:5437eMoOwqqQpZn2XJy74mlDCuPYL81texMT3mXqgtU= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.30/go.mod h1:xfu2m3dOpvW8lj98wQYa8V9ku/Rta59hsbireGzhh3A= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23/go.mod h1:9uPh+Hrz2Vn6oMnQYiUi/zbh3ovbnQk19YKINkQny44= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31 h1:w2SIhW92DZPFrSL4ksVCr8IYff5OZwIcxg8+95tzvAI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.31/go.mod h1:wAhpCQbkov+IcvjozJbd2xRCoZybUEHNkcFunssNACg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32 h1:jWXtZdCnhXa9sGFixRaU2AxT4DIVse9HS4E2f+/KwV0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.32/go.mod h1:9JS1UpfVvyD/ZPX8GsKb/Pq8scEM+7GP5fqh9SwH7po= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37 h1:a3D4AjrOrTrP8+d9ILBthqrElf0z1JNol09Xvnwcys8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.37/go.mod h1:ky0gTu+ukvUTuUKFIpp6Wid4oninrkCyvbFkVs0kpHM= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38 h1:gX8B8y3Ho30B1LPxefDKMi/HZqWEb47U9ogs3DtSG0M= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.38/go.mod h1:l5WblZlcmGPe4/O7JY2HO25Z+xqTBvyfTyFbRMf8gYw= github.com/aws/aws-sdk-go-v2/service/kms v1.54.1 h1:aeJAJyvWS3gQ679pJbz8ZdOh3MViD1zvEdoZMVEawbg= github.com/aws/aws-sdk-go-v2/service/kms v1.54.1/go.mod h1:0RXNc6Yf3AvSMldGD6Lcch96Ojlw2TtGnHsqfD/L4u8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0 h1:7QZWVJZWzHivHWIa+5TELLaBBkbuoj0GPwQtMlJ0sqk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.106.0/go.mod h1:fcvq5L7dK+5cQFicEJwpI6e6Wn8NY2i6yT5wRLYVc7s= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.0 h1:OHH5iTQvVGmfHjX/5Q+vFuA/Rf2x6/95aJ/75QCQSm4= -github.com/aws/aws-sdk-go-v2/service/signin v1.5.0/go.mod h1:mCF3AK9PpL49oOrhniUXWAfhVBVQ/XbytoE5eccZUIs= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2 h1:GNU0/xtPEXMKilJZ/a8BedeuQnvu+Usi6qVm9EFfncc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.107.2/go.mod h1:4jYWUecEsQtE73jPl7p3jrbYXH5ffcR4gegyCygagfg= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6 h1:i68sFvXidKlkiSvI7d7Ilc1/UvW4CtBOaivH7jhG4fs= +github.com/aws/aws-sdk-go-v2/service/signin v1.5.6/go.mod h1:/h7Obr9WTtzbjTHGASRQwLN7Bupw+TC3x8x7fyx39hE= github.com/aws/aws-sdk-go-v2/service/sso v1.12.3/go.mod h1:jtLIhd+V+lft6ktxpItycqHqiVXrPIRjWIsFIlzMriw= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.0 h1:CaJyYhxBE0M/HJX/YvSaSmQlsI91VHB0lKU8LtLxL3A= -github.com/aws/aws-sdk-go-v2/service/sso v1.33.0/go.mod h1:+e6BMRMPjBQoCw/WovYR9GLy2IU0z4Q77smOB1DraSg= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6 h1:tpfGChmjUmv3W9WlRvy+stwKDTbFFdq8Zk9DbFPrfMU= +github.com/aws/aws-sdk-go-v2/service/sso v1.33.6/go.mod h1:CSjiDzmG/lsKkTOYjbkM+duLmRlW+LOxD64Na44ijnI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3/go.mod h1:zVwRrfdSmbRZWkUkWjOItY7SOalnFnq/Yg2LVPqDjwc= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0 h1:tC323YV77QdafeBr6LUhLDTsboyuyHLNRwAyCP44kGU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.0/go.mod h1:SfLK1sgviHmbI+MozR9iDwDjL4cdCVZtahsjoR+z7wg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6 h1:49BBtY68A+KJCQ3a2F3eUe6ROsKucxUdfHKoqorc0wI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.38.6/go.mod h1:ptG2hbs7QltE1GcQY0MpS4bfrc51KCnBXUr7OT1EEfE= github.com/aws/aws-sdk-go-v2/service/sts v1.18.4/go.mod h1:1mKZHLLpDMHTNSYPJ7qrcnCQdHCWsNQaT0xRvq2u80s= github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.0 h1:Pd6PNlp4t8PTXxqzstICl52Wsy78vpjFZ7PRUj44mJc= -github.com/aws/aws-sdk-go-v2/service/sts v1.45.0/go.mod h1:rmQ0TnHzuLPmabgjPcsywhsSOmaBDgzR4zvDxSPsGdg= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6 h1:JvExZWabChDM0qJAirQYGfOYo0ndT3edXj+fqSPNjkE= +github.com/aws/aws-sdk-go-v2/service/sts v1.45.6/go.mod h1:XZcaQkV2cItp6yEkrwljyaPOf22RuX7T43jxap/FOmM= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= -github.com/aws/smithy-go v1.27.4 h1:JQcphmBN4f0q/sPqXqROIItRNV/hy10cgu7CsFy616M= -github.com/aws/smithy-go v1.27.4/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/smithy-go v1.27.8 h1:FR0dxZfIlV7Z8eh2iHfIofdunw382XsDV3Mxt9nUvRY= +github.com/aws/smithy-go v1.27.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0 h1:JFWXO6QPihCknDdnL6VaQE57km4ZKheHIGd9YiOGcTo= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0/go.mod h1:046/oLyFlYdAghYQE2yHXi/E//VM5Cf3/dFmA+3CZ0c= github.com/aymanbagabas/go-udiff v0.4.1 h1:OEIrQ8maEeDBXQDoGCbbTTXYJMYRCRO1fnodZ12Gv5o= @@ -3532,32 +3532,32 @@ github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aA github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.25.2 h1:I0vy4n3alz+DHTiN1PRhCb7QZxkK6g5YmswZKv2TKuw= -github.com/go-openapi/analysis v0.25.2/go.mod h1:Uhs1t/2XR10EnwONYILGEzw8gcfGIG5Xk5K2AxnhqDo= +github.com/go-openapi/analysis v0.25.5 h1:xPYEvTb90o1y0epuiOPAoG4QqahjP3cdp5xNlHeKJRI= +github.com/go-openapi/analysis v0.25.5/go.mod h1:d3UGtQC5uq5Kqqqis2VH09Km/v3vwsWrYkbp4gdm+Rc= github.com/go-openapi/errors v0.22.8 h1:oP7sW7TWc3wFFjrzzj0nI83H2qMBkNjNfSd+XRejk/I= github.com/go-openapi/errors v0.22.8/go.mod h1:BuUoHcYrU6E7V9gfj1I5wLQqgtIHnup/alXZ8KdgQ0w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= -github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= +github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s= +github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/jsonreference v0.21.6 h1:NZ5nGfnaM1n4I43Xjm1e5/M2GjOwQwndQz22uhxwD+Y= -github.com/go-openapi/jsonreference v0.21.6/go.mod h1:xzbgtQ3ZbWxvET3AxdzCJlJt6vkovbf+IfSPJjD0tUY= -github.com/go-openapi/loads v0.24.0 h1:4LLorXRPTzIN9V6ngMUZbAscsBOUBk3Oa8cClu/bFrQ= -github.com/go-openapi/loads v0.24.0/go.mod h1:xQMgX+hw5xRAhGrcDXxeMw78IFqUpIzhleu3HqPhyF4= +github.com/go-openapi/jsonreference v1.0.0 h1:jlmTr6torcd1YgDQvSfNmRtKzYDO4FGBkrAdlAVWnpY= +github.com/go-openapi/jsonreference v1.0.0/go.mod h1:jtwdyGbJk0Xhe5Y+rwtglQP6Sb1WZST4rT32LWB+sv0= +github.com/go-openapi/loads v0.25.0 h1:74Bc2snfaVlsHzwdQj/3gsA9XJz3daXTJVs+4ZaK7jI= +github.com/go-openapi/loads v0.25.0/go.mod h1:JFBw4SIB9+PTIFHDfcXuSSy5h6aWzjtUCrPYyx3qWU8= github.com/go-openapi/runtime v0.32.3 h1:J7Ycy5DJmhhP1By3NifhRUjnkXTrk21qbeqSULjwX8U= github.com/go-openapi/runtime v0.32.3/go.mod h1:/WTQi0fa5DiGnnCXQKsTkSm15OzJp8Uz3H2t+67TBr4= github.com/go-openapi/runtime/server-middleware v0.32.3 h1:Y/6h9ix9NCoMG04XazRwX6eA3alh4+JZ6qXdar5yd24= github.com/go-openapi/runtime/server-middleware v0.32.3/go.mod h1:fYPep4GdTwg/XqZUjR40uIM/8C12Ba5M+MrGCiwpTHo= -github.com/go-openapi/spec v0.22.6 h1:Tyy1pLaNCM8GBCFLoGYLonjJi6zykqyLCjXLc19ZPic= -github.com/go-openapi/spec v0.22.6/go.mod h1:HZvTHat+iH0PALQRWhrqIHtU/PEqxqd89fu0MxGlMeM= -github.com/go-openapi/strfmt v0.26.3 h1:rzmslHarJgBbf2qfGge+X3htclQfmXqBZMm0Too0HhU= -github.com/go-openapi/strfmt v0.26.3/go.mod h1:a5nsUw0oRpQzZeOwx8bi6cKbzFZslpbCKt1LEot+KnQ= +github.com/go-openapi/spec v0.22.9 h1:/vKIFDcGKp0ktZWGbym/tJEWbk6/XOEmAVU0kqKMH+w= +github.com/go-openapi/spec v0.22.9/go.mod h1:b/mNUYIOQOyIiUzUzXEE8xzyZqf93KvM9hQGP91yfl0= +github.com/go-openapi/strfmt v0.27.0 h1:kbcTeaD9TXuXD0hhMXzuYa1sdTo6+dWGvwjW93E80IM= +github.com/go-openapi/strfmt v0.27.0/go.mod h1:s/qhDqfY72irigXUGJmtgid2Rm+3tnz3k8hZaRmvWYc= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= @@ -3565,34 +3565,36 @@ github.com/go-openapi/swag v0.26.1 h1:l5sVEyVpwj+DDYeZyo7wQI/Ebn/mKYIyGB/pFwAfGo github.com/go-openapi/swag v0.26.1/go.mod h1:yNY38BbIVthxbkDtq1UHBCGasBqjakW3lCR6ANzdBEw= github.com/go-openapi/swag/cmdutils v0.26.1 h1:f2iE1ijYaJ3nuu5PaEMx3zpEhzhZFgivCJObWEObLIQ= github.com/go-openapi/swag/cmdutils v0.26.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= -github.com/go-openapi/swag/conv v0.26.1 h1:slr5FVkg9Wc3Y5zcwenD8Sd/PQ94b2I/QJI7N7KTBpg= -github.com/go-openapi/swag/conv v0.26.1/go.mod h1:mvQXgPptZk9GTrFgGwWvT4q+dN+zQej9JfmGwnipz1A= -github.com/go-openapi/swag/fileutils v0.26.1 h1:K1XCM2CGhfNsc6YDt6v7Q5+1e59rftYWdcu/isZhvFw= -github.com/go-openapi/swag/fileutils v0.26.1/go.mod h1:mYUgxQAKX4ShS3qvvySx+/9yrlUnDhjiD1CalaQl8lQ= +github.com/go-openapi/swag/conv v0.27.3 h1:iqJFmGEjmX3AY0lSszABFqRVqOSt99XS0LzNIMJYuhU= +github.com/go-openapi/swag/conv v0.27.3/go.mod h1:nPRmN6jgNme99hpf+nM0auDZGALWIqlwhisKPK/bQhQ= +github.com/go-openapi/swag/fileutils v0.27.3 h1:3UVoZ2RLaIs1lt+2jcKzL8RM3Yk0rmsDE9FLA/HGxFE= +github.com/go-openapi/swag/fileutils v0.27.3/go.mod h1:VvJFZLTZS0AI854gEQz5tk7dBESdLjiNUMSZ/th2ry8= github.com/go-openapi/swag/jsonname v0.26.1 h1:VReupaV6WxlAsCn0e4DUfgV6bPmINnPpyJDLqSfNPcE= github.com/go-openapi/swag/jsonname v0.26.1/go.mod h1:OvdW6BoWoj33pTfi7x9vFrgmT+fk7aw0BRwvCE0YOuc= -github.com/go-openapi/swag/jsonutils v0.26.1 h1:2hdBfFkHg+7Wrz2VsCbeyR6hzkRDs7AztnMR2u84yOY= -github.com/go-openapi/swag/jsonutils v0.26.1/go.mod h1:U+RMJH3wa+6BRiphuRtIyI8fW9HPFqFQ4sHk2oRx0UQ= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1 h1:1CD7NiLLb/TXl3tOnFYU4b+mNfb5rtgHkaA+q7RMYYQ= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.1/go.mod h1:ZWafc8nMdYzTE3uYY6W86f0n46+IF0g4uUyRhJw/kXc= -github.com/go-openapi/swag/loading v0.26.1 h1:E9K4wqXeROlhjFQ13K9zMz6ojFGXIggGe+ad1odrK9w= -github.com/go-openapi/swag/loading v0.26.1/go.mod h1:3qvRIlWzWdq1HvmldwmuJ2ohpcAryN6xVt2OTKd0/7E= -github.com/go-openapi/swag/mangling v0.26.1 h1:gpYI4WuPKFJJVjV5cDLGlDVJhFIxYjQc7yN5eEb4CqM= -github.com/go-openapi/swag/mangling v0.26.1/go.mod h1:POETDH01hqAdASXfw7ISEd9bCOE6xBHOt8NHmGZRmYM= +github.com/go-openapi/swag/jsonutils v0.27.3 h1:1DEz+O82frtSMBcos/7XIn1GnpNTbsD4Bru4Dc/uhRc= +github.com/go-openapi/swag/jsonutils v0.27.3/go.mod h1:qiDCoQvzkMxrV3G8FLEdIU5L+EFYc0zcDOHWT3Yofvo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.3 h1:h/eT9kmGCDdFLJF29lOhzLtF0FmP1AX2MhLJWVebsb8= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.3/go.mod h1:mofwUWx70wvskwESqRJ//k/9kURmCgyJl5m5Ppoh5kY= +github.com/go-openapi/swag/loading v0.27.3 h1:L9nQkEgzU7QgFQL+pLEMfGUKxeM4pWwGwbET9Z3weW0= +github.com/go-openapi/swag/loading v0.27.3/go.mod h1:rJ0NeaKsF4CVPnMGjPQl7JlSHzvD0bc2DKXLss1hiuE= +github.com/go-openapi/swag/mangling v0.27.3 h1:gRzzD1PAUoLTtGMgI3KpBmCSOlTuLTFWnviLxLcTnyg= +github.com/go-openapi/swag/mangling v0.27.3/go.mod h1:jtBE2+V+3pILxOR7Vgce+Cwp6A2PgZbvVqfNntbVs0w= github.com/go-openapi/swag/netutils v0.26.1 h1:BNctoc39WTAUMxyAs355fExOPzMZtPbZ0ZZ1Am2FR5M= github.com/go-openapi/swag/netutils v0.26.1/go.mod h1:y02vByhZhQPAVwOX+0KipXFZ/hUbk6G/Enhf5rGaOkQ= -github.com/go-openapi/swag/stringutils v0.26.1 h1:f88uYyTso7TnHrKM/bUBsQ5e2wKf37cpgo6pvbzd9yU= -github.com/go-openapi/swag/stringutils v0.26.1/go.mod h1:Sc6d3bU8fgk5AyZR8/8jEQ+Is/Ald+TD/IIggPN8UJk= -github.com/go-openapi/swag/typeutils v0.26.1 h1:yg42FgMzRR6PVQ3M3qHz1s+Y6/P4HoJ3cBarXa3OVnU= -github.com/go-openapi/swag/typeutils v0.26.1/go.mod h1:VfnV+oUtSP2vCSCn2aJgnr8OevUYemyIzzS1VOzS10o= -github.com/go-openapi/swag/yamlutils v0.26.1 h1:0TSLK+lXs9vfIhAWzBeI/lOzEnIoot6WTCO1aAeWFTk= -github.com/go-openapi/swag/yamlutils v0.26.1/go.mod h1:7W5b7PRX9MxwL7TjeG7H8HkyBGRsIDRObhyMWFgBI2M= -github.com/go-openapi/testify/enable/yaml/v2 v2.5.1 h1:q9NtHwK4qHF7yZziBPvZyv7zWAIk8ok88Gh2mR6Jpc8= -github.com/go-openapi/testify/enable/yaml/v2 v2.5.1/go.mod h1:JW0MXIotCYps/XsgJnG3a8Q7rE5xAiBwoOD5OfaIQBk= -github.com/go-openapi/testify/v2 v2.5.1 h1:TMdhCaw8fUNraVSf3Omoob1dO/AzBfhtFAPW0an6sBo= -github.com/go-openapi/testify/v2 v2.5.1/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= -github.com/go-openapi/validate v0.26.0 h1:dxWzQ3F+vb1SajqUxHjwb5T4mTpSHmdrtv5Bi7+ZNhw= -github.com/go-openapi/validate v0.26.0/go.mod h1:b4o00uq7fJeJA+wWhVFCJpKTctzeFwzZImGGmHsl2JA= +github.com/go-openapi/swag/pools v0.27.3 h1:gXjImP3F6/56wRRcFgEPld084Y6u2gs21ikPBt8NKBk= +github.com/go-openapi/swag/pools v0.27.3/go.mod h1:kVQefhSK5RWuRe7BXsL8htgBPAMpN7HDGpGEknqugeE= +github.com/go-openapi/swag/stringutils v0.27.3 h1:Ru28hnbAvN5wycALQYy8IobHvASq+FUFMlp1QzLM0JI= +github.com/go-openapi/swag/stringutils v0.27.3/go.mod h1:lzRN95CxXmA03XcDWHLOb6nOMcxCqR5rGY0lOgsfRoM= +github.com/go-openapi/swag/typeutils v0.27.3 h1:l6SSrx5eR5/WVwrGNzN6bQ9WqL04mrxNBl9YgQ3rcJ4= +github.com/go-openapi/swag/typeutils v0.27.3/go.mod h1:Srm0xFNRZ1Y+vCxJclo5qzx8aj+1pAKda/YfFPrG0dQ= +github.com/go-openapi/swag/yamlutils v0.27.3 h1:cRFCAoYtslYn9L9T0xWryHy1t7c1MACC+DMj3CLvwvs= +github.com/go-openapi/swag/yamlutils v0.27.3/go.mod h1:6JYBGj8sw/NawMllyZY+cTA8Mzk2etS3ZBASdcyPsiU= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.0 h1:gGHwAJ0R/5jU8BEGDbfRNR3hL68dAVi84WuOApp29B0= +github.com/go-openapi/testify/enable/yaml/v2 v2.6.0/go.mod h1:tY+St1SGq4NFl0QIqdTY4aEdbChAHxhyB77XQi9iJCo= +github.com/go-openapi/testify/v2 v2.6.0 h1:5PKH2HE7YJ/LuRPQGvSxBRlFXNQhSetBLlGAgUEu3ug= +github.com/go-openapi/testify/v2 v2.6.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= +github.com/go-openapi/validate v0.26.1 h1:pZSbvtRO8G2R2FpWTYRn3w8LrsNwbtaVhP2dWiBa0Us= +github.com/go-openapi/validate v0.26.1/go.mod h1:B8UMgXiQiwwQWIbmuROlwJZDPGlikPuh7iHV1vPX9Oo= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.8.0/go.mod h1:gfqhcNwXrsd3XYKte9a7vM3smvU/jB4ZRDrmWSxpfdc= @@ -3943,8 +3945,8 @@ github.com/goreleaser/fileglob v1.4.0 h1:Y7zcUnzQjT1gbntacGAkIIfLv+OwojxTXBFxjSF github.com/goreleaser/fileglob v1.4.0/go.mod h1:1pbHx7hhmJIxNZvm6fi6WVrnP0tndq6p3ayWdLn1Yf8= github.com/goreleaser/go-shellwords v1.0.13 h1:ivvhC/RvUyud74c0urb1ZGYWPYGibY5QiFzcwHCege4= github.com/goreleaser/go-shellwords v1.0.13/go.mod h1:UtDFSSvW7wQL/4jmyzZbuP6HfI6R+oSm0v63cs61oDw= -github.com/goreleaser/goreleaser/v2 v2.17.1 h1:7nWdnNZSeiutF2PKAKmCEdEnLO+n0BWDoj4AqNiMX1E= -github.com/goreleaser/goreleaser/v2 v2.17.1/go.mod h1:0yFW5JOLYuNncutj9ebbj8Ok8NXcKg7t0bEN+Q0HuWs= +github.com/goreleaser/goreleaser/v2 v2.18.0 h1:wm1GhXmZeNt4fo1/Z6GFXWcf5gxOyM4SUXFjX7JmGMY= +github.com/goreleaser/goreleaser/v2 v2.18.0/go.mod h1:QE3tgJP5g42Vn7bUN1wyR2XJjQ5wCwbMdXhcOrD2Keo= github.com/goreleaser/nfpm/v2 v2.47.0 h1:0bioJAjWaMPntgDqynP4ze0Wt4zYqYSFJ5/BBy9XIGI= github.com/goreleaser/nfpm/v2 v2.47.0/go.mod h1:EhVWY2GwWB0Zf7FDDVqpDDCtvIzeqcUsAinpHSE8wUo= github.com/goreleaser/quill v0.0.0-20260630015114-8310f3e9a321 h1:/O7X5L3FuwXHT055Aar5b53A3pwUtL4z/1W8EqicJHQ= @@ -4131,8 +4133,8 @@ github.com/ipfs/go-log/v2 v2.9.2 h1:O/5BB0elpkRILvT24rCJ5976wWd7u0nJ436T3rdYdc4= github.com/ipfs/go-log/v2 v2.9.2/go.mod h1:RziRwwXWhndlk8L75RnEe0zeAYaq2heKtEMc3jqUov0= github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU= github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY= -github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A= -github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0= +github.com/jarcoal/httpmock v1.4.2 h1:dKwiP/9zITCPfBLsDn3kchbSOu16JrnxtVEmL0fPRcI= +github.com/jarcoal/httpmock v1.4.2/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedib0t/go-pretty/v6 v6.8.3 h1:yVSk5aemoYHCvcrtqyXklwqcgHQIQzmy/oUzFlmffSQ= @@ -4204,8 +4206,8 @@ github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQs github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= -github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8= +github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -4399,8 +4401,8 @@ github.com/moby/sys/user v0.4.1/go.mod h1:E9QsW5WRe1kUAf7kW8hXKwu1uhsZEAdPLYHYSD github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= -github.com/modelcontextprotocol/registry v1.8.0 h1:x/seX0ji4iqRUpSovmkBcGbxfRiZZ7dgPwBcpCJrSTM= -github.com/modelcontextprotocol/registry v1.8.0/go.mod h1:G6AUpTpZSekQvcLl5griUjijEE8vedARE/TyCaHEFdo= +github.com/modelcontextprotocol/registry v1.8.1 h1:baHVpbY9xc/lyCi/Wemcy7idVBNKROJZbSgzosCEuEo= +github.com/modelcontextprotocol/registry v1.8.1/go.mod h1:W26bRO/fiGMqCfDFNFz8DWZbFSpGj87JsqwrTbvLIWU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -4807,8 +4809,8 @@ github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+W github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= -github.com/slack-go/slack v0.27.0 h1:VWOpUzOK6UAPCCQlFxl79jhv8a/b+GOSJMnWziDJ8B8= -github.com/slack-go/slack v0.27.0/go.mod h1:UEe+jmo9WLlwHB04qsOrTDvqM7Aa4rQL3O5wF3n0hx4= +github.com/slack-go/slack v0.29.0 h1:ohhMNgp9DmPKiLhH/pNZV4NxhOXKgNy0SH8FzVHNerI= +github.com/slack-go/slack v0.29.0/go.mod h1:UEe+jmo9WLlwHB04qsOrTDvqM7Aa4rQL3O5wF3n0hx4= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index d2f58db30..04f4fec0c 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -527,15 +527,15 @@ License URL: https://github.com/go-logr/zapr/blob/v1.3.0/LICENSE ---------- Module: github.com/go-openapi/jsonpointer -Version: v0.23.1 +Version: v1.0.0 License: Apache-2.0 -License URL: https://github.com/go-openapi/jsonpointer/blob/v0.23.1/LICENSE +License URL: https://github.com/go-openapi/jsonpointer/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/jsonreference -Version: v0.21.6 +Version: v1.0.0 License: Apache-2.0 -License URL: https://github.com/go-openapi/jsonreference/blob/v0.21.6/LICENSE +License URL: https://github.com/go-openapi/jsonreference/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/swag @@ -551,15 +551,15 @@ License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.26.1/cmdutils/L ---------- Module: github.com/go-openapi/swag/conv -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/conv/v0.26.1/conv/LICENSE +License URL: https://github.com/go-openapi/swag/blob/conv/v0.27.3/conv/LICENSE ---------- Module: github.com/go-openapi/swag/fileutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.26.1/fileutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.27.3/fileutils/LICENSE ---------- Module: github.com/go-openapi/swag/jsonname @@ -569,21 +569,21 @@ License URL: https://github.com/go-openapi/swag/blob/jsonname/v0.26.1/jsonname/L ---------- Module: github.com/go-openapi/swag/jsonutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/jsonutils/v0.26.1/jsonutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/jsonutils/v0.27.3/jsonutils/LICENSE ---------- Module: github.com/go-openapi/swag/loading -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/loading/v0.26.1/loading/LICENSE +License URL: https://github.com/go-openapi/swag/blob/loading/v0.27.3/loading/LICENSE ---------- Module: github.com/go-openapi/swag/mangling -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/mangling/v0.26.1/mangling/LICENSE +License URL: https://github.com/go-openapi/swag/blob/mangling/v0.27.3/mangling/LICENSE ---------- Module: github.com/go-openapi/swag/netutils @@ -591,23 +591,29 @@ Version: v0.26.1 License: Apache-2.0 License URL: https://github.com/go-openapi/swag/blob/netutils/v0.26.1/netutils/LICENSE +---------- +Module: github.com/go-openapi/swag/pools +Version: v0.27.3 +License: Apache-2.0 +License URL: https://github.com/go-openapi/swag/blob/pools/v0.27.3/pools/LICENSE + ---------- Module: github.com/go-openapi/swag/stringutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/stringutils/v0.26.1/stringutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/stringutils/v0.27.3/stringutils/LICENSE ---------- Module: github.com/go-openapi/swag/typeutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/typeutils/v0.26.1/typeutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/typeutils/v0.27.3/typeutils/LICENSE ---------- Module: github.com/go-openapi/swag/yamlutils -Version: v0.26.1 +Version: v0.27.3 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/yamlutils/v0.26.1/yamlutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/yamlutils/v0.27.3/yamlutils/LICENSE ---------- Module: github.com/go-redis/cache/v9 @@ -887,39 +893,39 @@ License URL: https://github.com/kevinburke/ssh_config/blob/v1.6.0/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: MIT -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: Apache-2.0 -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/LICENSE ---------- Module: github.com/klauspost/compress/internal/snapref -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/internal/snapref/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/internal/snapref/LICENSE ---------- Module: github.com/klauspost/compress/s2 -Version: v1.19.1 +Version: v1.19.2 License: BSD-3-Clause -License URL: https://github.com/klauspost/compress/blob/v1.19.1/s2/LICENSE +License URL: https://github.com/klauspost/compress/blob/v1.19.2/s2/LICENSE ---------- Module: github.com/klauspost/compress/zstd/internal/xxhash -Version: v1.19.1 +Version: v1.19.2 License: MIT -License URL: https://github.com/klauspost/compress/blob/v1.19.1/zstd/internal/xxhash/LICENSE.txt +License URL: https://github.com/klauspost/compress/blob/v1.19.2/zstd/internal/xxhash/LICENSE.txt ---------- Module: github.com/klauspost/cpuid/v2 From 591dd356b716541ada2f6c251d0a71e8481d2b90 Mon Sep 17 00:00:00 2001 From: Codesphere Bot <117686659+CodesphereBot@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:59:57 +0200 Subject: [PATCH 054/132] update(deps): update module github.com/google/go-github/v74 to v90 (#640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > ℹ️ **Note** > > This PR body was truncated due to platform limits. This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/google/go-github/v74](https://redirect.github.com/google/go-github) | `v74.0.0` → `v90.0.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgoogle%2fgo-github%2fv74/v90.0.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgoogle%2fgo-github%2fv74/v74.0.0/v90.0.0?slim=true) | --- ### Release Notes
google/go-github (github.com/google/go-github/v74) ### [`v90.0.0`](https://redirect.github.com/google/go-github/releases/tag/v90.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v89.0.0...v90.0.0) This release contains the following breaking API changes: - refactor!: Pass `UpdateConnectedExternalGroup` request body by value via new `UpdateConnectedExternalGroupRequest` ([#​4425](https://redirect.github.com/google/go-github/issues/4425)) BREAKING CHANGE: `TeamsService.UpdateConnectedExternalGroup` now takes `UpdateConnectedExternalGroupRequest` (with non-pointer `GroupID`) by value. - refactor!: Rename `PullRequestReviewDismissalRequest` to `PullRequestDismissReviewRequest`, add `PullRequestSubmitReviewRequest`, and pass review request bodies by value ([#​4406](https://redirect.github.com/google/go-github/issues/4406)) BREAKING CHANGE: `PullRequestReviewDismissalRequest` is now `PullRequestDismissReviewRequest` with non-pointer `Message` and `PullRequestsService.DismissReview` takes it by value; `PullRequestsService.SubmitReview` now takes a new `PullRequestSubmitReviewRequest`. - refactor!: Split `CreateOrUpdateCustomRepoRoleOptions` into `CreateCustomRepoRoleRequest` and `UpdateCustomRepoRoleRequest` and pass by value ([#​4401](https://redirect.github.com/google/go-github/issues/4401)) BREAKING CHANGE: `CreateOrUpdateCustomRepoRoleOptions` is split into `CreateCustomRepoRoleRequest` (with non-pointer `Name` and `BaseRole`) and `UpdateCustomRepoRoleRequest`; `OrganizationsService.CreateCustomRepoRole` and `UpdateCustomRepoRole` now take these request types by value. - refactor!: Rename `EditLabel` to `UpdateLabel`, Split `Label` into `CreateLabelRequest` & `UpdateLabelRequest` and pass by value ([#​4400](https://redirect.github.com/google/go-github/issues/4400)) BREAKING CHANGE: `IssuesService.CreateLabel` now takes `CreateLabelRequest` by value (with required non-pointer `Name`); `IssuesService.EditLabel` renamed to `UpdateLabel`, taking an `UpdateLabelRequest` by value. - refactor!: Rename `AutolinkOptions` to `CreateAutolinkRequest`, `AddAutolink` to `CreateAutolink`, and pass the body by value ([#​4399](https://redirect.github.com/google/go-github/issues/4399)) BREAKING CHANGE: `AutolinkOptions` is now `CreateAutolinkRequest` with non-pointer `KeyPrefix` and `URLTemplate`; `RepositoriesService.AddAutolink` is now `CreateAutolink` and passes `body` by value. - refactor!: Split `IssueRequest` into `CreateIssueRequest` & `UpdateIssueRequest` and pass by value ([#​4396](https://redirect.github.com/google/go-github/issues/4396)) BREAKING CHANGE: `IssueService.Edit` is renamed to `IssueService.Update`. - refactor!: Rename `NewPullRequest` to `CreatePullRequest` and pass it by value ([#​4395](https://redirect.github.com/google/go-github/issues/4395)) BREAKING CHANGE: `NewPullRequest` is renamed to `CreatePullRequest`, `PullRequests.Create` now takes it by value, and `CreatePullRequest.Head` and `CreatePullRequest.Base` are now `string`. - refactor!: Pass `SarifAnalysis` by value ([#​4394](https://redirect.github.com/google/go-github/issues/4394)) BREAKING CHANGE: `CodeScanningService.UploadSarif` now takes `body` by value and its required fields are no longer pointers. - refactor!: Pass `CreateDeploymentBranchPolicyRequest` and `UpdateDeploymentBranchPolicyRequest` by value ([#​4382](https://redirect.github.com/google/go-github/issues/4382)) BREAKING CHANGE: `RepositoriesService.CreateDeploymentBranchPolicy` and `UpdateDeploymentBranchPolicy` now take `body` by value and the required `Name` field is of type `string`. - refactor!: Pass `TemplateRepoRequest` by value in `Repositories.CreateFromTemplate` ([#​4378](https://redirect.github.com/google/go-github/issues/4378)) BREAKING CHANGE: `RepositoriesService.CreateFromTemplate` now passes `body` by value and `Name` is now required and passed by value. - refactor!: Pass `RepositoryMergeRequest` and `RepoMergeUpstreamRequest` by value ([#​4372](https://redirect.github.com/google/go-github/issues/4372)) BREAKING CHANGE: `RepositoriesService.Merge` and `RepositoriesService.MergeUpstream` now pass `body` by value and required struct fields are now values. - feat!: Refactor dependabot secrets to pass request by value ([#​4348](https://redirect.github.com/google/go-github/issues/4348)) BREAKING CHANGE: `DependabotService` methods involving secrets have new params and return values. ...and the following additional changes: - chore: Bump version of go-github to v90.0.0 ([#​4428](https://redirect.github.com/google/go-github/issues/4428)) - docs: Clarify assisted contribution expectations ([#​4427](https://redirect.github.com/google/go-github/issues/4427)) - feat: Add org level secret scanning custom patterns support ([#​4426](https://redirect.github.com/google/go-github/issues/4426)) - feat: Add `MetaService.ListAPIVersions` ([#​4422](https://redirect.github.com/google/go-github/issues/4422)) - feat: Add `DeleteCodeQLDatabase` for code scanning ([#​4421](https://redirect.github.com/google/go-github/issues/4421)) - feat: Add `Stack` field to `PullRequest` for stacked pull requests ([#​4423](https://redirect.github.com/google/go-github/issues/4423)) - build: Bump GitHub workflow action versions ([#​4424](https://redirect.github.com/google/go-github/issues/4424)) - feat: Add `search_type` support to issue search ([#​4414](https://redirect.github.com/google/go-github/issues/4414)) - chore: Update SecurityAdvisory structs with new fields ([#​4413](https://redirect.github.com/google/go-github/issues/4413)) - chore: Consolidate Dependabot PRs ([#​4418](https://redirect.github.com/google/go-github/issues/4418)) - feat: Support OIDC custom property claims for Actions ([#​4411](https://redirect.github.com/google/go-github/issues/4411)) - feat: Add repo-level secret scanning custom patterns support ([#​4397](https://redirect.github.com/google/go-github/issues/4397)) - chore: Update openapi\_operations.yaml ([#​4412](https://redirect.github.com/google/go-github/issues/4412)) - chore: Fix comment typo ([#​4410](https://redirect.github.com/google/go-github/issues/4410)) - chore: Update dependabot changes ([#​4405](https://redirect.github.com/google/go-github/issues/4405)) - chore: Update openapi\_operations.yaml ([#​4398](https://redirect.github.com/google/go-github/issues/4398)) - feat: Add remaining Projects v2 endpoints ([#​4319](https://redirect.github.com/google/go-github/issues/4319)) - chore: Update Dependabot-driven dependencies ([#​4393](https://redirect.github.com/google/go-github/issues/4393)) - chore: Bump /example dependencies ([#​4380](https://redirect.github.com/google/go-github/issues/4380)) - chore: Fix flaky tests with deterministic runs ([#​4377](https://redirect.github.com/google/go-github/issues/4377)) - build(deps): Bump golang.org/x/sync from 0.21.0 to 0.22.0 in /tools ([#​4376](https://redirect.github.com/google/go-github/issues/4376)) - chore: Fix flaky unit test ([#​4374](https://redirect.github.com/google/go-github/issues/4374)) - fix: Enable submitting empty allowlist for actions permissions patterns ([#​4371](https://redirect.github.com/google/go-github/issues/4371)) - feat: Add GitHub App Enterprise perm scope ([#​4343](https://redirect.github.com/google/go-github/issues/4343)) - chore: Bump go-github from v88 to v89 in /scrape ([#​4370](https://redirect.github.com/google/go-github/issues/4370)) ### [`v89.0.0`](https://redirect.github.com/google/go-github/releases/tag/v89.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v88.0.0...v89.0.0) This release contains the following breaking API changes: - refactor!: Pass `DeploymentRequest` and `DeploymentStatusRequest` by value ([#​4361](https://redirect.github.com/google/go-github/issues/4361)) BREAKING CHANGE: `CreateDeployment` and `CreateDeploymentStatus` now take `DeploymentRequest` and `DeploymentStatusRequest` by value; `DeploymentRequest.Ref` and `DeploymentStatusRequest.State` are now `string`, and `DeploymentRequest.RequiredContexts` is now `[]string`. - refactor!: Pass `HookConfig` by value and rename `EditHookConfiguration` to `UpdateHookConfiguration` ([#​4360](https://redirect.github.com/google/go-github/issues/4360)) BREAKING CHANGE: `EditHookConfiguration` is renamed to `UpdateHookConfiguration` on `RepositoriesService` and `OrganizationsService`; these methods and `AppsService.UpdateHookConfig` now take `HookConfig` by value. - refactor!: Pass `OIDCSubjectClaimCustomTemplate` by value in the OIDC subject-claim Set methods ([#​4340](https://redirect.github.com/google/go-github/issues/4340)) BREAKING CHANGE: `SetOrgOIDCSubjectClaimCustomTemplate` and `SetRepoOIDCSubjectClaimCustomTemplate` now take their `body` params by value. - feat!: Refactor actions variables to pass request by value ([#​4346](https://redirect.github.com/google/go-github/issues/4346)) BREAKING CHANGE: `ActionsService` methods involving variables have new params and return values. - feat!: Replace actions env secret endpoints ([#​4335](https://redirect.github.com/google/go-github/issues/4335)) BREAKING CHANGE: `ActionsService` methods involving secrets have new params and return values. - refactor!: Pass `CreateJITConfigRequest` by value and rename `Generate*JITConfig` to `Create*JITConfig` ([#​4337](https://redirect.github.com/google/go-github/issues/4337)) BREAKING CHANGE: the JIT config methods are renamed from `Generate*JITConfig` to `Create*JITConfig`, and they now take `CreateJITConfigRequest` (renamed from `GenerateJITConfigRequest`) by value instead of by pointer. - refactor!: Pass release-notes and asset params by value and rename `EditReleaseAsset` to `UpdateReleaseAsset` ([#​4336](https://redirect.github.com/google/go-github/issues/4336)) BREAKING CHANGE: `GenerateReleaseNotes` now takes `GenerateNotesRequest` by value (renamed from `GenerateNotesOptions`); `EditReleaseAsset` is renamed to `UpdateReleaseAsset` and takes `UpdateReleaseAssetRequest` by value. - refactor!: Pass release params by value and rename `EditRelease` to `UpdateRelease` ([#​4329](https://redirect.github.com/google/go-github/issues/4329)) BREAKING CHANGE: `CreateRelease` & `UpdateRelease` now take `RepositoryRelease` by value; `EditRelease` is renamed to `UpdateRelease`. - refactor!: Pass `GistsService` required params by value ([#​4320](https://redirect.github.com/google/go-github/issues/4320)) BREAKING CHANGE: `GistsService` methods now pass required params by-value instead of by-ref. - fix!: Send request body in SCIM update methods ([#​4315](https://redirect.github.com/google/go-github/issues/4315)) BREAKING CHANGE: `UpdateProvisionedOrgMembership` and `UpdateAttributeForSCIMUser` params and return values changed. - fix!: Fix `LicenseStatus` response and `Supportkey` type ([#​4297](https://redirect.github.com/google/go-github/issues/4297)) BREAKING CHANGE: `LicenseStatus.SupportKey` type changed from `*string` to `*bool` and `License` return type is no longer a slice. - fix!: Enterprise App installation repos options structs ([#​4298](https://redirect.github.com/google/go-github/issues/4298)) BREAKING CHANGE: `SelectedRepositoryIDs []int64` is now `Repositories []string` in `*AppInstallationRepositoriesOptions`. ...and the following additional changes: - chore: Bump version of go-github to v89.0.0 ([#​4369](https://redirect.github.com/google/go-github/issues/4369)) - feat: Add user team membership fields ([#​4347](https://redirect.github.com/google/go-github/issues/4347)) - chore: Add deprecated flag for unused metadata ([#​4367](https://redirect.github.com/google/go-github/issues/4367)) - docs: Add AGENTS.md and review-feedback tip ([#​4368](https://redirect.github.com/google/go-github/issues/4368)) - chore: Mark removed billing endpoints as deprecated ([#​4362](https://redirect.github.com/google/go-github/issues/4362)) - chore: Validate metadata ([#​4358](https://redirect.github.com/google/go-github/issues/4358)) - chore: Bump golang.org/x/tools to v0.47.0 ([#​4357](https://redirect.github.com/google/go-github/issues/4357)) - build(deps): Bump actions/setup-go from 6.4.0 to 6.5.0 in the actions group ([#​4349](https://redirect.github.com/google/go-github/issues/4349)) - build(deps): Bump the go\_modules group in /example ([#​4345](https://redirect.github.com/google/go-github/issues/4345)) - feat: Add `AccessSource` to `Team` ([#​4344](https://redirect.github.com/google/go-github/issues/4344)) - docs: Update `CONTRIBUTING.md` ([#​4341](https://redirect.github.com/google/go-github/issues/4341)) - build(deps): Bump golangci/golangci-lint-action from 9.2.1 to 9.3.0 ([#​4342](https://redirect.github.com/google/go-github/issues/4342)) - docs: Extend CONTRIBUTING.md with code guidelines ([#​4339](https://redirect.github.com/google/go-github/issues/4339)) - fix: AuditEntry fields `org` and `org_id` can be an array ([#​4333](https://redirect.github.com/google/go-github/issues/4333)) - build(deps): Bump actions/checkout from 6.0.3 to 7.0.0 in the actions group ([#​4332](https://redirect.github.com/google/go-github/issues/4332)) - feat: Add code quality findings support ([#​4330](https://redirect.github.com/google/go-github/issues/4330)) - chore: Update `openapi_operations.yaml` ([#​4331](https://redirect.github.com/google/go-github/issues/4331)) - chore: Replace `time.Date` with `referenceTime` ([#​4325](https://redirect.github.com/google/go-github/issues/4325)) - test: Refactor tests for `ProjectV2Item.UnmarshalJSON` ([#​4323](https://redirect.github.com/google/go-github/issues/4323)) - chore: Remove obsolete test/fields utility ([#​4322](https://redirect.github.com/google/go-github/issues/4322)) - feat: Add Issue Dependencies API support ([#​4130](https://redirect.github.com/google/go-github/issues/4130)) - fix: Set `GetBody` on uploads for HTTP/2 retry ([#​4318](https://redirect.github.com/google/go-github/issues/4318)) - chore: Remove deleted account from REVIEWERS ([#​4317](https://redirect.github.com/google/go-github/issues/4317)) - build(deps): Bump golang.org/x/crypto from 0.52.0 to 0.53.0 in /example ([#​4305](https://redirect.github.com/google/go-github/issues/4305)) - build(deps): Bump codecov/codecov-action from 6.0.1 to 7.0.0 ([#​4303](https://redirect.github.com/google/go-github/issues/4303)) - build(deps): Bump golang.org/x/net from 0.55.0 to 0.56.0 in /scrape ([#​4302](https://redirect.github.com/google/go-github/issues/4302)) - build(deps): Bump golang.org/x/term from 0.43.0 to 0.44.0 in /example ([#​4304](https://redirect.github.com/google/go-github/issues/4304)) - build(deps): Bump golang.org/x/tools from 0.45.0 to 0.46.0 in /tools ([#​4314](https://redirect.github.com/google/go-github/issues/4314)) - build(deps): Bump github.com/bradleyfalzon/ghinstallation/v2 from 2.18.0 to 2.19.0 in /example ([#​4306](https://redirect.github.com/google/go-github/issues/4306)) - refactor: Fix parameters in method endpoints ([#​4300](https://redirect.github.com/google/go-github/issues/4300)) - feat: Add enterprise billing usage endpoints and response types ([#​4288](https://redirect.github.com/google/go-github/issues/4288)) - build(deps): Bump golang.org/x/sync from 0.20.0 to 0.21.0 in /tools ([#​4294](https://redirect.github.com/google/go-github/issues/4294)) - build(deps): Bump github.com/getkin/kin-openapi from 0.139.0 to 0.140.0 in /tools ([#​4295](https://redirect.github.com/google/go-github/issues/4295)) - build(deps): Bump actions/checkout from 6.0.2 to 6.0.3 in the actions group ([#​4293](https://redirect.github.com/google/go-github/issues/4293)) - fix: Reject URL path segments containing percent-encoded dots ([#​4291](https://redirect.github.com/google/go-github/issues/4291)) - fix: Comparison of durations in `AbuseRateLimitError.Is` ([#​4292](https://redirect.github.com/google/go-github/issues/4292)) - test: Replace `&x` variables with inline `Ptr(value)` calls ([#​4289](https://redirect.github.com/google/go-github/issues/4289)) - feat: Inject OpenAPI deprecations safely ([#​4286](https://redirect.github.com/google/go-github/issues/4286)) - chore: Remove 'munlicode' from REVIEWERS ([#​4287](https://redirect.github.com/google/go-github/issues/4287)) - feat: Add `GetOrgAICreditUsage` and `GetUserAICreditUsage` endpoints ([#​4282](https://redirect.github.com/google/go-github/issues/4282)) - test: Fix test names and error messages ([#​4284](https://redirect.github.com/google/go-github/issues/4284)) - test: Use `testJSONBody` helper for request body assertions ([#​4283](https://redirect.github.com/google/go-github/issues/4283)) - feat: Add pull request fields to `Repository` ([#​4268](https://redirect.github.com/google/go-github/issues/4268)) - build(deps): Bump golangci/golangci-lint-action from 9.2.0 to 9.2.1 ([#​4272](https://redirect.github.com/google/go-github/issues/4272)) - build(deps): Bump go.opentelemetry.io/otel to v1.44.0 ([#​4280](https://redirect.github.com/google/go-github/issues/4280)) - build(deps): Bump golang.org/x/net from 0.54.0 to 0.55.0 in /scrape ([#​4271](https://redirect.github.com/google/go-github/issues/4271)) - build(deps): Bump golang.org/x/crypto from 0.51.0 to 0.52.0 in /example ([#​4273](https://redirect.github.com/google/go-github/issues/4273)) - fix: Handle missing reviewer type in `RequiredReviewer` unmarshal ([#​4270](https://redirect.github.com/google/go-github/issues/4270)) - test: Remove redundant Marshal tests ([#​4266](https://redirect.github.com/google/go-github/issues/4266)) - chore: Update `openapi_operations.yaml` ([#​4265](https://redirect.github.com/google/go-github/issues/4265)) - feat: Add support for GitHub Code Quality API ([#​4260](https://redirect.github.com/google/go-github/issues/4260)) - build(deps): Bump github.com/getkin/kin-openapi from 0.138.0 to 0.139.0 in /tools ([#​4261](https://redirect.github.com/google/go-github/issues/4261)) - chore: Fix zizmor security issues in GHA workflows ([#​4259](https://redirect.github.com/google/go-github/issues/4259)) - feat: Add support for getting Copilot cloud agent configuration ([#​4241](https://redirect.github.com/google/go-github/issues/4241)) - feat: Add client API version support ([#​4246](https://redirect.github.com/google/go-github/issues/4246)) - test: Add secret scanning marshal tests ([#​4252](https://redirect.github.com/google/go-github/issues/4252)) - lint: Improve `extraneousnew` linter to catch unnecessary use of value var ([#​4249](https://redirect.github.com/google/go-github/issues/4249)) - build(deps): Bump codecov/codecov-action from 6.0.0 to 6.0.1 ([#​4248](https://redirect.github.com/google/go-github/issues/4248)) - chore: Bump go-github from v87 to v88 in /scrape ([#​4247](https://redirect.github.com/google/go-github/issues/4247)) ### [`v88.0.0`](https://redirect.github.com/google/go-github/releases/tag/v88.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v87.0.0...v88.0.0) This release contains the following breaking API changes: - refactor!: Change app installation `Find*` methods to `Get*` ([#​4243](https://redirect.github.com/google/go-github/issues/4243)) BREAKING CHANGE: App installation methods are renamed from `Find*` to `Get*`. ...and the following additional changes: - chore: Bump version of go-github to v88.0.0 ([#​4245](https://redirect.github.com/google/go-github/issues/4245)) - chore: Update `openapi_operations.yaml` ([#​4242](https://redirect.github.com/google/go-github/issues/4242)) - feat: Add support for setting client URLs ([#​4240](https://redirect.github.com/google/go-github/issues/4240)) - refactor: Add constants for API versions ([#​4236](https://redirect.github.com/google/go-github/issues/4236)) - docs: Formatting and punctuation changes ([#​4235](https://redirect.github.com/google/go-github/issues/4235)) - feat: Add `GetParentIssue` for sub-issues ([#​4232](https://redirect.github.com/google/go-github/issues/4232)) - chore: Bump go-github from v86 to v87 in /scrape ([#​4234](https://redirect.github.com/google/go-github/issues/4234)) ### [`v87.0.0`](https://redirect.github.com/google/go-github/releases/tag/v87.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v86.0.0...v87.0.0) This release contains the following breaking API changes: - refactor!: Change `GetConsumedLicenses` to `ListConsumedLicenses` ([#​4226](https://redirect.github.com/google/go-github/issues/4226)) BREAKING CHANGE: `EnterpriseService.GetConsumedLicenses` is now `EnterpriseService.ListConsumedLicenses`. - refactor!: Change `GetAllRepositoryRulesets` to `ListAllRepositoryRulesets` ([#​4227](https://redirect.github.com/google/go-github/issues/4227)) BREAKING CHANGE: `OrganizationsService.GetAllRepositoryRulesets` is now `OrganizationsService.ListAllRepositoryRulesets`. - refactor!: Change `GetRulesForBranch` to `ListRulesForBranch` ([#​4229](https://redirect.github.com/google/go-github/issues/4229)) BREAKING CHANGE: `RepositoriesService.GetRulesForBranch` is now `RepositoriesService.ListRulesForBranch`. - feat!: Refactor client constructor to use options pattern ([#​4201](https://redirect.github.com/google/go-github/issues/4201)) BREAKING CHANGE: Clients are now constructed with a nicer builder pattern. See docs for details. - fix!: Align `IssueFieldValues` with schema ([#​4207](https://redirect.github.com/google/go-github/issues/4207)) BREAKING CHANGE: `IssueRequest.IssueFieldValues` type is changed. ...and the following additional changes: - chore: Bump version of go-github to v87.0.0 ([#​4233](https://redirect.github.com/google/go-github/issues/4233)) - feat: Add enterprise app installation lookup ([#​4230](https://redirect.github.com/google/go-github/issues/4230)) - chore: Update openapi\_operations.yaml ([#​4228](https://redirect.github.com/google/go-github/issues/4228)) - fix: Use value receiver for `MarshalJSON` ([#​4211](https://redirect.github.com/google/go-github/issues/4211)) - chore: Update dependencies ([#​4224](https://redirect.github.com/google/go-github/issues/4224)) - fix: Close `httptest` server to prevent test flakiness ([#​4210](https://redirect.github.com/google/go-github/issues/4210)) - feat: Add two new fields to org `CodeSecurityConfiguration` ([#​4205](https://redirect.github.com/google/go-github/issues/4205)) - chore: Bump golangci-lint to v2.12.2 ([#​4206](https://redirect.github.com/google/go-github/issues/4206)) - build(deps): Bump github.com/in-toto/in-toto-golang from 0.9.0 to 0.11.0 in /example ([#​4203](https://redirect.github.com/google/go-github/issues/4203)) - fix: Limit HTTP error response body reads to prevent OOM ([#​4191](https://redirect.github.com/google/go-github/issues/4191)) - feat: Add issue field values support for write and read ([#​4200](https://redirect.github.com/google/go-github/issues/4200)) - chore: Bump `go-github` from `v85` to `v86` in /scrape ([#​4199](https://redirect.github.com/google/go-github/issues/4199)) ### [`v86.0.0`](https://redirect.github.com/google/go-github/releases/tag/v86.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v85.0.0...v86.0.0) This release contains the following breaking API changes: - feat!: Refactor request context ([#​4151](https://redirect.github.com/google/go-github/issues/4151)) BREAKING CHANGE: All internal calls now provide `Context` via the `Request` itself. - feat!: Add OIDC authentication support to `PrivateRegistries` ([#​4159](https://redirect.github.com/google/go-github/issues/4159)) BREAKING CHANGE: `PrivateRegistriesService` is updated to API version `2026-03-10` with struct and response changes. ...and the following additional changes: - chore: Bump version of `go-github` to `v86.0.0` ([#​4198](https://redirect.github.com/google/go-github/issues/4198)) - test: Fix invalid JSON payloads in actions workflow runs tests ([#​4197](https://redirect.github.com/google/go-github/issues/4197)) - feat: Add repo download contents sentinel errors ([#​4192](https://redirect.github.com/google/go-github/issues/4192)) - chore: Fix `otel` module name ([#​4187](https://redirect.github.com/google/go-github/issues/4187)) - feat: Add typed Copilot metrics download helpers ([#​4177](https://redirect.github.com/google/go-github/issues/4177)) - feat: Add `deploy_keys_enabled_for_repositories` and secret scanning custom link fields to `Organization` struct ([#​4188](https://redirect.github.com/google/go-github/issues/4188)) - refactor: Use `testJSONBody` helper for request body assertions in tests ([#​4183](https://redirect.github.com/google/go-github/issues/4183)) - build(deps): Bump github.com/getkin/kin-openapi from 0.135.0 to 0.137.0 in /tools ([#​4184](https://redirect.github.com/google/go-github/issues/4184)) - fix: Include `RetryAfter` in `AbuseRateLimitError.Error` output ([#​4181](https://redirect.github.com/google/go-github/issues/4181)) - fix: Handle string-typed reviewer `ID` in Ruleset API responses ([#​4178](https://redirect.github.com/google/go-github/issues/4178)) - feat: Add `ArchivedAt` field to `Organization` struct ([#​4179](https://redirect.github.com/google/go-github/issues/4179)) - feat: Add Copilot coding agent and content exclusion org endpoints ([#​4176](https://redirect.github.com/google/go-github/issues/4176)) - chore: Bump go-github from v84 to v85 in /scrape ([#​4174](https://redirect.github.com/google/go-github/issues/4174)) ### [`v85.0.0`](https://redirect.github.com/google/go-github/releases/tag/v85.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v84.0.0...v85.0.0) This release contains the following breaking API changes: - fix!: Resolve inconsistent options for `create` and `update` on custom org role ([#​4075](https://redirect.github.com/google/go-github/issues/4075)) BREAKING CHANGE: `GetOrgRole`, `CreateCustomOrgRole`, and `UpdateCustomOrgRole` have new params and return values. - fix!: Change `id` from `int64` to `string` in `ActivityService.MarkThreadDone` ([#​4056](https://redirect.github.com/google/go-github/issues/4056)) BREAKING CHANGE: `ActivityService.MarkThreadDone` accepts `string` `id` instead of `int64`. ...and the following additional changes: - chore: Bump version of go-github to v85.0.0 ([#​4173](https://redirect.github.com/google/go-github/issues/4173)) - chore: Update `openapi_operations.yaml` ([#​4172](https://redirect.github.com/google/go-github/issues/4172)) - security: Reject cross-host redirects to prevent Authorization leak ([#​4171](https://redirect.github.com/google/go-github/issues/4171)) - chore: Improve GitHub Actions workflows lint and testing ([#​4169](https://redirect.github.com/google/go-github/issues/4169)) - chore: Switch legacy redirect handling to new pattern ([#​4161](https://redirect.github.com/google/go-github/issues/4161)) - feat: Add `CodeSecurity` to `SecurityAndAnalysis` ([#​4155](https://redirect.github.com/google/go-github/issues/4155)) - fix: Reject URL path segments containing ".." in all request methods ([#​4150](https://redirect.github.com/google/go-github/issues/4150)) - feat: Refactor repositories download contents ([#​4153](https://redirect.github.com/google/go-github/issues/4153)) - chore: Bump google.org/x/tools to v0.44.0 in /tools ([#​4168](https://redirect.github.com/google/go-github/issues/4168)) - docs: Fix broken blog post link ([#​4160](https://redirect.github.com/google/go-github/issues/4160)) - build(deps): Bump github.com/sigstore/timestamp-authority/v2 from 2.0.3 to 2.0.6 in /example ([#​4156](https://redirect.github.com/google/go-github/issues/4156)) - chore: Update openapi\_operations.yaml ([#​4157](https://redirect.github.com/google/go-github/issues/4157)) - feat: Remove Google App Engine standard support ([#​4152](https://redirect.github.com/google/go-github/issues/4152)) - feat: Add `DownloadCopilotMetrics` helper method ([#​4149](https://redirect.github.com/google/go-github/issues/4149)) - docs: Add `apiVersion` to GitHub API link ([#​4147](https://redirect.github.com/google/go-github/issues/4147)) - chore: Simplify `redundantptr` custom linter ([#​4148](https://redirect.github.com/google/go-github/issues/4148)) - docs: Deprecate old Copilot metrics endpoints closed on April 2, 2026 ([#​4137](https://redirect.github.com/google/go-github/issues/4137)) - refactor: Remove redundant `github.Ptr` calls ([#​4145](https://redirect.github.com/google/go-github/issues/4145)) - fix: Add missing `User` fields ([#​4146](https://redirect.github.com/google/go-github/issues/4146)) - fix: Preserve `Marketplace.Stubbed` during client copy ([#​4144](https://redirect.github.com/google/go-github/issues/4144)) - refactor: Simplify array copying ([#​4143](https://redirect.github.com/google/go-github/issues/4143)) - build(deps): Bump golang.org/x/crypto from 0.49.0 to 0.50.0 in /example ([#​4141](https://redirect.github.com/google/go-github/issues/4141)) - build(deps): Bump github.com/getkin/kin-openapi from 0.134.0 to 0.135.0 in /tools ([#​4142](https://redirect.github.com/google/go-github/issues/4142)) - build(deps): Bump golang.org/x/term from 0.41.0 to 0.42.0 in /example ([#​4140](https://redirect.github.com/google/go-github/issues/4140)) - build(deps): Bump golang.org/x/net from 0.52.0 to 0.53.0 in /scrape ([#​4139](https://redirect.github.com/google/go-github/issues/4139)) - build(deps): Bump go.opentelemetry.io/otel to v1.43.0 ([#​4135](https://redirect.github.com/google/go-github/issues/4135)) - fix: Expand `sanitizeURL` secrets redactions ([#​4126](https://redirect.github.com/google/go-github/issues/4126)) - build(deps): Bump github.com/alecthomas/kong from 1.14.0 to 1.15.0 in /tools ([#​4132](https://redirect.github.com/google/go-github/issues/4132)) - build(deps): Bump actions/setup-go from 6.3.0 to 6.4.0 in the actions group ([#​4131](https://redirect.github.com/google/go-github/issues/4131)) - feat: Add support for custom names and methods that return structs with multiple `[]*T` fields in `gen-iterators.go` ([#​4128](https://redirect.github.com/google/go-github/issues/4128)) - fix: Limit webhook payload size in `ValidatePayloadFromBody` ([#​4125](https://redirect.github.com/google/go-github/issues/4125)) - build(deps): Bump codecov/codecov-action from 5.5.3 to 6.0.0 ([#​4123](https://redirect.github.com/google/go-github/issues/4123)) - fix: Synchronize `requestCount` in rate limit tests ([#​4124](https://redirect.github.com/google/go-github/issues/4124)) - chore: Simplify `generate.sh` by removing `git worktree` and using generator-based check ([#​4120](https://redirect.github.com/google/go-github/issues/4120)) - docs: Improve comments in /examples ([#​4122](https://redirect.github.com/google/go-github/issues/4122)) - chore: Use `golangci-lint-action`; remove `newreposecretwithlibsodium` ([#​4119](https://redirect.github.com/google/go-github/issues/4119)) - feat: Add custom image endpoints for GitHub-hosted runners ([#​4101](https://redirect.github.com/google/go-github/issues/4101)) - chore: Cache custom golangci-lint binaries in GHA workflow ([#​4116](https://redirect.github.com/google/go-github/issues/4116)) - build(deps): Bump github.com/ProtonMail/go-crypto from 1.4.0 to 1.4.1 in /example ([#​4115](https://redirect.github.com/google/go-github/issues/4115)) - build(deps): Bump golang.org/x/tools from 0.29.0 to 0.43.0 in /tools/extraneous-new ([#​4114](https://redirect.github.com/google/go-github/issues/4114)) - build(deps): Bump codecov/codecov-action from 5.5.2 to 5.5.3 ([#​4112](https://redirect.github.com/google/go-github/issues/4112)) - build(deps): Bump github.com/golangci/plugin-module-register from 0.1.1 to 0.1.2 in /tools/extraneous-new ([#​4113](https://redirect.github.com/google/go-github/issues/4113)) - build(deps): Bump github.com/getkin/kin-openapi from 0.133.0 to 0.134.0 in /tools ([#​4111](https://redirect.github.com/google/go-github/issues/4111)) - build(deps): Bump github.com/PuerkitoBio/goquery from 1.11.0 to 1.12.0 in /scrape ([#​4110](https://redirect.github.com/google/go-github/issues/4110)) - chore: Upgrade deps for linters using dependabot ([#​4107](https://redirect.github.com/google/go-github/issues/4107)) - chore: Use `structfield.Settings` in `check-structfield-settings` ([#​4108](https://redirect.github.com/google/go-github/issues/4108)) - build(deps): Bump google.golang.org/grpc from 1.78.0 to 1.79.3 in /example ([#​4109](https://redirect.github.com/google/go-github/issues/4109)) - chore: Remove unnecessary use of `new` and `&SomeStruct{}` and add new `extraneousnew` custom linter ([#​4106](https://redirect.github.com/google/go-github/issues/4106)) - feat: Add `NetworkConfigurationID` and `HostedRunnersURL` to enterprise runner group types ([#​4099](https://redirect.github.com/google/go-github/issues/4099)) - feat: Generate accessors for all fields ([#​4105](https://redirect.github.com/google/go-github/issues/4105)) - feat: Add `ListRunnerGroupHostedRunners` for org runner groups ([#​4100](https://redirect.github.com/google/go-github/issues/4100)) - chore: Enable `default: none` linters; remove duplicated ([#​4097](https://redirect.github.com/google/go-github/issues/4097)) - fix: Use `Cursor` pagination for `*.ListHookDeliveriesIter` ([#​4096](https://redirect.github.com/google/go-github/issues/4096)) - chore: Remove duplicated formatters ([#​4094](https://redirect.github.com/google/go-github/issues/4094)) - chore: Fix typos in comments and tests ([#​4093](https://redirect.github.com/google/go-github/issues/4093)) - chore: Fix typo in CONTRIBUTING.md ([#​4092](https://redirect.github.com/google/go-github/issues/4092)) - chore: Update openapi\_operations.yaml ([#​4091](https://redirect.github.com/google/go-github/issues/4091)) - build(deps): Bump github.com/bradleyfalzon/ghinstallation/v2 from 2.17.0 to 2.18.0 in /example ([#​4084](https://redirect.github.com/google/go-github/issues/4084)) - chore: Bump go.opentelemetry.io/otel to v1.42.0 ([#​4090](https://redirect.github.com/google/go-github/issues/4090)) - build(deps): Bump golang.org/x/crypto from 0.48.0 to 0.49.0 in /example ([#​4081](https://redirect.github.com/google/go-github/issues/4081)) - build(deps): Bump golang.org/x/sync from 0.19.0 to 0.20.0 in /tools ([#​4078](https://redirect.github.com/google/go-github/issues/4078)) - build(deps): Bump golang.org/x/net from 0.51.0 to 0.52.0 in /scrape ([#​4079](https://redirect.github.com/google/go-github/issues/4079)) - test: Add fuzz test for `ParseWebHook` ([#​4076](https://redirect.github.com/google/go-github/issues/4076)) - feat: Add enterprise budgets API ([#​4069](https://redirect.github.com/google/go-github/issues/4069)) - feat: Add list organization fine-grained permissions ([#​4072](https://redirect.github.com/google/go-github/issues/4072)) - feat: Make `script/lint.sh` output simpler to read ([#​4073](https://redirect.github.com/google/go-github/issues/4073)) - chore: Speed up linting ([#​4071](https://redirect.github.com/google/go-github/issues/4071)) - build(deps): Bump go.opentelemetry.io/otel/sdk from 1.40.0 to 1.41.0 in /otel ([#​4065](https://redirect.github.com/google/go-github/issues/4065)) - build(deps): Bump go.opentelemetry.io/otel from 1.40.0 to 1.41.0 in /otel ([#​4068](https://redirect.github.com/google/go-github/issues/4068)) - build(deps): Bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace from 1.40.0 to 1.41.0 in /example ([#​4062](https://redirect.github.com/google/go-github/issues/4062)) - build(deps): Bump go.opentelemetry.io/otel/sdk from 1.40.0 to 1.41.0 in /example ([#​4064](https://redirect.github.com/google/go-github/issues/4064)) - build(deps): Bump github.com/ProtonMail/go-crypto from 1.3.0 to 1.4.0 in /example ([#​4063](https://redirect.github.com/google/go-github/issues/4063)) - feat: Add `client_id` field to `App` ([#​4060](https://redirect.github.com/google/go-github/issues/4060)) - test: Simplify `CopilotService` tests ([#​4058](https://redirect.github.com/google/go-github/issues/4058)) - test: Fix flaky `TestDo_rateLimit_abuseRateLimitError_xRateLimitReset` ([#​4057](https://redirect.github.com/google/go-github/issues/4057)) - feat: Add support for enterprise audit log streaming API ([#​4035](https://redirect.github.com/google/go-github/issues/4035)) - feat: Add repository-level immutable releases settings ([#​4039](https://redirect.github.com/google/go-github/issues/4039)) - chore: Add `SAS` as a common initialism to `structfield` ([#​4054](https://redirect.github.com/google/go-github/issues/4054)) - fix: Fix data race on Windows ([#​4051](https://redirect.github.com/google/go-github/issues/4051)) - docs: Fix grammar in `README.md` ([#​4053](https://redirect.github.com/google/go-github/issues/4053)) - chore: Simplify form value assertions in tests ([#​4048](https://redirect.github.com/google/go-github/issues/4048)) - chore: Bump go-github from v83 to v84 in /scrape ([#​4050](https://redirect.github.com/google/go-github/issues/4050)) ### [`v84.0.0`](https://redirect.github.com/google/go-github/releases/tag/v84.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v83.0.0...v84.0.0) This release contains the following breaking API changes: - feat!: Support workflow dispatch run details in response ([#​4028](https://redirect.github.com/google/go-github/issues/4028)) BREAKING CHANGE: `CreateWorkflowDispatchEventByID` and `CreateWorkflowDispatchEventByFileName` now return `*WorkflowDispatchRunDetails`. - fix!: Fix `opts` for methods listing issues and sub-issues ([#​4016](https://redirect.github.com/google/go-github/issues/4016)) BREAKING CHANGE: Split `IssuesService.List` into `IssuesService.ListAllIssues` and `IssuesService.ListUserIssues`. `IssuesService.ListByOrg` now accepts `IssueListByOrgOptions`. `SubIssueService.ListByIssue` now accepts `ListOptions`. ...and the following additional changes: - chore: Bump version of go-github to v84.0.0 ([#​4049](https://redirect.github.com/google/go-github/issues/4049)) - chore: Spell `white space` instead of `whitespace` ([#​4047](https://redirect.github.com/google/go-github/issues/4047)) - build(deps): Bump the go\_modules group in /example ([#​4040](https://redirect.github.com/google/go-github/issues/4040)) - chore: Improve `testJSONMarshal` ([#​4042](https://redirect.github.com/google/go-github/issues/4042)) - Add 'munlicode' to REVIEWERS list ([#​4046](https://redirect.github.com/google/go-github/issues/4046)) - build(deps): Bump golang.org/x/net from 0.50.0 to 0.51.0 in /scrape ([#​4045](https://redirect.github.com/google/go-github/issues/4045)) - build(deps): Bump actions/setup-go from 6.2.0 to 6.3.0 in the actions group ([#​4044](https://redirect.github.com/google/go-github/issues/4044)) - chore: Fix `TestNewFormRequest` ([#​4043](https://redirect.github.com/google/go-github/issues/4043)) - feat: Add support for team `type` field ([#​4037](https://redirect.github.com/google/go-github/issues/4037)) - chore: Update openapi\_operations.yaml ([#​4041](https://redirect.github.com/google/go-github/issues/4041)) - feat: Add support for repository fine-grained permissions ([#​4032](https://redirect.github.com/google/go-github/issues/4032)) - docs: Fix documentation links ([#​4036](https://redirect.github.com/google/go-github/issues/4036)) - feat: Add fields `Codespaces`, `Copilot` and `ActionsInbound` to `APIMeta` ([#​3975](https://redirect.github.com/google/go-github/issues/3975)) - chore: Use `go:fix inline` for deprecated ptr funcs ([#​4034](https://redirect.github.com/google/go-github/issues/4034)) - feat: Add `ListFineGrainedPersonalAccessTokenRequests` for org ([#​4022](https://redirect.github.com/google/go-github/issues/4022)) - feat: Ensure compatibility with encoding/json/v2 experiment ([#​4029](https://redirect.github.com/google/go-github/issues/4029)) - chore: Update `golangci-lint` and enable some revive rules ([#​4025](https://redirect.github.com/google/go-github/issues/4025)) - refactor: Use sorting functions from `slices` instead of `sort` ([#​4020](https://redirect.github.com/google/go-github/issues/4020)) - build(deps): Bump github.com/theupdateframework/go-tuf/v2 to v2.4.1 ([#​4018](https://redirect.github.com/google/go-github/issues/4018)) - chore: Update workflow and tools to use Go 1.26 and 1.25 ([#​3995](https://redirect.github.com/google/go-github/issues/3995)) - chore: Bump go-github from v82 to v83 in /scrape ([#​4017](https://redirect.github.com/google/go-github/issues/4017)) ### [`v83.0.0`](https://redirect.github.com/google/go-github/releases/tag/v83.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v82.0.0...v83.0.0) I don't recall ever having this many breaking API changes in a single release, and the last release was only 3 weeks ago! A special heart-felt thanks goes to [@​merchantmoh-debug](https://redirect.github.com/merchantmoh-debug), [@​Not-Dhananjay-Mishra](https://redirect.github.com/Not-Dhananjay-Mishra), and [@​alexandear](https://redirect.github.com/alexandear) for the addition of a long-requested feature to this repo: - native auto-generated iterators for all `List*` methods that support pagination (change your call from `List*` to `List*Iter` and make sure to use a rate-limiting transport or you will quickly exhaust your quotas!) A second set of heart-felt thanks go to [@​stevehipwell](https://redirect.github.com/stevehipwell) for setting up our REVIEWERS file and to our amazing volunteer reviewers: - [@​stevehipwell](https://redirect.github.com/stevehipwell) - [@​alexandear](https://redirect.github.com/alexandear) - [@​zyfy29](https://redirect.github.com/zyfy29) - [@​Not-Dhananjay-Mishra](https://redirect.github.com/Not-Dhananjay-Mishra) who have reduced our code-review wait times from days (*sometimes weeks*) down to literally ***hours*** and thereby enable rapid responses to bug fixes and attempts to stay up-to-date with the ever-evolving GitHub v3 API. This release contains the following breaking API changes: - fix!: Divide `PackageGetAllVersions` into two separate methods `ListPackageVersions` and `ListUserPackageVersions` ([#​4014](https://redirect.github.com/google/go-github/issues/4014)) BREAKING CHANGE: `PackageGetAllVersions` is now divided into `ListPackageVersions` and `ListUserPackageVersions`. - fix!: Remove unsupported pagination from `ListAutolinks` ([#​4012](https://redirect.github.com/google/go-github/issues/4012)) BREAKING CHANGE: `opts *ListOptions` is removed from `RepositoriesService.ListAutoLinks`. - fix!: Remove `ListOptions` from `PullRequestsService.ListReviewers` ([#​4009](https://redirect.github.com/google/go-github/issues/4009)) BREAKING CHANGE: `PullRequestsService.ListReviewers` no longer has `opts *ListOptions`. - fix!: Change `PremiumRequestUsageItem` quantities to `float64` ([#​4002](https://redirect.github.com/google/go-github/issues/4002)) BREAKING CHANGE: `PremiumRequestUsageItem` numeric fields are now `float64`. - fix!: Add `ListOptions` to `ListDeploymentBranchPolicies` and `ListCustomDeploymentRuleIntegrations` ([#​3988](https://redirect.github.com/google/go-github/issues/3988)) BREAKING CHANGE: `RepositoriesService.ListDeploymentBranchPolicies` and `RepositoriesService.ListCustomDeploymentRuleIntegrations` now accept `ListOptions`. - fix!: Pass `url` struct tags by value instead of by reference ([#​3991](https://redirect.github.com/google/go-github/issues/3991)) BREAKING CHANGE: Many `*Options` structs now pass `omitempty` URL struct fields by value instead of by reference. - fix!: Fix pagination support for `IssuesService` list methods ([#​3984](https://redirect.github.com/google/go-github/issues/3984)) BREAKING CHANGE: `ListCursorOptions` is removed from `IssueListOptions`. - fix!: Add field `PerPage` to `OrganizationsListOptions` ([#​3986](https://redirect.github.com/google/go-github/issues/3986)) BREAKING CHANGE: `OrganizationsListOptions` now contains only `PerPage` instead of `ListOptions`. - fix!: Add `ListLicensesOptions` to `LicensesService.List` ([#​3981](https://redirect.github.com/google/go-github/issues/3981)) BREAKING CHANGE: `LicensesService.List` now accepts `ListLicensesOptions` for pagination. - fix!: Change `SCIMEnterpriseAttributeOperation.Value` from `*string` to `any` ([#​3971](https://redirect.github.com/google/go-github/issues/3971)) BREAKING CHANGE: `SCIMEnterpriseAttributeOperation.Value` is changed from `*string` to `any`. - feat!: Add `ListOptions` to `RepositoriesService.ListAllTopics` ([#​3978](https://redirect.github.com/google/go-github/issues/3978)) BREAKING CHANGE: `RepositoriesService.ListAllTopics` now accepts `ListOptions` for pagination. - fix!: Replace `UserListOptions.ListOptions` with `UserListOptions.PerPage` ([#​3977](https://redirect.github.com/google/go-github/issues/3977)) BREAKING CHANGE: Replaces `UserListOptions.ListOptions` with `UserListOptions.PerPage` which also removes `UsersService.ListAllIter`. - fix!: `CreateHostedRunnerRequest`, `UpdateHostedRunnerRequest` instead of `HostedRunnerRequest` ([#​3973](https://redirect.github.com/google/go-github/issues/3973)) BREAKING CHANGE: `ActionsService.CreateHostedRunner` and `EnterpriseService.CreateHostedRunner` now accept `CreateHostedRunnerRequest`; `ActionsService.UpdateHostedRunner` and `EnterpriseService.UpdateHostedRunner` now accept `UpdateHostedRunnerRequest`. - refactor!: Use `RepositoryPermissions` struct for `User.Permissions` ([#​3963](https://redirect.github.com/google/go-github/issues/3963)) BREAKING CHANGE: `User.Permissions` is now `*RepositoryPermissions` instead of `map[string]bool`. ...and the following additional changes: - Bump version of go-github to v83.0.0 ([#​4015](https://redirect.github.com/google/go-github/issues/4015)) - feat: Support pagination for methods that return structs ([#​4011](https://redirect.github.com/google/go-github/issues/4011)) - chore: Bump golangci-lint to v2.9.0 ([#​4013](https://redirect.github.com/google/go-github/issues/4013)) - docs: Update usage instructions ([#​4008](https://redirect.github.com/google/go-github/issues/4008)) - feat: Add iterators for methods with `After` ([#​4007](https://redirect.github.com/google/go-github/issues/4007)) - chore: Improve `addOptions` implementation ([#​3998](https://redirect.github.com/google/go-github/issues/3998)) - chore: Do not print any output when `check-structfield-settings` is OK ([#​4001](https://redirect.github.com/google/go-github/issues/4001)) - build(deps): Bump golang.org/x/net from 0.49.0 to 0.50.0 in /scrape ([#​4003](https://redirect.github.com/google/go-github/issues/4003)) - chore: Remove unnecessary `fmt.Print` in tests ([#​3999](https://redirect.github.com/google/go-github/issues/3999)) - build(deps): Bump github.com/alecthomas/kong from 1.13.0 to 1.14.0 in /tools ([#​4004](https://redirect.github.com/google/go-github/issues/4004)) - build(deps): Bump golang.org/x/crypto from 0.47.0 to 0.48.0 in /example ([#​4006](https://redirect.github.com/google/go-github/issues/4006)) - fix: Change cursor pagination to use `After` ([#​3994](https://redirect.github.com/google/go-github/issues/3994)) - fix: Add support for GitHub Enterprise cloud upload URLs ([#​3993](https://redirect.github.com/google/go-github/issues/3993)) - chore: Turn off commit with `gpgsign` in script/generate.sh ([#​3982](https://redirect.github.com/google/go-github/issues/3982)) - feat: Support `[]string` return type in `gen-iterators.go` ([#​3980](https://redirect.github.com/google/go-github/issues/3980)) - fix: Address `modernize.omitzero` issues ([#​3972](https://redirect.github.com/google/go-github/issues/3972)) - feat: Add organization artifact metadata APIs ([#​3944](https://redirect.github.com/google/go-github/issues/3944)) - chore: Address `otel` review feedback ([#​3969](https://redirect.github.com/google/go-github/issues/3969)) - feat(otel): Add native OpenTelemetry Transport module ([#​3938](https://redirect.github.com/google/go-github/issues/3938)) - feat: Add native Go 1.23 iterator support for cursor-based pagination ([#​3965](https://redirect.github.com/google/go-github/issues/3965)) - chore: Address `gen-iterators` review feedback ([#​3962](https://redirect.github.com/google/go-github/issues/3962)) - feat: Add native Go 1.23 Iterator support ([#​3916](https://redirect.github.com/google/go-github/issues/3916)) - docs: Fix typo in README.md ([#​3961](https://redirect.github.com/google/go-github/issues/3961)) - chore: Move all "DO NOT EDIT" messages to line 1 ([#​3960](https://redirect.github.com/google/go-github/issues/3960)) - chore: Enable `unparam` linter and cover unused `*Response` results ([#​3955](https://redirect.github.com/google/go-github/issues/3955)) - fix(tools): Change `gen-release-notes` to use `git` instead of scraping web ([#​3958](https://redirect.github.com/google/go-github/issues/3958)) - chore: Use `example.com` instead of random URLs in tests ([#​3948](https://redirect.github.com/google/go-github/issues/3948)) - feat: Add `organization_copilot_metrics` installation permission ([#​3957](https://redirect.github.com/google/go-github/issues/3957)) - chore(deps): Switch from `gopkg.in/yaml.v3` to `go.yaml.in/yaml/v3` in /tools ([#​3907](https://redirect.github.com/google/go-github/issues/3907)) - docs: Address PR titles in CONTRIBUTING.md ([#​3952](https://redirect.github.com/google/go-github/issues/3952)) - chore: Format code with `golangci-lint fmt` ([#​3949](https://redirect.github.com/google/go-github/issues/3949)) - fix: Handle HTTP 429 status code for rate limiting ([#​3951](https://redirect.github.com/google/go-github/issues/3951)) - chore: Adapt `lint.sh` to Windows Git Bash ([#​3950](https://redirect.github.com/google/go-github/issues/3950)) - Bump go-github from v81 to v82 in /scrape ([#​3946](https://redirect.github.com/google/go-github/issues/3946)) ### [`v82.0.0`](https://redirect.github.com/google/go-github/releases/tag/v82.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v81.0.0...v82.0.0) This release contains the following breaking API changes: - feat!: Improve support for custom property defaults ([#​3906](https://redirect.github.com/google/go-github/issues/3906)) BREAKING CHANGE: `CustomProperty.DefaultValue` is now type `any` and `.ValueType` is now type `PropertyValueType`. - fix!: Simplify `Git.ListMatchingRefs` by removing `ReferenceListOptions` ([#​3924](https://redirect.github.com/google/go-github/issues/3924)) BREAKING CHANGE: `Git.ListMatchingRefs` accepts `ref` instead of the `ReferenceListOptions`. - refactor!: Use a struct for `Repository.Permissions` instead of `map[string]bool` ([#​3936](https://redirect.github.com/google/go-github/issues/3936)) BREAKING CHANGE: `Repository.Permissions` is now a struct instead of `map[string]bool`. ...and the following additional changes: - Bump go-github from v80 to v81 in /scrape ([#​3900](https://redirect.github.com/google/go-github/issues/3900)) - build(deps): Bump github.com/google/go-querystring from 1.1.0 to 1.2.0 ([#​3901](https://redirect.github.com/google/go-github/issues/3901)) - docs: Correct variable name in rate limit error logging example ([#​3902](https://redirect.github.com/google/go-github/issues/3902)) - feat: Add `ConfigurationFilePath` field to `GenerateNotesOptions` ([#​3904](https://redirect.github.com/google/go-github/issues/3904)) - fix: Ignore unset `AllowedMergeMethods` field ([#​3905](https://redirect.github.com/google/go-github/issues/3905)) - docs: Clarify `nil` `http.Client` usage has no timeout ([#​3910](https://redirect.github.com/google/go-github/issues/3910)) - build(deps): Bump golang.org/x/net from 0.48.0 to 0.49.0 in /scrape ([#​3911](https://redirect.github.com/google/go-github/issues/3911)) - build(deps): Bump golang.org/x/term from 0.38.0 to 0.39.0 in /example ([#​3912](https://redirect.github.com/google/go-github/issues/3912)) - build(deps): Bump golang.org/x/crypto from 0.46.0 to 0.47.0 in /example ([#​3913](https://redirect.github.com/google/go-github/issues/3913)) - feat: Add `dependency_sbom` rate limit support ([#​3908](https://redirect.github.com/google/go-github/issues/3908)) - feat: Add support for delegated bypass in code security org config ([#​3920](https://redirect.github.com/google/go-github/issues/3920)) - fix: `DeleteSocialAccounts` and `AddSocialAccounts` of `UsersService` ([#​3922](https://redirect.github.com/google/go-github/issues/3922)) - chore: Add Not-Dhananjay-Mishra to REVIEWERS ([#​3923](https://redirect.github.com/google/go-github/issues/3923)) - build(deps): Bump the actions group with 2 updates ([#​3927](https://redirect.github.com/google/go-github/issues/3927)) - chore: Refactor test workflow ([#​3929](https://redirect.github.com/google/go-github/issues/3929)) - fix: Use correct type for custom property default value ([#​3928](https://redirect.github.com/google/go-github/issues/3928)) - feat: Support creating repo with custom properties ([#​3933](https://redirect.github.com/google/go-github/issues/3933)) - chore: Enable `govet` linter with all checks ([#​3935](https://redirect.github.com/google/go-github/issues/3935)) - perf: Optimize `Stringify` allocations (\~3x faster) ([#​3914](https://redirect.github.com/google/go-github/issues/3914)) - docs: Update CONTRIBUTING.md to prevent AI slop PRs ([#​3940](https://redirect.github.com/google/go-github/issues/3940)) - chore: Update openapi\_operations.yaml ([#​3942](https://redirect.github.com/google/go-github/issues/3942)) - build(deps): Bump actions/checkout from 6.0.1 to 6.0.2 in the actions group ([#​3943](https://redirect.github.com/google/go-github/issues/3943)) - Bump version of go-github to v82.0.0 ([#​3945](https://redirect.github.com/google/go-github/issues/3945)) ### [`v81.0.0`](https://redirect.github.com/google/go-github/releases/tag/v81.0.0) [Compare Source](https://redirect.github.com/google/go-github/compare/v80.0.0...v81.0.0) This release contains the following breaking API changes: - fix!: Change Org usage report Quantity to float64 ([#​3862](https://redirect.github.com/google/go-github/issues/3862)) BREAKING CHANGE: `UsageItem.Quantity` is now type `float64`. - chore!: Remove `PullRequestRuleParameters.AutomaticCopilotCodeReviewEnabled` field ([#​3866](https://redirect.github.com/google/go-github/issues/3866)) BREAKING CHANGE: `PullRequestRuleParameters.AutomaticCopilotCodeReviewEnabled` is now removed. - feat!: Implement Enterprise SCIM - Provision Groups & Users ([#​3852](https://re > ✂ **Note** > > PR body was truncated to here.
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). --------- Signed-off-by: Benjamin Dematteo Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> Co-authored-by: Benjamin Dematteo --- cli/cmd/bootstrap_gcp.go | 5 ++++- go.mod | 2 +- go.sum | 2 ++ internal/bootstrap/gcp/gce_test.go | 2 +- internal/github/github.go | 2 +- internal/github/github_client.go | 13 ++++++++++--- internal/github/github_test.go | 2 +- internal/github/mocks.go | 2 +- 8 files changed, 21 insertions(+), 9 deletions(-) diff --git a/cli/cmd/bootstrap_gcp.go b/cli/cmd/bootstrap_gcp.go index ab657f855..5e36f993b 100644 --- a/cli/cmd/bootstrap_gcp.go +++ b/cli/cmd/bootstrap_gcp.go @@ -157,7 +157,10 @@ func (c *BootstrapGcpCmd) BootstrapGcp() error { gcpClient := gcp.NewGCPClient(ctx, stlog, os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")) fw := intutil.NewFilesystemWriter() portalClient := portal.NewPortalClient() - githubClient := github.NewGitHubClient(ctx, c.CodesphereEnv.GitHubPAT) + githubClient, err := github.NewGitHubClient(ctx, c.CodesphereEnv.GitHubPAT) + if err != nil { + return fmt.Errorf("failed to create github client: %w", err) + } bs, err := gcp.NewGCPBootstrapper( ctx, diff --git a/go.mod b/go.mod index 830083c01..3118f60c6 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/google/go-containerregistry v0.21.9 - github.com/google/go-github/v74 v74.0.0 + github.com/google/go-github/v90 v90.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible diff --git a/go.sum b/go.sum index dcd84f70d..59007f7c2 100644 --- a/go.sum +++ b/go.sum @@ -3813,6 +3813,8 @@ github.com/google/go-github/v88 v88.0.0 h1:dZA9IKkPK1eXZj4ypngnpRj5FwdpTv4whix2P github.com/google/go-github/v88 v88.0.0/go.mod h1:rufTDgn2N45wjhukLTyxmvc9nilSp3mr3Rgtt6b1MPw= github.com/google/go-github/v89 v89.0.0 h1:35bEK5XoEcF3PZrlVbl9XN63f5BcJRA/UGkxeC9xPg0= github.com/google/go-github/v89 v89.0.0/go.mod h1:QLcbU0ipeAqQuR5KSg8c2lql4Qk1EwJ2dWz/0rP4Nho= +github.com/google/go-github/v90 v90.0.0 h1:EnX9HvTfqvuJbUSWu1/jLrYH6JJLMz0w0qfQVbTxPzE= +github.com/google/go-github/v90 v90.0.0/go.mod h1:pLzt1FZURZyoTHT5/Z1UQY3b9fYyrbXH6aj7X+qgID4= github.com/google/go-licenses/v2 v2.0.1 h1:ti+9bi5o7DKbeeg5eBb/uZTgsaPNoJaLCh93cRcXsW8= github.com/google/go-licenses/v2 v2.0.1/go.mod h1:efibo0EDNGkau6AIMOViGW+rTNPudhxX9rCxtfw5zKE= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= diff --git a/internal/bootstrap/gcp/gce_test.go b/internal/bootstrap/gcp/gce_test.go index 033a11aab..5c580cafc 100644 --- a/internal/bootstrap/gcp/gce_test.go +++ b/internal/bootstrap/gcp/gce_test.go @@ -12,7 +12,7 @@ import ( "github.com/codesphere-cloud/oms/internal/bootstrap/gcp" "github.com/codesphere-cloud/oms/internal/github" "github.com/codesphere-cloud/oms/internal/util" - gh "github.com/google/go-github/v74/github" + gh "github.com/google/go-github/v90/github" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/stretchr/testify/mock" diff --git a/internal/github/github.go b/internal/github/github.go index be6cc4b08..5bfa3137a 100644 --- a/internal/github/github.go +++ b/internal/github/github.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v90/github" ) // GetSSHKeysFromGitHubTeam fetches the public SSH keys of all members of the specified GitHub team and formats them for inclusion in instance metadata. diff --git a/internal/github/github_client.go b/internal/github/github_client.go index 0e25e8a8a..7818f4ff1 100644 --- a/internal/github/github_client.go +++ b/internal/github/github_client.go @@ -5,8 +5,9 @@ package github import ( "context" + "fmt" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v90/github" "golang.org/x/oauth2" ) @@ -23,10 +24,16 @@ type RealGitHubClient struct { } // NewGitHubClient creates a new RealGitHubClient with the provided OAuth token. -func NewGitHubClient(ctx context.Context, token string) *RealGitHubClient { +func NewGitHubClient(ctx context.Context, token string) (*RealGitHubClient, error) { ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) tc := oauth2.NewClient(ctx, ts) - return &RealGitHubClient{client: github.NewClient(tc)} + + client, err := github.NewClient(github.WithHTTPClient(tc)) + if err != nil { + return nil, fmt.Errorf("creating github client: %w", err) + } + + return &RealGitHubClient{client: client}, nil } // ListTeamMembersBySlug lists the members of a GitHub team identified by its slug. diff --git a/internal/github/github_test.go b/internal/github/github_test.go index f4357c848..14af1f116 100644 --- a/internal/github/github_test.go +++ b/internal/github/github_test.go @@ -11,7 +11,7 @@ import ( . "github.com/onsi/gomega" "github.com/stretchr/testify/mock" - gh "github.com/google/go-github/v74/github" + gh "github.com/google/go-github/v90/github" ) var _ = Describe("Github", func() { diff --git a/internal/github/mocks.go b/internal/github/mocks.go index 228efba51..ca364663d 100644 --- a/internal/github/mocks.go +++ b/internal/github/mocks.go @@ -6,7 +6,7 @@ package github import ( "context" - "github.com/google/go-github/v74/github" + "github.com/google/go-github/v90/github" mock "github.com/stretchr/testify/mock" ) From 5a29516798d8017bbd42acc756fe4176f6ec4ebb Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:36:21 +0200 Subject: [PATCH 055/132] fix(installer): move MetalLB config under Cluster struct (#636) This pull request refactors how MetalLB configuration is handled throughout the codebase, moving the `MetalLB` configuration from the root level of `RootConfig` into the nested `ClusterConfig` struct. Additionally, it introduces new Kubernetes network configuration flags and ensures proper defaulting for certificate issuer type. * Moved the `MetalLB` configuration from the root of `RootConfig` to be under `ClusterConfig`, updating all code references accordingly to use `config.Cluster.MetalLB` instead of `config.MetalLB` * Added new CLI flags `--k8s-pod-cidr` and `--k8s-service-cidr` to allow specifying Pod and Service CIDRs when not using Codesphere-managed Kubernetes [Clickup](https://app.clickup.com/t/24560134/869e6mm83) and [Clickup](https://app.clickup.com/t/24560134/869e72qjq) --------- Signed-off-by: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> --- .github/actions/slack-notify/action.yml | 31 ++++ .github/workflows/cli-build_test.yml | 84 +++++---- NOTICE | 12 +- cli/cmd/init_install_config.go | 18 +- .../init_install_config_interactive_test.go | 165 ++++++++++++++---- docs/oms_init_install-config.md | 2 + internal/codesphere/mocks.go | 8 +- .../installer/config_generator_collector.go | 23 ++- .../config_generator_collector_test.go | 36 ++++ .../config_manager_generation_test.go | 77 ++++++++ internal/installer/config_manager_profile.go | 90 +++++----- .../installer/config_manager_profile_test.go | 31 +++- internal/installer/files/config_yaml.go | 3 +- internal/tmpl/NOTICE | 12 +- internal/util/mocks.go | 4 +- 15 files changed, 447 insertions(+), 149 deletions(-) create mode 100644 .github/actions/slack-notify/action.yml create mode 100644 internal/installer/config_manager_generation_test.go diff --git a/.github/actions/slack-notify/action.yml b/.github/actions/slack-notify/action.yml new file mode 100644 index 000000000..59d9db9b0 --- /dev/null +++ b/.github/actions/slack-notify/action.yml @@ -0,0 +1,31 @@ +# Copyright (c) Codesphere Inc. +# SPDX-License-Identifier: Apache-2.0 + +# Posts a failure notification to the #team-oms-sdk Slack channel. +name: Slack Notification on Failure +description: Notify #team-oms-sdk on job failure + +inputs: + job-name: + description: Display name of the failing job (e.g. "Build", "Test", "Install-Config") + required: true + webhook: + description: Slack webhook URL for the notification + required: true + +runs: + using: composite + steps: + - name: Post failure to Slack + shell: bash + env: + SLACK_WEBHOOK: ${{ inputs.webhook }} + run: | + curl -X POST \ + -H 'Content-type: application/json' \ + --data "{ + \"channel\": \"#team-oms-sdk\", + \"icon_emoji\": \":siren:\", + \"text\": \"🚨 ${{ inputs.job-name }} Job Failure 🚨\nRepository: ${{ github.repository }}\nBranch/Ref: \`${{ github.ref }}\`\nRun url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\" + }" \ + "${SLACK_WEBHOOK}" diff --git a/.github/workflows/cli-build_test.yml b/.github/workflows/cli-build_test.yml index f11fabd12..05d7a7176 100644 --- a/.github/workflows/cli-build_test.yml +++ b/.github/workflows/cli-build_test.yml @@ -14,8 +14,19 @@ on: jobs: - build: + build-test: + name: ${{ matrix.label }} runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - task: build + label: build + - task: test + label: test + - task: install-config + label: install-config steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 @@ -24,42 +35,51 @@ jobs: with: go-version-file: 'go.mod' - - name: Build + - name: Build CLI + if: ${{ matrix.task == 'build' || matrix.task == 'install-config' }} run: make build-cli - - name: Slack Notification on Failure - if: ${{ failure() && github.ref == 'refs/heads/main' }} - run: | - curl -X POST \ - -H 'Content-type: application/json' \ - --data '{ - "channel": "#team-oms-sdk", - "icon_emoji": ":siren:", - "text": "🚨 Build Job Failure 🚨\nRepository: ${{ github.repository }}\nBranch/Ref: `${{ github.ref }}`\nRun url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" - }' \ - ${{ secrets.PACKAGE_JOB_SLACK_WEBHOOK }} + - name: Test + if: ${{ matrix.task == 'test' }} + run: make test - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - name: Setup SOPS and age for vault encryption + if: ${{ matrix.task == 'install-config' }} + run: | + sudo apt-get update + sudo apt-get install -y age + # sops is not packaged in Ubuntu's repos, so fetch the pinned release binary. + curl -fsSL -o /tmp/sops \ + https://github.com/getsops/sops/releases/download/v3.13.3/sops-v3.13.3.linux.amd64 + sudo install -m 0755 /tmp/sops /usr/local/bin/sops + age-keygen -o age_key.txt + echo "SOPS_AGE_KEY_FILE=${GITHUB_WORKSPACE}/age_key.txt" >> "$GITHUB_ENV" - - name: Set up Go - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7 - with: - go-version-file: 'go.mod' + - name: Generate and validate install configs + if: ${{ matrix.task == 'install-config' }} + run: | + set -euo pipefail + for profile in dev minimal production; do + echo "==> Generating install config for profile: ${profile}" + ./oms init install-config \ + --profile "${profile}" \ + --interactive=false \ + -c "config-${profile}.yaml" \ + --vault "prod-${profile}.vault.yaml" - - name: Test - run: make test + echo "==> Validating generated install config for profile: ${profile}" + # Validate the config only. The generated vault is SOPS-encrypted and + # its contents are covered by the round-trip unit tests, so this step + # stays focused on the config (--vault "" skips vault loading). + ./oms init install-config \ + --validate \ + -c "config-${profile}.yaml" \ + --vault "" + done - name: Slack Notification on Failure if: ${{ failure() && github.ref == 'refs/heads/main' }} - run: | - curl -X POST \ - -H 'Content-type: application/json' \ - --data '{ - "channel": "#team-oms-sdk", - "icon_emoji": ":siren:", - "text": "🚨 Build Job Failure 🚨\nRepository: ${{ github.repository }}\nBranch/Ref: `${{ github.ref }}`\nRun url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" - }' \ - ${{ secrets.PACKAGE_JOB_SLACK_WEBHOOK }} + uses: ./.github/actions/slack-notify + with: + job-name: ${{ matrix.label }} + webhook: ${{ secrets.PACKAGE_JOB_SLACK_WEBHOOK }} diff --git a/NOTICE b/NOTICE index 04f4fec0c..3c4a30e54 100644 --- a/NOTICE +++ b/NOTICE @@ -681,12 +681,6 @@ Version: v69.2.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v69.2.0/LICENSE ----------- -Module: github.com/google/go-github/v74/github -Version: v74.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v74.0.0/LICENSE - ---------- Module: github.com/google/go-github/v86/github Version: v86.0.0 @@ -699,6 +693,12 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE +---------- +Module: github.com/google/go-github/v90/github +Version: v90.0.0 +License: BSD-3-Clause +License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE + ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 diff --git a/cli/cmd/init_install_config.go b/cli/cmd/init_install_config.go index ab23e8a0b..b6fe9cbec 100644 --- a/cli/cmd/init_install_config.go +++ b/cli/cmd/init_install_config.go @@ -184,6 +184,8 @@ func AddInitInstallConfigCmd(init *cobra.Command, opts *util.GlobalOptions) { // K8s c.cmd.Flags().BoolVar(&c.Opts.KubernetesManagedByCodesphere, "k8s-managed", true, "Use Codesphere-managed Kubernetes") c.cmd.Flags().StringSliceVar(&c.Opts.KubernetesControlPlanes, "k8s-control-plane", []string{}, "K8s control plane IPs (comma-separated)") + c.cmd.Flags().StringVar(&c.Opts.KubernetesPodCIDR, "k8s-pod-cidr", "", "Pod CIDR (required when --k8s-managed=false)") + c.cmd.Flags().StringVar(&c.Opts.KubernetesServiceCIDR, "k8s-service-cidr", "", "Service CIDR (required when --k8s-managed=false)") // Ceph c.cmd.Flags().StringVar(&c.Opts.CephCsiKubeletDir, "ceph-csi-kubelet-dir", "", "Directory of kubelet for ceph csi. Required for some cloud providers") @@ -268,6 +270,8 @@ func (c *InitInstallConfigCmd) InitInstallConfig(icg installer.InstallConfigMana return fmt.Errorf("failed to write config file: %w", err) } + // The freshly generated vault is SOPS-encrypted automatically with the + // configured age key (--age-key or SOPS_AGE_KEY[_FILE]). if err := icg.WriteVault(c.Opts.VaultFile, c.Opts.WithComments); err != nil { return fmt.Errorf("failed to write vault file: %w", err) } @@ -304,6 +308,7 @@ func (c *InitInstallConfigCmd) printSuccessMessage(warningCount int) { log.Println(strings.Repeat("=", 70)) log.Println("\nIMPORTANT: Keys and certificates have been generated and embedded in the vault file.") + log.Println(" The vault file has been encrypted with SOPS automatically.") log.Println(" Keep the vault file and its decryption key secure.") log.Println() } @@ -418,6 +423,9 @@ func (c *InitInstallConfigCmd) updateConfigFromOpts(config *files.RootConfig, va } // Kubernetes settings + if c.cmd != nil && c.cmd.Flags().Changed("k8s-managed") { + config.Kubernetes.ManagedByCodesphere = c.Opts.KubernetesManagedByCodesphere + } if c.Opts.KubernetesAPIServerHost != "" { config.Kubernetes.APIServerHost = c.Opts.KubernetesAPIServerHost } @@ -464,18 +472,18 @@ func (c *InitInstallConfigCmd) updateConfigFromOpts(config *files.RootConfig, va // MetalLB settings if c.Opts.MetalLBEnabled { - if config.MetalLB == nil { - config.MetalLB = &files.MetalLBConfig{ + if config.Cluster.MetalLB == nil { + config.Cluster.MetalLB = &files.MetalLBConfig{ Enabled: c.Opts.MetalLBEnabled, Pools: []files.MetalLBPoolDef{}, } } else { - config.MetalLB.Enabled = c.Opts.MetalLBEnabled - config.MetalLB.Pools = []files.MetalLBPoolDef{} + config.Cluster.MetalLB.Enabled = c.Opts.MetalLBEnabled + config.Cluster.MetalLB.Pools = []files.MetalLBPoolDef{} } for _, pool := range c.Opts.MetalLBPools { - config.MetalLB.Pools = append(config.MetalLB.Pools, files.MetalLBPoolDef(pool)) + config.Cluster.MetalLB.Pools = append(config.Cluster.MetalLB.Pools, files.MetalLBPoolDef(pool)) } } diff --git a/cli/cmd/init_install_config_interactive_test.go b/cli/cmd/init_install_config_interactive_test.go index a8b774619..0a90eca47 100644 --- a/cli/cmd/init_install_config_interactive_test.go +++ b/cli/cmd/init_install_config_interactive_test.go @@ -5,12 +5,15 @@ package cmd import ( "os" + "path/filepath" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/spf13/cobra" "github.com/codesphere-cloud/oms/cli/cmd/util" "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/prompt" intutil "github.com/codesphere-cloud/oms/internal/util" . "github.com/codesphere-cloud/oms/internal/util/testing" @@ -86,23 +89,13 @@ var _ = Describe("Interactive profile usage", func() { }) It("should generate valid config files with profile", func() { - configFile, err := os.CreateTemp("", "config-*.yaml") - Expect(err).NotTo(HaveOccurred()) - defer func() { _ = os.Remove(configFile.Name()) }() - err = configFile.Close() - Expect(err).NotTo(HaveOccurred()) - - vaultFile, err := os.CreateTemp("", "vault-*.yaml") - Expect(err).NotTo(HaveOccurred()) - defer func() { _ = os.Remove(vaultFile.Name()) }() - err = vaultFile.Close() - Expect(err).NotTo(HaveOccurred()) + configPath, vaultPath := newTempConfigVaultPair() c := &InitInstallConfigCmd{ Opts: &InitInstallConfigOpts{ GlobalOptions: &util.GlobalOptions{}, - ConfigFile: configFile.Name(), - VaultFile: vaultFile.Name(), + ConfigFile: configPath, + VaultFile: vaultPath, Profile: "dev", Interactive: false, // Non-interactive to avoid stdin issues }, @@ -110,18 +103,18 @@ var _ = Describe("Interactive profile usage", func() { } icg := newPlainInstallConfigManager() - err = c.InitInstallConfig(icg) + err := c.InitInstallConfig(icg) Expect(err).NotTo(HaveOccurred()) // Verify files were created - _, err = os.Stat(configFile.Name()) + _, err = os.Stat(configPath) Expect(err).NotTo(HaveOccurred()) - _, err = os.Stat(vaultFile.Name()) + _, err = os.Stat(vaultPath) Expect(err).NotTo(HaveOccurred()) // Verify config content - err = icg.LoadInstallConfigFromFile(configFile.Name()) + err = icg.LoadInstallConfigFromFile(configPath) Expect(err).NotTo(HaveOccurred()) config := icg.GetInstallConfig() @@ -172,23 +165,13 @@ var _ = Describe("Interactive profile usage", func() { }) It("should still fail in non-interactive mode with validation errors", func() { - configFile, err := os.CreateTemp("", "config-*.yaml") - Expect(err).NotTo(HaveOccurred()) - defer func() { _ = os.Remove(configFile.Name()) }() - err = configFile.Close() - Expect(err).NotTo(HaveOccurred()) - - vaultFile, err := os.CreateTemp("", "vault-*.yaml") - Expect(err).NotTo(HaveOccurred()) - defer func() { _ = os.Remove(vaultFile.Name()) }() - err = vaultFile.Close() - Expect(err).NotTo(HaveOccurred()) + configPath, vaultPath := newTempConfigVaultPair() c := &InitInstallConfigCmd{ Opts: &InitInstallConfigOpts{ GlobalOptions: &util.GlobalOptions{}, - ConfigFile: configFile.Name(), - VaultFile: vaultFile.Name(), + ConfigFile: configPath, + VaultFile: vaultPath, Profile: "dev", Interactive: false, CodesphereOpenBaoUri: "not-a-valid-url", @@ -198,9 +181,129 @@ var _ = Describe("Interactive profile usage", func() { icg := newPlainInstallConfigManager() - err = c.InitInstallConfig(icg) + err := c.InitInstallConfig(icg) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("configuration validation failed")) }) }) }) + +var _ = Describe("Non-interactive install-config generation", func() { + DescribeTable("generates and validates the config for each profile", + func(profile string) { + configPath, vaultPath := newTempConfigVaultPair() + + c := &InitInstallConfigCmd{ + Opts: &InitInstallConfigOpts{ + GlobalOptions: &util.GlobalOptions{}, + ConfigFile: configPath, + VaultFile: vaultPath, + Profile: profile, + Interactive: false, + }, + FileWriter: intutil.NewFilesystemWriter(), + } + + icg := newPlainInstallConfigManager() + err := c.InitInstallConfig(icg) + Expect(err).NotTo(HaveOccurred()) + + // Both files must have been written. + _, err = os.Stat(configPath) + Expect(err).NotTo(HaveOccurred()) + _, err = os.Stat(vaultPath) + Expect(err).NotTo(HaveOccurred()) + + // The generated config must round-trip through the full load path and validate. + err = icg.LoadInstallConfigFromFile(configPath) + Expect(err).NotTo(HaveOccurred()) + Expect(icg.ValidateInstallConfig()).To(BeEmpty()) + + // The --validate CLI path must pass. The vault is skipped because the freshly + // generated vault is plaintext and LoadVaultFromFile requires SOPS encryption. + validateCmd := &InitInstallConfigCmd{ + Opts: &InitInstallConfigOpts{ + GlobalOptions: &util.GlobalOptions{}, + ConfigFile: configPath, + VaultFile: "", + ValidateOnly: true, + }, + FileWriter: intutil.NewFilesystemWriter(), + } + validateIcg := newPlainInstallConfigManager() + Expect(validateCmd.validateOnly(validateIcg)).To(Succeed()) + }, + Entry("dev profile", "dev"), + Entry("minimal profile", "minimal"), + Entry("production profile", "production"), + ) +}) + +// newTempConfigVaultPair returns paths to fresh config/vault files inside an +// auto-cleaned temp directory. +func newTempConfigVaultPair() (configPath, vaultPath string) { + dir := GinkgoT().TempDir() + return filepath.Join(dir, "config.yaml"), filepath.Join(dir, "prod.vault.yaml") +} + +var _ = Describe("Non-interactive Kubernetes CIDR flags", func() { + // buildCmd returns a command wired to a real cobra.Command registering the + // k8s flags (mirroring AddInitInstallConfigCmd), so Flags().Changed works. + buildCmd := func(opts *InitInstallConfigOpts) *InitInstallConfigCmd { + cmd := &cobra.Command{Use: "install-config"} + cmd.Flags().BoolVar(&opts.KubernetesManagedByCodesphere, "k8s-managed", true, "Use Codesphere-managed Kubernetes") + cmd.Flags().StringVar(&opts.KubernetesPodCIDR, "k8s-pod-cidr", "", "Pod CIDR (required when --k8s-managed=false)") + cmd.Flags().StringVar(&opts.KubernetesServiceCIDR, "k8s-service-cidr", "", "Service CIDR (required when --k8s-managed=false)") + + return &InitInstallConfigCmd{cmd: cmd, Opts: opts} + } + + It("applies --k8s-managed=false with both CIDRs", func() { + c := buildCmd(&InitInstallConfigOpts{GlobalOptions: &util.GlobalOptions{}}) + Expect(c.cmd.Flags().Set("k8s-managed", "false")).To(Succeed()) + Expect(c.cmd.Flags().Set("k8s-pod-cidr", "10.200.0.0/16")).To(Succeed()) + Expect(c.cmd.Flags().Set("k8s-service-cidr", "10.100.0.0/16")).To(Succeed()) + + root := files.NewRootConfig() + config := &root + c.updateConfigFromOpts(config, &files.InstallVault{}) + + Expect(config.Kubernetes.ManagedByCodesphere).To(BeFalse()) + Expect(config.Kubernetes.PodCIDR).To(Equal("10.200.0.0/16")) + Expect(config.Kubernetes.ServiceCIDR).To(Equal("10.100.0.0/16")) + }) + + It("does not override managed Kubernetes when --k8s-managed is not set", func() { + c := buildCmd(&InitInstallConfigOpts{GlobalOptions: &util.GlobalOptions{}}) + + // The flag is not passed, so its default (true) must not overwrite an + // existing value on the config, e.g. one loaded from disk. + root := files.NewRootConfig() + config := &root + config.Kubernetes.ManagedByCodesphere = false + + c.updateConfigFromOpts(config, &files.InstallVault{}) + + Expect(config.Kubernetes.ManagedByCodesphere).To(BeFalse()) + Expect(config.Kubernetes.PodCIDR).To(BeEmpty()) + Expect(config.Kubernetes.ServiceCIDR).To(BeEmpty()) + }) + + It("fails when --k8s-managed=false and the pod CIDR is missing", func() { + configPath, vaultPath := newTempConfigVaultPair() + opts := &InitInstallConfigOpts{ + GlobalOptions: &util.GlobalOptions{}, + ConfigFile: configPath, + VaultFile: vaultPath, + Profile: "dev", + Interactive: false, + } + c := buildCmd(opts) + Expect(c.cmd.Flags().Set("k8s-managed", "false")).To(Succeed()) + + icg := newPlainInstallConfigManager() + err := c.InitInstallConfig(icg) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("pod CIDR is required")) + }) +}) diff --git a/docs/oms_init_install-config.md b/docs/oms_init_install-config.md index 1000442a8..342c45beb 100644 --- a/docs/oms_init_install-config.md +++ b/docs/oms_init_install-config.md @@ -72,6 +72,8 @@ $ oms init install-config --validate -c config.yaml --vault prod.vault.yaml --interactive Enable interactive prompting (when true, other config flags are ignored) (default true) --k8s-control-plane strings K8s control plane IPs (comma-separated) --k8s-managed Use Codesphere-managed Kubernetes (default true) + --k8s-pod-cidr string Pod CIDR (required when --k8s-managed=false) + --k8s-service-cidr string Service CIDR (required when --k8s-managed=false) --openbao-engine string Engine for OpenBao (default "cs-secrets-engine") --openbao-password string Password for OpenBao authentication --openbao-uri string URI for OpenBao (e.g., https://openbao.example.com) diff --git a/internal/codesphere/mocks.go b/internal/codesphere/mocks.go index c26af3464..6785aa7d8 100644 --- a/internal/codesphere/mocks.go +++ b/internal/codesphere/mocks.go @@ -280,8 +280,8 @@ func (_c *MockClient_GetPipelineState_Call) Run(run func(workspaceID int, stage return _c } -func (_c *MockClient_GetPipelineState_Call) Return(vs []api.PipelineStatus, err error) *MockClient_GetPipelineState_Call { - _c.Call.Return(vs, err) +func (_c *MockClient_GetPipelineState_Call) Return(pipelineStatuss []api.PipelineStatus, err error) *MockClient_GetPipelineState_Call { + _c.Call.Return(pipelineStatuss, err) return _c } @@ -397,8 +397,8 @@ func (_c *MockClient_ListWorkspacePlans_Call) Run(run func()) *MockClient_ListWo return _c } -func (_c *MockClient_ListWorkspacePlans_Call) Return(vs []api.WorkspacePlan, err error) *MockClient_ListWorkspacePlans_Call { - _c.Call.Return(vs, err) +func (_c *MockClient_ListWorkspacePlans_Call) Return(workspacePlans []api.WorkspacePlan, err error) *MockClient_ListWorkspacePlans_Call { + _c.Call.Return(workspacePlans, err) return _c } diff --git a/internal/installer/config_generator_collector.go b/internal/installer/config_generator_collector.go index b731a45e3..370ed5697 100644 --- a/internal/installer/config_generator_collector.go +++ b/internal/installer/config_generator_collector.go @@ -180,24 +180,31 @@ func (g *InstallConfig) collectGatewayConfig(prompter prompt.Prompter) { func (g *InstallConfig) collectMetalLBConfig(prompter prompt.Prompter) { log.Println("\n=== MetalLB Configuration (Optional) ===") - g.Config.MetalLB.Enabled = prompter.Bool("Enable MetalLB", g.Config.MetalLB.Enabled) + if g.Config.Cluster.MetalLB == nil { + g.Config.Cluster.MetalLB = &files.MetalLBConfig{} + } + + g.Config.Cluster.MetalLB.Enabled = prompter.Bool("Enable MetalLB", g.Config.Cluster.MetalLB.Enabled) - if g.Config.MetalLB.Enabled { - defaultNumPools := len(g.Config.MetalLB.Pools) + if g.Config.Cluster.MetalLB.Enabled { + defaultNumPools := len(g.Config.Cluster.MetalLB.Pools) if defaultNumPools == 0 { defaultNumPools = 1 } numPools := prompter.Int("Number of MetalLB IP pools", defaultNumPools) - g.Config.MetalLB.Pools = make([]files.MetalLBPoolDef, numPools) + existingPools := g.Config.Cluster.MetalLB.Pools + + g.Config.Cluster.MetalLB.Pools = make([]files.MetalLBPoolDef, numPools) for i := 0; i < numPools; i++ { log.Printf("\nMetalLB Pool %d:\n", i+1) defaultName := fmt.Sprintf("pool-%d", i+1) var defaultIPs []string - if i < len(g.Config.MetalLB.Pools) { - defaultName = g.Config.MetalLB.Pools[i].Name - defaultIPs = g.Config.MetalLB.Pools[i].IPAddresses + + if i < len(existingPools) { + defaultName = existingPools[i].Name + defaultIPs = existingPools[i].IPAddresses } if len(defaultIPs) == 0 { defaultIPs = []string{"10.10.10.100-10.10.10.200"} @@ -205,7 +212,7 @@ func (g *InstallConfig) collectMetalLBConfig(prompter prompt.Prompter) { poolName := prompter.String(" Pool name", defaultName) poolIPs := prompter.StringSlice(" IP addresses/ranges (comma-separated)", defaultIPs) - g.Config.MetalLB.Pools[i] = files.MetalLBPoolDef{ + g.Config.Cluster.MetalLB.Pools[i] = files.MetalLBPoolDef{ Name: poolName, IPAddresses: poolIPs, } diff --git a/internal/installer/config_generator_collector_test.go b/internal/installer/config_generator_collector_test.go index 1738d72db..5d9f8288e 100644 --- a/internal/installer/config_generator_collector_test.go +++ b/internal/installer/config_generator_collector_test.go @@ -4,10 +4,13 @@ package installer_test import ( + "os" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/prompt" ) @@ -32,6 +35,39 @@ var _ = Describe("ConfigGeneratorCollector", func() { Expect(config).ToNot(BeNil()) Expect(config.Datacenter.Name).ToNot(BeEmpty()) }) + + It("should preserve existing MetalLB pools as prompt defaults", func() { + err := manager.ApplyProfile(installer.PROFILE_DEV) + Expect(err).ToNot(HaveOccurred()) + + config := manager.GetInstallConfig() + config.Cluster.MetalLB = &files.MetalLBConfig{ + Enabled: true, + Pools: []files.MetalLBPoolDef{ + {Name: "existing-pool", IPAddresses: []string{"10.0.0.1-10.0.0.5"}}, + }, + } + + // CollectInteractively uses an interactive prompter; point stdin at an + // empty file so every prompt resolves to its default value. + stdin, err := os.CreateTemp("", "stdin-*") + Expect(err).NotTo(HaveOccurred()) + + oldStdin := os.Stdin + os.Stdin = stdin + + DeferCleanup(func() { os.Stdin = oldStdin; _ = os.Remove(stdin.Name()) }) + + err = manager.CollectInteractively() + Expect(err).ToNot(HaveOccurred()) + + config = manager.GetInstallConfig() + Expect(config.Cluster.MetalLB).ToNot(BeNil()) + Expect(config.Cluster.MetalLB.Enabled).To(BeTrue()) + Expect(config.Cluster.MetalLB.Pools).To(HaveLen(1)) + Expect(config.Cluster.MetalLB.Pools[0].Name).To(Equal("existing-pool")) + Expect(config.Cluster.MetalLB.Pools[0].IPAddresses).To(Equal([]string{"10.0.0.1-10.0.0.5"})) + }) }) Describe("Prompter", func() { diff --git a/internal/installer/config_manager_generation_test.go b/internal/installer/config_manager_generation_test.go new file mode 100644 index 000000000..bd783034c --- /dev/null +++ b/internal/installer/config_manager_generation_test.go @@ -0,0 +1,77 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package installer_test + +import ( + "os" + "path/filepath" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "go.yaml.in/yaml/v3" + + "github.com/codesphere-cloud/oms/internal/installer" +) + +var _ = Describe("Generated install config round-trip", func() { + DescribeTable("profiles generate a valid, reloadable install config", + func(profile string) { + manager := newPlainInstallConfigManager() + + err := manager.ApplyProfile(profile) + Expect(err).NotTo(HaveOccurred()) + + // A freshly generated config must already pass validation without warnings. + validationWarnings := manager.ValidateInstallConfig() + Expect(validationWarnings).To(BeEmpty(), + "profile %s produced an invalid config: %v", profile, validationWarnings) + + // Secrets generation must succeed (pure Go crypto, no external tools). + Expect(manager.GenerateSecrets()).To(Succeed()) + + // Structural invariant: MetalLB lives under cluster, not at the root. + config := manager.GetInstallConfig() + Expect(config.Cluster.MetalLB).NotTo(BeNil(), + "profile %s must configure cluster.metallb", profile) + + // Write both files to a temp dir. init install-config produces a + // plaintext vault that is SOPS-encrypted later, so use the + // unencrypted write path. + dir := GinkgoT().TempDir() + configPath := filepath.Join(dir, "config.yaml") + vaultPath := filepath.Join(dir, "prod.vault.yaml") + + Expect(manager.WriteInstallConfig(configPath, false)).To(Succeed()) + Expect(manager.WriteVault(vaultPath, false)).To(Succeed()) + + // The written config must be valid YAML with cluster.metallb (not root metallb). + raw, err := os.ReadFile(configPath) + Expect(err).NotTo(HaveOccurred()) + + var doc map[string]interface{} + Expect(yaml.Unmarshal(raw, &doc)).To(Succeed()) + Expect(doc).NotTo(HaveKey("metallb"), + "profile %s must not emit metallb at the root of config.yaml", profile) + cluster, ok := doc["cluster"].(map[string]interface{}) + Expect(ok).To(BeTrue(), "profile %s must emit a cluster mapping", profile) + Expect(cluster).To(HaveKey("metallb")) + + // Reload the config from disk through the full render+unmarshal path + // and re-validate: round-trip must be lossless and valid. + reloaded := newPlainInstallConfigManager() + Expect(reloaded.LoadInstallConfigFromFile(configPath)).To(Succeed()) + reloadedWarnings := reloaded.ValidateInstallConfig() + Expect(reloadedWarnings).To(BeEmpty(), + "reloaded config for profile %s is invalid: %v", profile, reloadedWarnings) + + // Reload the (unencrypted) vault and validate all required secrets exist. + Expect(reloaded.LoadVaultFromUnecryptedFile(vaultPath)).To(Succeed()) + Expect(reloaded.ValidateVault()).To(BeEmpty(), + "vault for profile %s is invalid: %v", profile, reloaded.ValidateVault()) + }, + Entry("dev profile", installer.PROFILE_DEV), + Entry("minimal profile", installer.PROFILE_MINIMAL), + Entry("production profile", installer.PROFILE_PROD), + ) +}) diff --git a/internal/installer/config_manager_profile.go b/internal/installer/config_manager_profile.go index ec4f0b258..50dd7c442 100644 --- a/internal/installer/config_manager_profile.go +++ b/internal/installer/config_manager_profile.go @@ -93,8 +93,9 @@ func (g *InstallConfig) applyCommonProperties() { if g.Config.Cluster.PublicGateway.ServiceType == "" { g.Config.Cluster.PublicGateway = files.GatewayConfig{ServiceType: "LoadBalancer"} } - if g.Config.MetalLB == nil { - g.Config.MetalLB = &files.MetalLBConfig{ + + if g.Config.Cluster.MetalLB == nil { + g.Config.Cluster.MetalLB = &files.MetalLBConfig{ Enabled: false, Pools: []files.MetalLBPoolDef{}, } @@ -103,6 +104,10 @@ func (g *InstallConfig) applyCommonProperties() { g.Config.Registry = &files.RegistryConfig{} } + certIssuer := g.Config.Codesphere.EnsureCertIssuer() + if certIssuer.Type == "" { + certIssuer.Type = files.CertIssuerTypeSelfSigned + } if g.Config.Codesphere.Domain == "" { g.Config.Codesphere.Domain = "codesphere.local" } @@ -195,10 +200,9 @@ func (g *InstallConfig) applyCommonProperties() { } } -func (g *InstallConfig) applyProfileDev() error { - if g.Config.Datacenter.Name == "" { - g.Config.Datacenter.Name = "dev" - } +// ensureMonitoringDefaults populates the monitoring stack with the given enabled +// states, preserving any explicitly configured values. +func (g *InstallConfig) ensureMonitoringDefaults(clusterName string, loki, grafana, alloy bool) { if g.Config.Cluster.Monitoring == nil { g.Config.Cluster.Monitoring = &files.MonitoringConfig{} } @@ -208,18 +212,38 @@ func (g *InstallConfig) applyProfileDev() error { if g.Config.Cluster.Monitoring.Prometheus.RemoteWrite == nil { g.Config.Cluster.Monitoring.Prometheus.RemoteWrite = &files.RemoteWriteConfig{ Enabled: false, - ClusterName: "dev", + ClusterName: clusterName, } } if g.Config.Cluster.Monitoring.Loki == nil { - g.Config.Cluster.Monitoring.Loki = &files.LokiConfig{Enabled: false} + g.Config.Cluster.Monitoring.Loki = &files.LokiConfig{Enabled: loki} } if g.Config.Cluster.Monitoring.Grafana == nil { - g.Config.Cluster.Monitoring.Grafana = &files.GrafanaConfig{Enabled: false} + g.Config.Cluster.Monitoring.Grafana = &files.GrafanaConfig{Enabled: grafana} } if g.Config.Cluster.Monitoring.GrafanaAlloy == nil { - g.Config.Cluster.Monitoring.GrafanaAlloy = &files.GrafanaAlloyConfig{Enabled: false} + g.Config.Cluster.Monitoring.GrafanaAlloy = &files.GrafanaAlloyConfig{Enabled: alloy} + } +} + +// ensureWorkspacePlans sets the default workspace plan for plan ID 1. +func (g *InstallConfig) ensureWorkspacePlans(name string, maxReplicas int) { + g.Config.Codesphere.Plans.WorkspacePlans = map[int]files.WorkspacePlan{ + 1: { + Name: name, + HostingPlanID: 1, + MaxReplicas: maxReplicas, + OnDemand: true, + }, } +} + +func (g *InstallConfig) applyProfileDev() error { + if g.Config.Datacenter.Name == "" { + g.Config.Datacenter.Name = "dev" + } + + g.ensureMonitoringDefaults("dev", false, false, false) if err := ApplyResourceProfile(g.Config, ResourceProfileNoRequests); err != nil { return fmt.Errorf("applying resource profile: %w", err) } @@ -230,37 +254,9 @@ func (g *InstallConfig) applyProfileMinimal() error { if g.Config.Datacenter.Name == "" { g.Config.Datacenter.Name = "dev" } - if g.Config.Cluster.Monitoring == nil { - g.Config.Cluster.Monitoring = &files.MonitoringConfig{} - } - if g.Config.Cluster.Monitoring.Prometheus == nil { - g.Config.Cluster.Monitoring.Prometheus = &files.PrometheusConfig{} - } - if g.Config.Cluster.Monitoring.Prometheus.RemoteWrite == nil { - g.Config.Cluster.Monitoring.Prometheus.RemoteWrite = &files.RemoteWriteConfig{ - Enabled: false, - ClusterName: "dev", - } - } - if g.Config.Cluster.Monitoring.Loki == nil { - g.Config.Cluster.Monitoring.Loki = &files.LokiConfig{Enabled: true} - } - if g.Config.Cluster.Monitoring.Grafana == nil { - g.Config.Cluster.Monitoring.Grafana = &files.GrafanaConfig{Enabled: true} - } - if g.Config.Cluster.Monitoring.GrafanaAlloy == nil { - g.Config.Cluster.Monitoring.GrafanaAlloy = &files.GrafanaAlloyConfig{Enabled: true} - } - if g.Config.Codesphere.Plans.WorkspacePlans == nil { - g.Config.Codesphere.Plans.WorkspacePlans = map[int]files.WorkspacePlan{ - 1: { - Name: "Standard Developer", - HostingPlanID: 1, - MaxReplicas: 1, - OnDemand: true, - }, - } - } + + g.ensureMonitoringDefaults("dev", true, true, true) + g.ensureWorkspacePlans("Standard Developer", 1) if g.Config.Cluster.BarmanCloudPlugin == nil { g.Config.Cluster.BarmanCloudPlugin = &files.BarmanCloudPluginConfig{ Enabled: true, @@ -287,16 +283,8 @@ func (g *InstallConfig) applyProfileProd() error { if g.Config.Datacenter.Name == "" { g.Config.Datacenter.Name = "production" } - if g.Config.Codesphere.Plans.WorkspacePlans == nil { - g.Config.Codesphere.Plans.WorkspacePlans = map[int]files.WorkspacePlan{ - 1: { - Name: "Standard Developer", - HostingPlanID: 1, - MaxReplicas: 3, - OnDemand: true, - }, - } - } + + g.ensureWorkspacePlans("Standard Developer", 3) g.Config.Cluster.Monitoring = &files.MonitoringConfig{ Prometheus: &files.PrometheusConfig{ RemoteWrite: &files.RemoteWriteConfig{ diff --git a/internal/installer/config_manager_profile_test.go b/internal/installer/config_manager_profile_test.go index 5923ff602..246a22325 100644 --- a/internal/installer/config_manager_profile_test.go +++ b/internal/installer/config_manager_profile_test.go @@ -103,8 +103,8 @@ var _ = Describe("ConfigManagerProfile", func() { Expect(config.Cluster.PublicGateway.ServiceType).To(Equal("LoadBalancer")) // MetalLB - Expect(config.MetalLB).ToNot(BeNil()) - Expect(config.MetalLB.Enabled).To(BeFalse()) + Expect(config.Cluster.MetalLB).ToNot(BeNil()) + Expect(config.Cluster.MetalLB.Enabled).To(BeFalse()) // Ceph OSDs Expect(config.Ceph.OSDs).To(HaveLen(1)) @@ -207,6 +207,33 @@ var _ = Describe("ConfigManagerProfile", func() { Expect(prodManager.GetInstallConfig().Cluster.Monitoring.GrafanaAlloy.Enabled).To(BeTrue()) Expect(prodManager.GetInstallConfig().Codesphere.Override).To(BeNil()) }) + + It("should have the expected default workspace plans", func() { + devManager := newPlainInstallConfigManager() + prodManager := newPlainInstallConfigManager() + minimalManager := newPlainInstallConfigManager() + + err := devManager.ApplyProfile(installer.PROFILE_DEV) + Expect(err).ToNot(HaveOccurred()) + err = prodManager.ApplyProfile(installer.PROFILE_PROD) + Expect(err).ToNot(HaveOccurred()) + err = minimalManager.ApplyProfile(installer.PROFILE_MINIMAL) + Expect(err).ToNot(HaveOccurred()) + + plan := func(mgr installer.InstallConfigManager) files.WorkspacePlan { + return mgr.GetInstallConfig().Codesphere.Plans.WorkspacePlans[1] + } + + // Dev inherits the common default. + Expect(plan(devManager).Name).To(Equal("Standard")) + Expect(plan(devManager).MaxReplicas).To(Equal(3)) + + // Minimal and production override the name and replicas. + Expect(plan(minimalManager).Name).To(Equal("Standard Developer")) + Expect(plan(minimalManager).MaxReplicas).To(Equal(1)) + Expect(plan(prodManager).Name).To(Equal("Standard Developer")) + Expect(plan(prodManager).MaxReplicas).To(Equal(3)) + }) }) }) diff --git a/internal/installer/files/config_yaml.go b/internal/installer/files/config_yaml.go index b91f8a56c..b0f3050f4 100644 --- a/internal/installer/files/config_yaml.go +++ b/internal/installer/files/config_yaml.go @@ -106,7 +106,6 @@ type RootConfig struct { Ceph CephConfig `yaml:"ceph"` Kubernetes KubernetesConfig `yaml:"kubernetes"` Cluster ClusterConfig `yaml:"cluster"` - MetalLB *MetalLBConfig `yaml:"metallb,omitempty"` Codesphere CodesphereConfig `yaml:"codesphere"` PcApps ChartValues `yaml:"pcApps,omitempty"` ManagedServiceBackends *ManagedServiceBackendsConfig `yaml:"managedServiceBackends,omitempty"` @@ -228,6 +227,7 @@ type ClusterConfig struct { Monitoring *MonitoringConfig `yaml:"monitoring,omitempty"` Gateway GatewayConfig `yaml:"gateway"` PublicGateway GatewayConfig `yaml:"publicGateway"` + MetalLB *MetalLBConfig `yaml:"metallb,omitempty"` RookExternalCluster *RookExternalClusterConfig `yaml:"rookExternalCluster,omitempty"` PgOperator *PgOperatorConfig `yaml:"pgOperator,omitempty"` BarmanCloudPlugin *BarmanCloudPluginConfig `yaml:"BarmanCloudPluginConfig,omitempty"` @@ -751,7 +751,6 @@ func (c *RootConfig) Unmarshal(data []byte) error { func NewRootConfig() RootConfig { return RootConfig{ Registry: &RegistryConfig{}, - MetalLB: &MetalLBConfig{}, PcApps: ChartValues{}, ManagedServiceBackends: &ManagedServiceBackendsConfig{}, } diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 04f4fec0c..3c4a30e54 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -681,12 +681,6 @@ Version: v69.2.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v69.2.0/LICENSE ----------- -Module: github.com/google/go-github/v74/github -Version: v74.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v74.0.0/LICENSE - ---------- Module: github.com/google/go-github/v86/github Version: v86.0.0 @@ -699,6 +693,12 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE +---------- +Module: github.com/google/go-github/v90/github +Version: v90.0.0 +License: BSD-3-Clause +License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE + ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 diff --git a/internal/util/mocks.go b/internal/util/mocks.go index f307cc039..682b2f409 100644 --- a/internal/util/mocks.go +++ b/internal/util/mocks.go @@ -703,8 +703,8 @@ func (_c *MockFileIO_ReadDir_Call) Run(run func(dirname string)) *MockFileIO_Rea return _c } -func (_c *MockFileIO_ReadDir_Call) Return(vs []os.DirEntry, err error) *MockFileIO_ReadDir_Call { - _c.Call.Return(vs, err) +func (_c *MockFileIO_ReadDir_Call) Return(dirEntrys []os.DirEntry, err error) *MockFileIO_ReadDir_Call { + _c.Call.Return(dirEntrys, err) return _c } From f0fa6887f25d0b21174a75f95653205ff874a8de Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:01:11 +0000 Subject: [PATCH 056/132] update(deps): update github.com/rook/rook/pkg/apis digest to 7ffbcce (#732) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `d0c3b9c` → `7ffbcce` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 6 ++---- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/NOTICE b/NOTICE index 3c4a30e54..1c4c3c4bb 100644 --- a/NOTICE +++ b/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260821220733-d0c3b9ce6d64 +Version: v0.0.0-20260824181932-7ffbcce79041 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/d0c3b9ce6d64/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7ffbcce79041/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 3118f60c6..52819ae8f 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64 + github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 59007f7c2..c6f64bcff 100644 --- a/go.sum +++ b/go.sum @@ -3805,8 +3805,6 @@ github.com/google/go-containerregistry v0.21.9 h1:F+D4uZ3iA3DLMJLfhaqMdHJbzeqm/2 github.com/google/go-containerregistry v0.21.9/go.mod h1:dP5XNKcL7kMFF/TB3LfvWmVhAcv7iqkHb3oDK8aauTo= github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE= github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM= -github.com/google/go-github/v74 v74.0.0 h1:yZcddTUn8DPbj11GxnMrNiAnXH14gNs559AsUpNpPgM= -github.com/google/go-github/v74 v74.0.0/go.mod h1:ubn/YdyftV80VPSI26nSJvaEsTOnsjrxG3o9kJhcyak= github.com/google/go-github/v86 v86.0.0 h1:S/6aANJhwRm8EQmGKVML3j41yq0h2BsTP8FnDkO7kcA= github.com/google/go-github/v86 v86.0.0/go.mod h1:zKv1l4SwDXNFMGByi2FWkq71KwSXqj/eQRZuqtmcot8= github.com/google/go-github/v88 v88.0.0 h1:dZA9IKkPK1eXZj4ypngnpRj5FwdpTv4whix2PrQMP7M= @@ -4717,8 +4715,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64 h1:BmEIuumk5ASCCaWB/4PQgs5a6nEChdLb+0sqAURXnuA= -github.com/rook/rook/pkg/apis v0.0.0-20260821220733-d0c3b9ce6d64/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041 h1:7iCmeRlUltMZnxqSKoJtW2rULjo/T62xjVXxVilAOxI= +github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3c4a30e54..1c4c3c4bb 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260821220733-d0c3b9ce6d64 +Version: v0.0.0-20260824181932-7ffbcce79041 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/d0c3b9ce6d64/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7ffbcce79041/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From a55321da1ad4389ad2d06088120297a9531ebaae Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 23:01:39 +0000 Subject: [PATCH 057/132] update(deps): update github.com/rook/rook/pkg/apis digest to c4f3f3b (#733) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `7ffbcce` → `c4f3f3b` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 1c4c3c4bb..1906896f2 100644 --- a/NOTICE +++ b/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260824181932-7ffbcce79041 +Version: v0.0.0-20260824212944-c4f3f3bd087d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7ffbcce79041/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/c4f3f3bd087d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 52819ae8f..e844964f5 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041 + github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index c6f64bcff..eada15927 100644 --- a/go.sum +++ b/go.sum @@ -4715,8 +4715,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041 h1:7iCmeRlUltMZnxqSKoJtW2rULjo/T62xjVXxVilAOxI= -github.com/rook/rook/pkg/apis v0.0.0-20260824181932-7ffbcce79041/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d h1:NiFJQ3JLBjtkhG4MFfLLy+VygK5TLBV4B4KLJuJbtt8= +github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 1c4c3c4bb..1906896f2 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260824181932-7ffbcce79041 +Version: v0.0.0-20260824212944-c4f3f3bd087d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7ffbcce79041/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/c4f3f3bd087d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From b1149bbabd161aad5791cdbad15a5835e3ba5cc1 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 10:01:18 +0000 Subject: [PATCH 058/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.31.0 (#734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.28.0` → `v1.31.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.31.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.28.0/v1.31.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.31.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.31.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.30.0...v1.31.0) #### Changelog - [`ad44c9c`](https://redirect.github.com/codesphere-cloud/cs-go/commit/ad44c9c0e8ab6ef489f02c64b6a3ed77233267e6) update(deps): update endbug/add-and-commit action to v11 ([#​313](https://redirect.github.com/codesphere-cloud/cs-go/issues/313)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser). ### [`v1.30.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.30.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.29.0...v1.30.0) #### Changelog - [`76d9b62`](https://redirect.github.com/codesphere-cloud/cs-go/commit/76d9b626ee20e42b21c3af70f45cde28858ba181) update(deps): update github artifact actions ([#​314](https://redirect.github.com/codesphere-cloud/cs-go/issues/314)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser). ### [`v1.29.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.29.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.28.0...v1.29.0) #### Changelog - [`b955f82`](https://redirect.github.com/codesphere-cloud/cs-go/commit/b955f82c0405a7e441a99238a8ee8c9b97088fba) update(deps): update module github.com/goreleaser/goreleaser/v2 to v2.18.0 ([#​317](https://redirect.github.com/codesphere-cloud/cs-go/issues/317)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 1906896f2..6abc22ff3 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.28.0 +Version: v1.31.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.28.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.31.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index e844964f5..6e1bd5d41 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.1 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.28.0 + github.com/codesphere-cloud/cs-go v1.31.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index eada15927..8eeb9a8a7 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.28.0 h1:nTCrbWareNVCOsqUp46fWX39DoZTGOJoys17KTfCvgw= -github.com/codesphere-cloud/cs-go v1.28.0/go.mod h1:Jixj8kmFsdAnSq9Eu31hl/AR0YOxFkcz5N9Vgc07RiE= +github.com/codesphere-cloud/cs-go v1.31.0 h1:VL2sheS8+OtOdkm93FMbOm7oXJJNeGK8kv8s5I3ebhk= +github.com/codesphere-cloud/cs-go v1.31.0/go.mod h1:GfXpquo56IOBvkx5u0Tpq7KXsU3xn8+1Chzpqpsm/bE= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 1906896f2..6abc22ff3 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.28.0 +Version: v1.31.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.28.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.31.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 7732219bc61ac948c29fe2ce5eb13adf16a70443 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 14:02:06 +0000 Subject: [PATCH 059/132] update(deps): update github.com/rook/rook/pkg/apis digest to 1d26011 (#736) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `c4f3f3b` → `1d26011` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 6abc22ff3..a180f7922 100644 --- a/NOTICE +++ b/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260824212944-c4f3f3bd087d +Version: v0.0.0-20260825124759-1d260111b3ae License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/c4f3f3bd087d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/1d260111b3ae/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 6e1bd5d41..1de6b8be5 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d + github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 8eeb9a8a7..ee34977bb 100644 --- a/go.sum +++ b/go.sum @@ -4715,8 +4715,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d h1:NiFJQ3JLBjtkhG4MFfLLy+VygK5TLBV4B4KLJuJbtt8= -github.com/rook/rook/pkg/apis v0.0.0-20260824212944-c4f3f3bd087d/go.mod h1:79nbfxfJ+jQZKPvj2ZPvULSP5g+hEpXA0sj63m42GBA= +github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae h1:bYmV1a8GCheEGpsaUZx52Cri+XGNRv30gD9174r67j4= +github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6abc22ff3..a180f7922 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260824212944-c4f3f3bd087d +Version: v0.0.0-20260825124759-1d260111b3ae License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/c4f3f3bd087d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/1d260111b3ae/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 546c7bc4ea2f4d5788061bd2ba349fa17566e537 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:02:44 +0000 Subject: [PATCH 060/132] update(deps): update module google.golang.org/grpc to v1.83.2 (#738) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/grpc](https://redirect.github.com/grpc/grpc-go) | `v1.83.1` → `v1.83.2` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fgrpc/v1.83.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fgrpc/v1.83.1/v1.83.2?slim=true) | --- ### Release Notes
grpc/grpc-go (google.golang.org/grpc) ### [`v1.83.2`](https://redirect.github.com/grpc/grpc-go/releases/tag/v1.83.2): Release 1.83.2 [Compare Source](https://redirect.github.com/grpc/grpc-go/compare/v1.83.1...v1.83.2) ### Security - server: Reject requests missing both `:authority` and `Host` headers with HTTP 400 and status `Internal`. ([#​9365](https://redirect.github.com/grpc/grpc-go/pull/9365)) - Special Thanks: [@​winklemad](https://redirect.github.com/winklemad)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index a180f7922..81bcdea3e 100644 --- a/NOTICE +++ b/NOTICE @@ -1553,9 +1553,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googlea ---------- Module: google.golang.org/grpc -Version: v1.83.1 +Version: v1.83.2 License: Apache-2.0 -License URL: https://github.com/grpc/grpc-go/blob/v1.83.1/LICENSE +License URL: https://github.com/grpc/grpc-go/blob/v1.83.2/LICENSE ---------- Module: google.golang.org/protobuf diff --git a/go.mod b/go.mod index 1de6b8be5..fad540f3b 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 google.golang.org/api v0.293.0 - google.golang.org/grpc v1.83.1 + google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 diff --git a/go.sum b/go.sum index ee34977bb..a92b469e5 100644 --- a/go.sum +++ b/go.sum @@ -6776,8 +6776,8 @@ google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= -google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= +google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/grpc/examples v0.0.0-20201112215255-90f1b3ee835b/go.mod h1:IBqQ7wSUJ2Ep09a8rMWFsg4fmI2r38zwsq8a0GgxXpM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index a180f7922..81bcdea3e 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1553,9 +1553,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googlea ---------- Module: google.golang.org/grpc -Version: v1.83.1 +Version: v1.83.2 License: Apache-2.0 -License URL: https://github.com/grpc/grpc-go/blob/v1.83.1/LICENSE +License URL: https://github.com/grpc/grpc-go/blob/v1.83.2/LICENSE ---------- Module: google.golang.org/protobuf From 1cd8526d7570d15ee0056d6939f3bb62ca0a4226 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 19:01:42 +0000 Subject: [PATCH 061/132] update(deps): update github.com/rook/rook/pkg/apis digest to 11e2ef3 (#739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `1d26011` → `11e2ef3` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 81bcdea3e..3915e8a67 100644 --- a/NOTICE +++ b/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260825124759-1d260111b3ae +Version: v0.0.0-20260825171748-11e2ef3ba5cc License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/1d260111b3ae/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/11e2ef3ba5cc/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index fad540f3b..2fca7e541 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae + github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index a92b469e5..6b1e523a3 100644 --- a/go.sum +++ b/go.sum @@ -4715,8 +4715,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae h1:bYmV1a8GCheEGpsaUZx52Cri+XGNRv30gD9174r67j4= -github.com/rook/rook/pkg/apis v0.0.0-20260825124759-1d260111b3ae/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc h1:Cstux+yN3TGxcFQU7ETZv90xmVwMuL+KmsYzMEHxHsg= +github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 81bcdea3e..3915e8a67 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260825124759-1d260111b3ae +Version: v0.0.0-20260825171748-11e2ef3ba5cc License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/1d260111b3ae/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/11e2ef3ba5cc/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 7da9b1151d3f9660caaf51cd9954f5f1699820c8 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 20:01:50 +0000 Subject: [PATCH 062/132] update(deps): update module github.com/google/go-containerregistry to v0.22.0 (#740) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/google/go-containerregistry](https://redirect.github.com/google/go-containerregistry) | `v0.21.9` → `v0.22.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgoogle%2fgo-containerregistry/v0.22.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgoogle%2fgo-containerregistry/v0.21.9/v0.22.0?slim=true) | --- ### Release Notes
google/go-containerregistry (github.com/google/go-containerregistry) ### [`v0.22.0`](https://redirect.github.com/google/go-containerregistry/releases/tag/v0.22.0) [Compare Source](https://redirect.github.com/google/go-containerregistry/compare/v0.21.9...v0.22.0) #### What's Changed - mutate: let Time and Canonical take tarball.LayerOption by [@​mzihlmann](https://redirect.github.com/mzihlmann) in [#​2403](https://redirect.github.com/google/go-containerregistry/pull/2403) - build: add multi-architecture Cloud Build configurations for crane, gcrane, and krane by [@​tprussak](https://redirect.github.com/tprussak) in [#​2412](https://redirect.github.com/google/go-containerregistry/pull/2412) - remote: resolve push-check credentials against the repository by [@​mzihlmann](https://redirect.github.com/mzihlmann) in [#​2411](https://redirect.github.com/google/go-containerregistry/pull/2411) - Allow single-character repository paths by [@​semx](https://redirect.github.com/semx) in [#​2407](https://redirect.github.com/google/go-containerregistry/pull/2407) - fix: add missing substitutions and workspace cleanup to new build files by [@​tprussak](https://redirect.github.com/tprussak) in [#​2413](https://redirect.github.com/google/go-containerregistry/pull/2413) - remote: retry failed Puller and Pusher initialization by [@​iahsanGill](https://redirect.github.com/iahsanGill) in [#​2406](https://redirect.github.com/google/go-containerregistry/pull/2406) - build(deps): bump the actions group across 1 directory with 8 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2405](https://redirect.github.com/google/go-containerregistry/pull/2405) - build(deps): bump the go-deps group across 1 directory with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2415](https://redirect.github.com/google/go-containerregistry/pull/2415) - go.mod: bump Go version + add toolchain directive to replace .go-version file by [@​Subserial](https://redirect.github.com/Subserial) in [#​2416](https://redirect.github.com/google/go-containerregistry/pull/2416) - fix: Fix new build options and provenance by [@​tprussak](https://redirect.github.com/tprussak) in [#​2417](https://redirect.github.com/google/go-containerregistry/pull/2417) - fix(build): unify new build flow into cloudbuild\_v2.yaml by [@​tprussak](https://redirect.github.com/tprussak) in [#​2419](https://redirect.github.com/google/go-containerregistry/pull/2419) #### New Contributors - [@​mzihlmann](https://redirect.github.com/mzihlmann) made their first contribution in [#​2403](https://redirect.github.com/google/go-containerregistry/pull/2403) - [@​tprussak](https://redirect.github.com/tprussak) made their first contribution in [#​2412](https://redirect.github.com/google/go-containerregistry/pull/2412) - [@​semx](https://redirect.github.com/semx) made their first contribution in [#​2407](https://redirect.github.com/google/go-containerregistry/pull/2407) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/NOTICE b/NOTICE index 3915e8a67..70cf33552 100644 --- a/NOTICE +++ b/NOTICE @@ -359,9 +359,9 @@ License URL: https://github.com/dlclark/regexp2/blob/v1.12.0/LICENSE ---------- Module: github.com/docker/cli/cli/config -Version: v29.6.2 +Version: v29.7.2 License: Apache-2.0 -License URL: https://github.com/docker/cli/blob/v29.6.2/LICENSE +License URL: https://github.com/docker/cli/blob/v29.7.2/LICENSE ---------- Module: github.com/docker/docker-credential-helpers @@ -671,9 +671,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.21.9 +Version: v0.22.0 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.21.9/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.22.0/LICENSE ---------- Module: github.com/google/go-github/v69/github diff --git a/go.mod b/go.mod index 2fca7e541..b1e5033c5 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 - github.com/google/go-containerregistry v0.21.9 + github.com/google/go-containerregistry v0.22.0 github.com/google/go-github/v90 v90.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 @@ -247,7 +247,7 @@ require ( github.com/dimchansky/utfbom v1.1.1 // indirect github.com/dlclark/regexp2 v1.12.0 // indirect github.com/dlclark/regexp2/v2 v2.2.2 // indirect - github.com/docker/cli v29.6.2+incompatible // indirect + github.com/docker/cli v29.7.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.9.8 // indirect github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect diff --git a/go.sum b/go.sum index 6b1e523a3..8574d2e50 100644 --- a/go.sum +++ b/go.sum @@ -3304,8 +3304,8 @@ github.com/dlclark/regexp2/v2 v2.2.2 h1:MYWvNYw8okuqNhwTYO587EZMiDruVa2vhV6fsGpf github.com/dlclark/regexp2/v2 v2.2.2/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v29.6.2+incompatible h1:/bjePvcbbFTnRrMfWJBY7AjfICdsiLVgHn6LwTVOcqw= -github.com/docker/cli v29.6.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v29.7.2+incompatible h1:dlkwallR8XqfeVnA2ELEhdwvb4lsSwuB4IgsG8Q9cLY= +github.com/docker/cli v29.7.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker-credential-helpers v0.9.8 h1:bIREROb7So6PRlq6KTtdS9MPEjC29OQRkFNlvK2OX8Q= github.com/docker/docker-credential-helpers v0.9.8/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= @@ -3801,8 +3801,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.21.9 h1:F+D4uZ3iA3DLMJLfhaqMdHJbzeqm/216WGQq2dokuLs= -github.com/google/go-containerregistry v0.21.9/go.mod h1:dP5XNKcL7kMFF/TB3LfvWmVhAcv7iqkHb3oDK8aauTo= +github.com/google/go-containerregistry v0.22.0 h1:eGbCiPeYxAH/7WLLq6zTBALP0tUIFsoyRauhxXDJ53I= +github.com/google/go-containerregistry v0.22.0/go.mod h1:bJR35SK8XgisYmhg/FMQ/5RK0S/XrOAqLBV5/LR2XE0= github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE= github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM= github.com/google/go-github/v86 v86.0.0 h1:S/6aANJhwRm8EQmGKVML3j41yq0h2BsTP8FnDkO7kcA= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3915e8a67..70cf33552 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -359,9 +359,9 @@ License URL: https://github.com/dlclark/regexp2/blob/v1.12.0/LICENSE ---------- Module: github.com/docker/cli/cli/config -Version: v29.6.2 +Version: v29.7.2 License: Apache-2.0 -License URL: https://github.com/docker/cli/blob/v29.6.2/LICENSE +License URL: https://github.com/docker/cli/blob/v29.7.2/LICENSE ---------- Module: github.com/docker/docker-credential-helpers @@ -671,9 +671,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.21.9 +Version: v0.22.0 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.21.9/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.22.0/LICENSE ---------- Module: github.com/google/go-github/v69/github From a7b3c0f19dfea824991534d176cb1cca37bb6c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maiti=C3=BA=20=C3=93=20Ciar=C3=A1in?= Date: Wed, 26 Aug 2026 09:55:45 +0200 Subject: [PATCH 063/132] Config Templating: Update doc strings and docs with correct quotes (#697) The real work is all here: https://github.com/codesphere-cloud/oms/pull/457 This is just a little update on the docs. --------- Signed-off-by: mociarain <20353159+mociarain@users.noreply.github.com> Co-authored-by: mociarain <20353159+mociarain@users.noreply.github.com> --- cli/cmd/template_config.go | 8 ++++---- docs/oms_template_config.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/cmd/template_config.go b/cli/cmd/template_config.go index e2744a19c..37fead88d 100644 --- a/cli/cmd/template_config.go +++ b/cli/cmd/template_config.go @@ -56,14 +56,14 @@ This command prints the rendered configuration to stdout so templating can be te Template syntax in config.yaml: # Inject a secret value (defaults to the "content"/"password" field) - someKey: "{{ secret "mySecret" }}" + someKey: '{{ secret "mySecret" }}' # Select a specific field - username: "{{ secret "mySecret" "fields.username" }}" - password: "{{ secret "mySecret" "fields.password" }}" + username: '{{ secret "mySecret" "fields.username" }}' + password: '{{ secret "mySecret" "fields.password" }}' # Inject a file secret's content - caCert: "{{ secret "caCert" "file.content" }}" + caCert: '{{ secret "caCert" "file.content" }}' Secret names and selectors must match entries in the prod.vault.yaml file.`), Example: util.FormatExamples("template config", []io.Example{ diff --git a/docs/oms_template_config.md b/docs/oms_template_config.md index bd734a4bf..8a8967e8e 100644 --- a/docs/oms_template_config.md +++ b/docs/oms_template_config.md @@ -11,14 +11,14 @@ This command prints the rendered configuration to stdout so templating can be te Template syntax in config.yaml: # Inject a secret value (defaults to the "content"/"password" field) - someKey: "{{ secret "mySecret" }}" + someKey: '{{ secret "mySecret" }}' # Select a specific field - username: "{{ secret "mySecret" "fields.username" }}" - password: "{{ secret "mySecret" "fields.password" }}" + username: '{{ secret "mySecret" "fields.username" }}' + password: '{{ secret "mySecret" "fields.password" }}' # Inject a file secret's content - caCert: "{{ secret "caCert" "file.content" }}" + caCert: '{{ secret "caCert" "file.content" }}' Secret names and selectors must match entries in the prod.vault.yaml file. From 04826673454fde9760a83e288ad3420d1fe90bb0 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 11:01:38 +0000 Subject: [PATCH 064/132] update(deps): update github.com/rook/rook/pkg/apis digest to 01bbd46 (#741) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `11e2ef3` → `01bbd46` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 70cf33552..4e52b3eca 100644 --- a/NOTICE +++ b/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260825171748-11e2ef3ba5cc +Version: v0.0.0-20260826094747-01bbd460392f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/11e2ef3ba5cc/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/01bbd460392f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b1e5033c5..475e0c2ff 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.42.1 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc + github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 8574d2e50..7f99a31a9 100644 --- a/go.sum +++ b/go.sum @@ -4715,8 +4715,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc h1:Cstux+yN3TGxcFQU7ETZv90xmVwMuL+KmsYzMEHxHsg= -github.com/rook/rook/pkg/apis v0.0.0-20260825171748-11e2ef3ba5cc/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f h1:c5VjAG3YnAhMZj/B0qNdZ+dw0w30j5DoeUa2w5T1bcU= +github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 70cf33552..4e52b3eca 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1193,9 +1193,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260825171748-11e2ef3ba5cc +Version: v0.0.0-20260826094747-01bbd460392f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/11e2ef3ba5cc/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/01bbd460392f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 60d164bc9192466554131575d484af073a140bb0 Mon Sep 17 00:00:00 2001 From: Alex Klein Date: Wed, 26 Aug 2026 14:24:21 +0200 Subject: [PATCH 065/132] refac(internal/github): single graphql query to fetch all SSH keys at once (#723) We are making 1 list request to get all members of a team, and 1 get request for each member's ssh key. For large team's, this results in a lot of requests being made, which may quickly contribute to hitting GitHub API rate limits, Make a single GraphQL query to get all keys at once. --- NOTICE | 6 -- internal/bootstrap/gcp/gce_test.go | 6 +- internal/github/github.go | 58 ++-------- internal/github/github_client.go | 166 +++++++++++++++++++++++++---- internal/github/github_test.go | 49 ++++----- internal/github/mocks.go | 117 ++++---------------- internal/tmpl/NOTICE | 6 -- 7 files changed, 198 insertions(+), 210 deletions(-) diff --git a/NOTICE b/NOTICE index 4e52b3eca..8b821a2eb 100644 --- a/NOTICE +++ b/NOTICE @@ -693,12 +693,6 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE ----------- -Module: github.com/google/go-github/v90/github -Version: v90.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE - ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 diff --git a/internal/bootstrap/gcp/gce_test.go b/internal/bootstrap/gcp/gce_test.go index 5c580cafc..352608bfb 100644 --- a/internal/bootstrap/gcp/gce_test.go +++ b/internal/bootstrap/gcp/gce_test.go @@ -12,7 +12,6 @@ import ( "github.com/codesphere-cloud/oms/internal/bootstrap/gcp" "github.com/codesphere-cloud/oms/internal/github" "github.com/codesphere-cloud/oms/internal/util" - gh "github.com/google/go-github/v90/github" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/stretchr/testify/mock" @@ -678,8 +677,7 @@ var _ = Describe("GCE", func() { csEnv.GitHubTeamSlug = "dev" }) It("fetches GitHub team keys", func() { - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, csEnv.GitHubTeamOrg, csEnv.GitHubTeamSlug, mock.Anything).Return([]*gh.User{{Login: gh.Ptr("alice")}}, nil).Maybe() - mockGitHubClient.EXPECT().ListUserKeys(mock.Anything, "alice").Return([]*gh.Key{{Key: gh.Ptr("ssh-rsa AAALICE...")}}, nil).Maybe() + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, csEnv.GitHubTeamOrg, csEnv.GitHubTeamSlug).Return([]github.TeamMemberKeys{{Login: "alice", Keys: []string{"ssh-rsa AAALICE..."}}}, nil).Maybe() ipResp := makeRunningInstance("10.0.0.x", "1.2.3.x") mockGetInstanceNotFoundThenRunning(gc, csEnv.ProjectID, csEnv.Zone, ipResp, 8) @@ -703,7 +701,7 @@ var _ = Describe("GCE", func() { It("fails when GitHub client fails to list team members", func() { gc.EXPECT().GetInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).Return(nil, grpcstatus.Errorf(codes.NotFound, "not found")).Maybe() - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, csEnv.GitHubTeamOrg, csEnv.GitHubTeamSlug, mock.Anything).Return(nil, fmt.Errorf("list members error")).Maybe() + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, csEnv.GitHubTeamOrg, csEnv.GitHubTeamSlug).Return(nil, fmt.Errorf("list members error")).Maybe() err := bs.EnsureComputeInstances() Expect(err).To(HaveOccurred()) diff --git a/internal/github/github.go b/internal/github/github.go index 5bfa3137a..540cc5109 100644 --- a/internal/github/github.go +++ b/internal/github/github.go @@ -6,8 +6,6 @@ package github import ( "context" "fmt" - - "github.com/google/go-github/v90/github" ) // GetSSHKeysFromGitHubTeam fetches the public SSH keys of all members of the specified GitHub team and formats them for inclusion in instance metadata. @@ -15,62 +13,20 @@ func GetSSHKeysFromGitHubTeam(client GitHubClient, org, teamSlug string) (string if org == "" || teamSlug == "" { return "", fmt.Errorf("GitHub team slug and org must be specified to fetch SSH keys from GitHub team") } - allKeys := "" - allMembers, err := listAllGitHubTeamMembers(client, org, teamSlug) + members, err := client.GetTeamMemberSSHKeys(context.Background(), org, teamSlug) if err != nil { - return "", fmt.Errorf("failed to list GitHub team members: %w", err) + return "", fmt.Errorf("failed to fetch SSH keys from GitHub team: %w", err) } - fmt.Printf("Found %d members in team '%s'\n", len(allMembers), teamSlug) + fmt.Printf("Found %d members in team '%s'\n", len(members), teamSlug) - for _, user := range allMembers { - username := user.GetLogin() - keys, err := client.ListUserKeys(context.Background(), username) - if err != nil { - fmt.Printf("Could not fetch keys for %s: %v\n", username, err) - continue - } - - for _, key := range keys { - allKeys += fmt.Sprintf("root:%s %sroot\nubuntu:%s %subuntu\n", key.GetKey(), username, key.GetKey(), username) + allKeys := "" + for _, member := range members { + for _, key := range member.Keys { + allKeys += fmt.Sprintf("root:%s %sroot\nubuntu:%s %subuntu\n", key, member.Login, key, member.Login) } } return allKeys, nil } - -// listAllGitHubTeamMembers retrieves all members of the specified GitHub team, handling pagination to ensure all members are fetched. -func listAllGitHubTeamMembers(client GitHubClient, org string, teamSlug string) ([]*github.User, error) { - perPage := 100 - page := 1 - var allMembers []*github.User - - for { - opts := &github.TeamListTeamMembersOptions{ - ListOptions: github.ListOptions{ - Page: page, - PerPage: perPage, - }, - } - - members, err := client.ListTeamMembersBySlug(context.Background(), org, teamSlug, opts) - if err != nil { - return nil, fmt.Errorf("failed to fetch team members from GitHub: %w", err) - } - - if len(members) == 0 { - break - } - - allMembers = append(allMembers, members...) - - if len(members) < perPage { - break - } - - page++ - } - - return allMembers, nil -} diff --git a/internal/github/github_client.go b/internal/github/github_client.go index 7818f4ff1..860d3c14f 100644 --- a/internal/github/github_client.go +++ b/internal/github/github_client.go @@ -4,46 +4,174 @@ package github import ( + "bytes" "context" + "encoding/json" "fmt" + "io" + "net/http" + "strings" - "github.com/google/go-github/v90/github" "golang.org/x/oauth2" ) -// GitHubClient abstracts the GitHub API calls used to fetch team SSH keys. +const githubGraphQLEndpoint = "https://api.github.com/graphql" + +// publicKeysPageSize is how many public SSH keys we request per team member. A user is very +// unlikely to have this many keys; totalCount lets us detect and log the rare case where they do. +const publicKeysPageSize = 20 + +// teamMemberSSHKeysQuery fetches every member of a team together with their public SSH keys in a +// single request. Members are paginated with the $after cursor; publicKeys are fetched in a single +// page of publicKeysPageSize and totalCount is used to detect truncation. +const teamMemberSSHKeysQuery = `query($org: String!, $team: String!, $after: String) { + organization(login: $org) { + team(slug: $team) { + members(first: 100, after: $after) { + pageInfo { hasNextPage endCursor } + nodes { + login + publicKeys(first: 20) { totalCount nodes { key } } + } + } + } + } +}` + +// TeamMemberKeys holds a team member's login and their public SSH keys. +type TeamMemberKeys struct { + Login string + Keys []string +} + +// GitHubClient abstracts the GitHub API call used to fetch team SSH keys. // //mockery:generate: true type GitHubClient interface { - ListTeamMembersBySlug(ctx context.Context, org, teamSlug string, opts *github.TeamListTeamMembersOptions) ([]*github.User, error) - ListUserKeys(ctx context.Context, username string) ([]*github.Key, error) + GetTeamMemberSSHKeys(ctx context.Context, org, teamSlug string) ([]TeamMemberKeys, error) } type RealGitHubClient struct { - client *github.Client + httpClient *http.Client + endpoint string } // NewGitHubClient creates a new RealGitHubClient with the provided OAuth token. func NewGitHubClient(ctx context.Context, token string) (*RealGitHubClient, error) { ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) - tc := oauth2.NewClient(ctx, ts) + return &RealGitHubClient{ + httpClient: oauth2.NewClient(ctx, ts), + endpoint: githubGraphQLEndpoint, + }, nil +} - client, err := github.NewClient(github.WithHTTPClient(tc)) - if err != nil { - return nil, fmt.Errorf("creating github client: %w", err) +// graphQLResponse mirrors the shape of the teamMemberSSHKeysQuery response. +type graphQLResponse struct { + Data struct { + Organization struct { + Team struct { + Members struct { + PageInfo struct { + HasNextPage bool `json:"hasNextPage"` + EndCursor string `json:"endCursor"` + } `json:"pageInfo"` + Nodes []struct { + Login string `json:"login"` + PublicKeys struct { + TotalCount int `json:"totalCount"` + Nodes []struct { + Key string `json:"key"` + } `json:"nodes"` + } `json:"publicKeys"` + } `json:"nodes"` + } `json:"members"` + } `json:"team"` + } `json:"organization"` + } `json:"data"` + Errors []struct { + Message string `json:"message"` + } `json:"errors"` +} + +// GetTeamMemberSSHKeys fetches all members of the team and their public SSH keys via the GitHub +// GraphQL API, following member pagination until every member has been retrieved. +func (c *RealGitHubClient) GetTeamMemberSSHKeys(ctx context.Context, org, teamSlug string) ([]TeamMemberKeys, error) { + var members []TeamMemberKeys + var after *string + + for { + resp, err := c.queryTeamMembers(ctx, org, teamSlug, after) + if err != nil { + return nil, err + } + + team := resp.Data.Organization.Team + for _, node := range team.Members.Nodes { + if node.PublicKeys.TotalCount > publicKeysPageSize { + fmt.Printf("User %s has %d public keys but only the first %d were fetched\n", + node.Login, node.PublicKeys.TotalCount, publicKeysPageSize) + } + keys := make([]string, 0, len(node.PublicKeys.Nodes)) + for _, k := range node.PublicKeys.Nodes { + keys = append(keys, k.Key) + } + members = append(members, TeamMemberKeys{Login: node.Login, Keys: keys}) + } + + if !team.Members.PageInfo.HasNextPage { + break + } + cursor := team.Members.PageInfo.EndCursor + after = &cursor } - return &RealGitHubClient{client: client}, nil + return members, nil } -// ListTeamMembersBySlug lists the members of a GitHub team identified by its slug. -func (c *RealGitHubClient) ListTeamMembersBySlug(ctx context.Context, org, teamSlug string, opts *github.TeamListTeamMembersOptions) ([]*github.User, error) { - members, _, err := c.client.Teams.ListTeamMembersBySlug(ctx, org, teamSlug, opts) - return members, err -} +// queryTeamMembers executes a single page of the teamMemberSSHKeysQuery. +func (c *RealGitHubClient) queryTeamMembers(ctx context.Context, org, teamSlug string, after *string) (*graphQLResponse, error) { + variables := map[string]any{"org": org, "team": teamSlug} + if after != nil { + variables["after"] = *after + } + + body, err := json.Marshal(map[string]any{"query": teamMemberSSHKeysQuery, "variables": variables}) + if err != nil { + return nil, fmt.Errorf("failed to marshal GraphQL request: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.endpoint, bytes.NewReader(body)) + if err != nil { + return nil, fmt.Errorf("failed to create GraphQL request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + httpResp, err := c.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to execute GraphQL request: %w", err) + } + defer func() { _ = httpResp.Body.Close() }() + + respBody, err := io.ReadAll(httpResp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read GraphQL response: %w", err) + } + + if httpResp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("GraphQL request failed with status %d: %s", httpResp.StatusCode, string(respBody)) + } + + var result graphQLResponse + if err := json.Unmarshal(respBody, &result); err != nil { + return nil, fmt.Errorf("failed to unmarshal GraphQL response: %w", err) + } + if len(result.Errors) > 0 { + msgs := make([]string, len(result.Errors)) + for i, e := range result.Errors { + msgs[i] = e.Message + } + return nil, fmt.Errorf("GraphQL query returned errors: %s", strings.Join(msgs, "; ")) + } -// ListUserKeys lists the public SSH keys of a GitHub user. -func (c *RealGitHubClient) ListUserKeys(ctx context.Context, username string) ([]*github.Key, error) { - keys, _, err := c.client.Users.ListKeys(ctx, username, nil) - return keys, err + return &result, nil } diff --git a/internal/github/github_test.go b/internal/github/github_test.go index 14af1f116..cefe81630 100644 --- a/internal/github/github_test.go +++ b/internal/github/github_test.go @@ -10,8 +10,6 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/stretchr/testify/mock" - - gh "github.com/google/go-github/v90/github" ) var _ = Describe("Github", func() { @@ -30,8 +28,9 @@ var _ = Describe("Github", func() { }) It("fetches GitHub team keys", func() { - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return([]*gh.User{{Login: gh.Ptr("alice")}}, nil).Once() - mockGitHubClient.EXPECT().ListUserKeys(mock.Anything, "alice").Return([]*gh.Key{{Key: gh.Ptr("ssh-rsa AAALICE...")}}, nil).Once() + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, org, teamSlug).Return([]github.TeamMemberKeys{ + {Login: "alice", Keys: []string{"ssh-rsa AAALICE..."}}, + }, nil).Once() keys, err := github.GetSSHKeysFromGitHubTeam(mockGitHubClient, org, teamSlug) Expect(err).ToNot(HaveOccurred()) @@ -39,20 +38,21 @@ var _ = Describe("Github", func() { Expect(keys).To(ContainSubstring("ubuntu:ssh-rsa AAALICE... alice")) }) - Context("when fetching team members fails", func() { + Context("when fetching team member keys fails", func() { It("returns an error", func() { - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return(nil, fmt.Errorf("GitHub API error")).Once() + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, org, teamSlug).Return(nil, fmt.Errorf("GitHub API error")).Once() keys, err := github.GetSSHKeysFromGitHubTeam(mockGitHubClient, org, teamSlug) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list GitHub team members")) + Expect(err.Error()).To(ContainSubstring("failed to fetch SSH keys from GitHub team")) Expect(keys).To(BeEmpty()) }) }) - Context("when fetching user keys fails", func() { - It("skips the user and continues", func() { - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return([]*gh.User{{Login: gh.Ptr("alice")}}, nil).Once() - mockGitHubClient.EXPECT().ListUserKeys(mock.Anything, "alice").Return(nil, fmt.Errorf("GitHub API error")).Once() + Context("when a member has no keys", func() { + It("skips the member and continues", func() { + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, org, teamSlug).Return([]github.TeamMemberKeys{ + {Login: "alice", Keys: nil}, + }, nil).Once() keys, err := github.GetSSHKeysFromGitHubTeam(mockGitHubClient, org, teamSlug) Expect(err).ToNot(HaveOccurred()) Expect(keys).To(BeEmpty()) @@ -61,31 +61,24 @@ var _ = Describe("Github", func() { Context("when team has no members", func() { It("returns an empty string", func() { - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return([]*gh.User{}, nil).Once() + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, org, teamSlug).Return([]github.TeamMemberKeys{}, nil).Once() keys, err := github.GetSSHKeysFromGitHubTeam(mockGitHubClient, org, teamSlug) Expect(err).ToNot(HaveOccurred()) Expect(keys).To(BeEmpty()) }) }) - Context("when team has more than 100 members", func() { - It("handles pagination correctly", func() { - // Simulate 150 members to trigger pagination - membersPage1 := make([]*gh.User, 100) - for i := 0; i < 100; i++ { - membersPage1[i] = &gh.User{Login: gh.Ptr(fmt.Sprintf("user%d", i+1))} - } - membersPage2 := make([]*gh.User, 50) - for i := 0; i < 50; i++ { - membersPage2[i] = &gh.User{Login: gh.Ptr(fmt.Sprintf("user%d", i+101))} + Context("when the team has many members", func() { + It("formats keys for every member", func() { + members := make([]github.TeamMemberKeys, 150) + for i := 0; i < 150; i++ { + members[i] = github.TeamMemberKeys{ + Login: fmt.Sprintf("user%d", i+1), + Keys: []string{fmt.Sprintf("ssh-rsa AAAUSER%d...", i+1)}, + } } - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return(membersPage1, nil).Once() - mockGitHubClient.EXPECT().ListTeamMembersBySlug(mock.Anything, org, teamSlug, mock.Anything).Return(membersPage2, nil).Once() - - for i := 1; i <= 150; i++ { - mockGitHubClient.EXPECT().ListUserKeys(mock.Anything, fmt.Sprintf("user%d", i)).Return([]*gh.Key{{Key: gh.Ptr(fmt.Sprintf("ssh-rsa AAAUSER%d...", i))}}, nil).Once() - } + mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, org, teamSlug).Return(members, nil).Once() keys, err := github.GetSSHKeysFromGitHubTeam(mockGitHubClient, org, teamSlug) Expect(err).ToNot(HaveOccurred()) diff --git a/internal/github/mocks.go b/internal/github/mocks.go index ca364663d..a8e952879 100644 --- a/internal/github/mocks.go +++ b/internal/github/mocks.go @@ -6,7 +6,6 @@ package github import ( "context" - "github.com/google/go-github/v90/github" mock "github.com/stretchr/testify/mock" ) @@ -37,49 +36,48 @@ func (_m *MockGitHubClient) EXPECT() *MockGitHubClient_Expecter { return &MockGitHubClient_Expecter{mock: &_m.Mock} } -// ListTeamMembersBySlug provides a mock function for the type MockGitHubClient -func (_mock *MockGitHubClient) ListTeamMembersBySlug(ctx context.Context, org string, teamSlug string, opts *github.TeamListTeamMembersOptions) ([]*github.User, error) { - ret := _mock.Called(ctx, org, teamSlug, opts) +// GetTeamMemberSSHKeys provides a mock function for the type MockGitHubClient +func (_mock *MockGitHubClient) GetTeamMemberSSHKeys(ctx context.Context, org string, teamSlug string) ([]TeamMemberKeys, error) { + ret := _mock.Called(ctx, org, teamSlug) if len(ret) == 0 { - panic("no return value specified for ListTeamMembersBySlug") + panic("no return value specified for GetTeamMemberSSHKeys") } - var r0 []*github.User + var r0 []TeamMemberKeys var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string, string, *github.TeamListTeamMembersOptions) ([]*github.User, error)); ok { - return returnFunc(ctx, org, teamSlug, opts) + if returnFunc, ok := ret.Get(0).(func(context.Context, string, string) ([]TeamMemberKeys, error)); ok { + return returnFunc(ctx, org, teamSlug) } - if returnFunc, ok := ret.Get(0).(func(context.Context, string, string, *github.TeamListTeamMembersOptions) []*github.User); ok { - r0 = returnFunc(ctx, org, teamSlug, opts) + if returnFunc, ok := ret.Get(0).(func(context.Context, string, string) []TeamMemberKeys); ok { + r0 = returnFunc(ctx, org, teamSlug) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*github.User) + r0 = ret.Get(0).([]TeamMemberKeys) } } - if returnFunc, ok := ret.Get(1).(func(context.Context, string, string, *github.TeamListTeamMembersOptions) error); ok { - r1 = returnFunc(ctx, org, teamSlug, opts) + if returnFunc, ok := ret.Get(1).(func(context.Context, string, string) error); ok { + r1 = returnFunc(ctx, org, teamSlug) } else { r1 = ret.Error(1) } return r0, r1 } -// MockGitHubClient_ListTeamMembersBySlug_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListTeamMembersBySlug' -type MockGitHubClient_ListTeamMembersBySlug_Call struct { +// MockGitHubClient_GetTeamMemberSSHKeys_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTeamMemberSSHKeys' +type MockGitHubClient_GetTeamMemberSSHKeys_Call struct { *mock.Call } -// ListTeamMembersBySlug is a helper method to define mock.On call +// GetTeamMemberSSHKeys is a helper method to define mock.On call // - ctx context.Context // - org string // - teamSlug string -// - opts *github.TeamListTeamMembersOptions -func (_e *MockGitHubClient_Expecter) ListTeamMembersBySlug(ctx any, org any, teamSlug any, opts any) *MockGitHubClient_ListTeamMembersBySlug_Call { - return &MockGitHubClient_ListTeamMembersBySlug_Call{Call: _e.mock.On("ListTeamMembersBySlug", ctx, org, teamSlug, opts)} +func (_e *MockGitHubClient_Expecter) GetTeamMemberSSHKeys(ctx any, org any, teamSlug any) *MockGitHubClient_GetTeamMemberSSHKeys_Call { + return &MockGitHubClient_GetTeamMemberSSHKeys_Call{Call: _e.mock.On("GetTeamMemberSSHKeys", ctx, org, teamSlug)} } -func (_c *MockGitHubClient_ListTeamMembersBySlug_Call) Run(run func(ctx context.Context, org string, teamSlug string, opts *github.TeamListTeamMembersOptions)) *MockGitHubClient_ListTeamMembersBySlug_Call { +func (_c *MockGitHubClient_GetTeamMemberSSHKeys_Call) Run(run func(ctx context.Context, org string, teamSlug string)) *MockGitHubClient_GetTeamMemberSSHKeys_Call { _c.Call.Run(func(args mock.Arguments) { var arg0 context.Context if args[0] != nil { @@ -93,94 +91,21 @@ func (_c *MockGitHubClient_ListTeamMembersBySlug_Call) Run(run func(ctx context. if args[2] != nil { arg2 = args[2].(string) } - var arg3 *github.TeamListTeamMembersOptions - if args[3] != nil { - arg3 = args[3].(*github.TeamListTeamMembersOptions) - } run( arg0, arg1, arg2, - arg3, - ) - }) - return _c -} - -func (_c *MockGitHubClient_ListTeamMembersBySlug_Call) Return(users []*github.User, err error) *MockGitHubClient_ListTeamMembersBySlug_Call { - _c.Call.Return(users, err) - return _c -} - -func (_c *MockGitHubClient_ListTeamMembersBySlug_Call) RunAndReturn(run func(ctx context.Context, org string, teamSlug string, opts *github.TeamListTeamMembersOptions) ([]*github.User, error)) *MockGitHubClient_ListTeamMembersBySlug_Call { - _c.Call.Return(run) - return _c -} - -// ListUserKeys provides a mock function for the type MockGitHubClient -func (_mock *MockGitHubClient) ListUserKeys(ctx context.Context, username string) ([]*github.Key, error) { - ret := _mock.Called(ctx, username) - - if len(ret) == 0 { - panic("no return value specified for ListUserKeys") - } - - var r0 []*github.Key - var r1 error - if returnFunc, ok := ret.Get(0).(func(context.Context, string) ([]*github.Key, error)); ok { - return returnFunc(ctx, username) - } - if returnFunc, ok := ret.Get(0).(func(context.Context, string) []*github.Key); ok { - r0 = returnFunc(ctx, username) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*github.Key) - } - } - if returnFunc, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = returnFunc(ctx, username) - } else { - r1 = ret.Error(1) - } - return r0, r1 -} - -// MockGitHubClient_ListUserKeys_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListUserKeys' -type MockGitHubClient_ListUserKeys_Call struct { - *mock.Call -} - -// ListUserKeys is a helper method to define mock.On call -// - ctx context.Context -// - username string -func (_e *MockGitHubClient_Expecter) ListUserKeys(ctx any, username any) *MockGitHubClient_ListUserKeys_Call { - return &MockGitHubClient_ListUserKeys_Call{Call: _e.mock.On("ListUserKeys", ctx, username)} -} - -func (_c *MockGitHubClient_ListUserKeys_Call) Run(run func(ctx context.Context, username string)) *MockGitHubClient_ListUserKeys_Call { - _c.Call.Run(func(args mock.Arguments) { - var arg0 context.Context - if args[0] != nil { - arg0 = args[0].(context.Context) - } - var arg1 string - if args[1] != nil { - arg1 = args[1].(string) - } - run( - arg0, - arg1, ) }) return _c } -func (_c *MockGitHubClient_ListUserKeys_Call) Return(keys []*github.Key, err error) *MockGitHubClient_ListUserKeys_Call { - _c.Call.Return(keys, err) +func (_c *MockGitHubClient_GetTeamMemberSSHKeys_Call) Return(teamMemberKeyss []TeamMemberKeys, err error) *MockGitHubClient_GetTeamMemberSSHKeys_Call { + _c.Call.Return(teamMemberKeyss, err) return _c } -func (_c *MockGitHubClient_ListUserKeys_Call) RunAndReturn(run func(ctx context.Context, username string) ([]*github.Key, error)) *MockGitHubClient_ListUserKeys_Call { +func (_c *MockGitHubClient_GetTeamMemberSSHKeys_Call) RunAndReturn(run func(ctx context.Context, org string, teamSlug string) ([]TeamMemberKeys, error)) *MockGitHubClient_GetTeamMemberSSHKeys_Call { _c.Call.Return(run) return _c } diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 4e52b3eca..8b821a2eb 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -693,12 +693,6 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE ----------- -Module: github.com/google/go-github/v90/github -Version: v90.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE - ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 From ce0a1c436a94767b2af20910151d8cb4e4c18c9f Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:07:27 +0000 Subject: [PATCH 066/132] update(deps): update module google.golang.org/api to v0.294.0 (#745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/api](https://redirect.github.com/googleapis/google-api-go-client) | `v0.293.0` → `v0.294.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fapi/v0.294.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fapi/v0.293.0/v0.294.0?slim=true) | --- ### Release Notes
googleapis/google-api-go-client (google.golang.org/api) ### [`v0.294.0`](https://redirect.github.com/googleapis/google-api-go-client/releases/tag/v0.294.0) [Compare Source](https://redirect.github.com/googleapis/google-api-go-client/compare/v0.293.0...v0.294.0) ##### Features - **all:** Auto-regenerate discovery clients ([#​3698](https://redirect.github.com/googleapis/google-api-go-client/issues/3698)) ([9fb32c5](https://redirect.github.com/googleapis/google-api-go-client/commit/9fb32c591570b048783408ec59a3aa9d7b632846)) - **all:** Auto-regenerate discovery clients ([#​3700](https://redirect.github.com/googleapis/google-api-go-client/issues/3700)) ([dafe95e](https://redirect.github.com/googleapis/google-api-go-client/commit/dafe95ef3bda0b221314fb5ac712c9111d7723d3)) - **all:** Auto-regenerate discovery clients ([#​3701](https://redirect.github.com/googleapis/google-api-go-client/issues/3701)) ([e4ac6fd](https://redirect.github.com/googleapis/google-api-go-client/commit/e4ac6fdf24fc9b079162071d13e96d5d9556945a)) - **all:** Auto-regenerate discovery clients ([#​3702](https://redirect.github.com/googleapis/google-api-go-client/issues/3702)) ([9e504ef](https://redirect.github.com/googleapis/google-api-go-client/commit/9e504ef71d3d0fa8d982cef0d031c30c443a94d7)) - **all:** Auto-regenerate discovery clients ([#​3703](https://redirect.github.com/googleapis/google-api-go-client/issues/3703)) ([8da327e](https://redirect.github.com/googleapis/google-api-go-client/commit/8da327e145488b70c320b622cf8952c6feef3386)) - **all:** Auto-regenerate discovery clients ([#​3705](https://redirect.github.com/googleapis/google-api-go-client/issues/3705)) ([dd3cd17](https://redirect.github.com/googleapis/google-api-go-client/commit/dd3cd1778654196afe83360b535d99fe070ef97a)) - **all:** Auto-regenerate discovery clients ([#​3706](https://redirect.github.com/googleapis/google-api-go-client/issues/3706)) ([da5c878](https://redirect.github.com/googleapis/google-api-go-client/commit/da5c87868a76c1e28b21e12a5e509155a5493d68)) - **all:** Auto-regenerate discovery clients ([#​3707](https://redirect.github.com/googleapis/google-api-go-client/issues/3707)) ([9669a32](https://redirect.github.com/googleapis/google-api-go-client/commit/9669a3239033bed33cde9771d7420273e464b05d)) - **all:** Auto-regenerate discovery clients ([#​3708](https://redirect.github.com/googleapis/google-api-go-client/issues/3708)) ([0869dfb](https://redirect.github.com/googleapis/google-api-go-client/commit/0869dfbfe7ffc45e2792a1c68bb93277558d7193)) - **all:** Auto-regenerate discovery clients ([#​3709](https://redirect.github.com/googleapis/google-api-go-client/issues/3709)) ([793ae6a](https://redirect.github.com/googleapis/google-api-go-client/commit/793ae6a8f205f017007482efc0791fa619ff5bf0)) - **all:** Auto-regenerate discovery clients ([#​3710](https://redirect.github.com/googleapis/google-api-go-client/issues/3710)) ([0084468](https://redirect.github.com/googleapis/google-api-go-client/commit/0084468843d65b1620da73d8263bf7d2ffb18bbd)) - **all:** Auto-regenerate discovery clients ([#​3711](https://redirect.github.com/googleapis/google-api-go-client/issues/3711)) ([e6b9fe3](https://redirect.github.com/googleapis/google-api-go-client/commit/e6b9fe37272281e8362f8f0494dd6f55839cc146)) - **all:** Auto-regenerate discovery clients ([#​3712](https://redirect.github.com/googleapis/google-api-go-client/issues/3712)) ([d1bcd4b](https://redirect.github.com/googleapis/google-api-go-client/commit/d1bcd4b3c5cfe9936982aa91d3a05c1aaf082094)) - **all:** Auto-regenerate discovery clients ([#​3713](https://redirect.github.com/googleapis/google-api-go-client/issues/3713)) ([0e513f7](https://redirect.github.com/googleapis/google-api-go-client/commit/0e513f755761be9adb93856a3fff5daae65c468d)) - **all:** Auto-regenerate discovery clients ([#​3714](https://redirect.github.com/googleapis/google-api-go-client/issues/3714)) ([8bd6313](https://redirect.github.com/googleapis/google-api-go-client/commit/8bd631313f8127ce2d1656138fd12578f5f415bc))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 20 ++++++++++---------- go.mod | 9 ++++----- go.sum | 18 ++++++++---------- internal/tmpl/NOTICE | 20 ++++++++++---------- 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/NOTICE b/NOTICE index 8b821a2eb..d25d46a3d 100644 --- a/NOTICE +++ b/NOTICE @@ -11,9 +11,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/artifactregistry ---------- Module: cloud.google.com/go/auth -Version: v0.23.0 +Version: v0.23.2 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/auth/v0.23.0/auth/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/auth/v0.23.2/auth/LICENSE ---------- Module: cloud.google.com/go/auth/oauth2adapt @@ -725,9 +725,9 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. ---------- Module: github.com/googleapis/gax-go/v2 -Version: v2.23.0 +Version: v2.24.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.24.0/v2/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1517,15 +1517,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.293.0 +Version: v0.294.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.293.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.293.0 +Version: v0.294.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.293.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis @@ -1541,9 +1541,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/e059f2f05d78/googlea ---------- Module: google.golang.org/genproto/googleapis/rpc -Version: v0.0.0-20260807164820-c8921c73eeea +Version: v0.0.0-20260819154853-08b0e4226688 License: Apache-2.0 -License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googleapis/rpc/LICENSE +License URL: https://github.com/googleapis/go-genproto/blob/08b0e4226688/googleapis/rpc/LICENSE ---------- Module: google.golang.org/grpc diff --git a/go.mod b/go.mod index 475e0c2ff..434b7db2d 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,6 @@ require ( github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/google/go-containerregistry v0.22.0 - github.com/google/go-github/v90 v90.0.0 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible @@ -55,7 +54,7 @@ require ( golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 - google.golang.org/api v0.293.0 + google.golang.org/api v0.294.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 @@ -75,7 +74,7 @@ require ( cel.dev/expr v0.25.2 // indirect charm.land/lipgloss/v2 v2.0.6 // indirect cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.23.0 // indirect + cloud.google.com/go/auth v0.23.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/kms v1.33.0 // indirect @@ -359,7 +358,7 @@ require ( github.com/google/uuid v1.6.1-0.20241114170450-2d3c2a9cc518 // indirect github.com/google/wire v0.7.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.20 // indirect - github.com/googleapis/gax-go/v2 v2.23.0 // indirect + github.com/googleapis/gax-go/v2 v2.24.0 // indirect github.com/gordonklaus/ineffassign v0.2.0 // indirect github.com/goreleaser/chglog v0.7.4 // indirect github.com/goreleaser/fileglob v1.4.0 // indirect @@ -645,7 +644,7 @@ require ( gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto v0.0.0-20260720171339-e059f2f05d78 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260720171339-e059f2f05d78 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 7f99a31a9..3f06bf9b5 100644 --- a/go.sum +++ b/go.sum @@ -368,8 +368,8 @@ cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/ cloud.google.com/go/auth v0.14.0/go.mod h1:CYsoRL1PdiDuqeQpZE0bP2pnPrGqFcOkI0nldEQis+A= cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= -cloud.google.com/go/auth v0.23.0 h1:6Gg1CMgpgubRG7DGz5Vf1pcoNo8RfiRiRAPS4crTp54= -cloud.google.com/go/auth v0.23.0/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= +cloud.google.com/go/auth v0.23.2 h1:pxSCpfiji41hpzpPdMCftEUCezpgpqmmDdYiAjCKXxo= +cloud.google.com/go/auth v0.23.2/go.mod h1:4DhBRcqvtljQN3dJ57qtqbib5ZGCYE5f2crfiiC2EM0= cloud.google.com/go/auth/oauth2adapt v0.2.1/go.mod h1:tOdK/k+D2e4GEwfBRA48dKNQiDsqIXxLh7VU319eV0g= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I= @@ -3811,8 +3811,6 @@ github.com/google/go-github/v88 v88.0.0 h1:dZA9IKkPK1eXZj4ypngnpRj5FwdpTv4whix2P github.com/google/go-github/v88 v88.0.0/go.mod h1:rufTDgn2N45wjhukLTyxmvc9nilSp3mr3Rgtt6b1MPw= github.com/google/go-github/v89 v89.0.0 h1:35bEK5XoEcF3PZrlVbl9XN63f5BcJRA/UGkxeC9xPg0= github.com/google/go-github/v89 v89.0.0/go.mod h1:QLcbU0ipeAqQuR5KSg8c2lql4Qk1EwJ2dWz/0rP4Nho= -github.com/google/go-github/v90 v90.0.0 h1:EnX9HvTfqvuJbUSWu1/jLrYH6JJLMz0w0qfQVbTxPzE= -github.com/google/go-github/v90 v90.0.0/go.mod h1:pLzt1FZURZyoTHT5/Z1UQY3b9fYyrbXH6aj7X+qgID4= github.com/google/go-licenses/v2 v2.0.1 h1:ti+9bi5o7DKbeeg5eBb/uZTgsaPNoJaLCh93cRcXsW8= github.com/google/go-licenses/v2 v2.0.1/go.mod h1:efibo0EDNGkau6AIMOViGW+rTNPudhxX9rCxtfw5zKE= github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= @@ -3928,8 +3926,8 @@ github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3Vcf github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= -github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= -github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= +github.com/googleapis/gax-go/v2 v2.24.0 h1:myMaPYyF9MecEmvQqMqomIwn9t/4KCZN9qnwsS76wlg= +github.com/googleapis/gax-go/v2 v2.24.0/go.mod h1:IaTHBDd7NHxSCiu0vEs8pQZu4dGZrWwuSoxCnk16OFM= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -6259,8 +6257,8 @@ google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1Gk google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/api v0.293.0 h1:p9XIWOf63U4OgYx120ZwVU8+vl4XTPmWfgVPnmOAS9w= -google.golang.org/api v0.293.0/go.mod h1:6n5tjEB1gzwniZTepZ0g5u+wM7Bof5GeULCx/zh8ZE0= +google.golang.org/api v0.294.0 h1:8gASjJxdtcIieB3OqbkLcF0FfbXVNqKtU5iozD1ssvA= +google.golang.org/api v0.294.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -6689,8 +6687,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688 h1:cYNAzI2sUwhmCcoj9TxvihSrqsxt6uIkj3rDRhSDmW4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 8b821a2eb..d25d46a3d 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -11,9 +11,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/artifactregistry ---------- Module: cloud.google.com/go/auth -Version: v0.23.0 +Version: v0.23.2 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/auth/v0.23.0/auth/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/auth/v0.23.2/auth/LICENSE ---------- Module: cloud.google.com/go/auth/oauth2adapt @@ -725,9 +725,9 @@ License URL: https://github.com/googleapis/enterprise-certificate-proxy/blob/v0. ---------- Module: github.com/googleapis/gax-go/v2 -Version: v2.23.0 +Version: v2.24.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/gax-go/blob/v2.23.0/v2/LICENSE +License URL: https://github.com/googleapis/gax-go/blob/v2.24.0/v2/LICENSE ---------- Module: github.com/gorilla/websocket @@ -1517,15 +1517,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.293.0 +Version: v0.294.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.293.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.293.0 +Version: v0.294.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.293.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis @@ -1541,9 +1541,9 @@ License URL: https://github.com/googleapis/go-genproto/blob/e059f2f05d78/googlea ---------- Module: google.golang.org/genproto/googleapis/rpc -Version: v0.0.0-20260807164820-c8921c73eeea +Version: v0.0.0-20260819154853-08b0e4226688 License: Apache-2.0 -License URL: https://github.com/googleapis/go-genproto/blob/c8921c73eeea/googleapis/rpc/LICENSE +License URL: https://github.com/googleapis/go-genproto/blob/08b0e4226688/googleapis/rpc/LICENSE ---------- Module: google.golang.org/grpc From 80631df342247a4d1f23a5aa817d41e5309eec80 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:02:06 +0000 Subject: [PATCH 067/132] update(deps): update module k8s.io/cri-streaming to v0.37.0 (#748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/cri-streaming](https://redirect.github.com/kubernetes/cri-streaming) | `v0.36.4` → `v0.37.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fcri-streaming/v0.37.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fcri-streaming/v0.36.4/v0.37.0?slim=true) | --- ### Release Notes
kubernetes/cri-streaming (k8s.io/cri-streaming) ### [`v0.37.0`](https://redirect.github.com/kubernetes/cri-streaming/compare/v0.36.4...v0.37.0) [Compare Source](https://redirect.github.com/kubernetes/cri-streaming/compare/v0.36.4...v0.37.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 434b7db2d..a6f09337a 100644 --- a/go.mod +++ b/go.mod @@ -720,6 +720,6 @@ replace ( k8s.io/sample-controller => k8s.io/sample-controller v0.36.4 ) -replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.36.4 +replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.37.0 replace k8s.io/streaming => k8s.io/streaming v0.36.4 From 489fce8254a50e97136aaf3cf4aa89146b47d088 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 01:01:49 +0000 Subject: [PATCH 068/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.32.0 (#747) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.31.0` → `v1.32.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.32.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.31.0/v1.32.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.32.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.32.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.31.0...v1.32.0) #### Changelog - [`f50197f`](https://redirect.github.com/codesphere-cloud/cs-go/commit/f50197fb7887a73facd55d035d77e12cbb588339) update(deps): update kubernetes monorepo to v0.37.0 ([#​318](https://redirect.github.com/codesphere-cloud/cs-go/issues/318)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 38 ++++++++++++++++---------------------- go.mod | 19 +++++++++---------- go.sum | 26 ++++++++++++-------------- internal/tmpl/NOTICE | 38 ++++++++++++++++---------------------- 4 files changed, 53 insertions(+), 68 deletions(-) diff --git a/NOTICE b/NOTICE index d25d46a3d..6e9cbb7de 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.31.0 +Version: v1.32.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.31.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.32.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -539,15 +539,15 @@ License URL: https://github.com/go-openapi/jsonreference/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/swag -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/v0.26.1/LICENSE +License URL: https://github.com/go-openapi/swag/blob/v0.27.1/LICENSE ---------- Module: github.com/go-openapi/swag/cmdutils -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.26.1/cmdutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.27.1/cmdutils/LICENSE ---------- Module: github.com/go-openapi/swag/conv @@ -561,12 +561,6 @@ Version: v0.27.3 License: Apache-2.0 License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.27.3/fileutils/LICENSE ----------- -Module: github.com/go-openapi/swag/jsonname -Version: v0.26.1 -License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/jsonname/v0.26.1/jsonname/LICENSE - ---------- Module: github.com/go-openapi/swag/jsonutils Version: v0.27.3 @@ -587,9 +581,9 @@ License URL: https://github.com/go-openapi/swag/blob/mangling/v0.27.3/mangling/L ---------- Module: github.com/go-openapi/swag/netutils -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/netutils/v0.26.1/netutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/netutils/v0.27.1/netutils/LICENSE ---------- Module: github.com/go-openapi/swag/pools @@ -1685,21 +1679,21 @@ License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kube-openapi/pkg -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/LICENSE ---------- Module: k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: BSD-3-Clause -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/internal/third_party/go-json-experiment/json/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/pkg/internal/third_party/go-json-experiment/json/LICENSE ---------- Module: k8s.io/kube-openapi/pkg/validation/spec -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/validation/spec/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/pkg/validation/spec/LICENSE ---------- Module: k8s.io/kubectl/pkg @@ -1781,9 +1775,9 @@ License URL: https://github.com/kubernetes-sigs/randfill/blob/v1.0.0/LICENSE ---------- Module: sigs.k8s.io/structured-merge-diff/v6 -Version: v6.4.0 +Version: v6.4.2 License: Apache-2.0 -License URL: https://github.com/kubernetes-sigs/structured-merge-diff/blob/v6.4.0/LICENSE +License URL: https://github.com/kubernetes-sigs/structured-merge-diff/blob/v6.4.2/LICENSE ---------- Module: sigs.k8s.io/yaml diff --git a/go.mod b/go.mod index a6f09337a..e26a1160c 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.1 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.31.0 + github.com/codesphere-cloud/cs-go v1.32.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 @@ -59,8 +59,8 @@ require ( google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v4 v4.2.4 - k8s.io/api v0.36.4 - k8s.io/apimachinery v0.36.4 + k8s.io/api v0.37.0 + k8s.io/apimachinery v0.37.0 k8s.io/client-go v12.0.0+incompatible k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 sigs.k8s.io/controller-runtime v0.24.1 @@ -295,15 +295,14 @@ require ( github.com/go-openapi/runtime/server-middleware v0.32.3 // indirect github.com/go-openapi/spec v0.22.9 // indirect github.com/go-openapi/strfmt v0.27.0 // indirect - github.com/go-openapi/swag v0.26.1 // indirect - github.com/go-openapi/swag/cmdutils v0.26.1 // indirect + github.com/go-openapi/swag v0.27.1 // indirect + github.com/go-openapi/swag/cmdutils v0.27.1 // indirect github.com/go-openapi/swag/conv v0.27.3 // indirect github.com/go-openapi/swag/fileutils v0.27.3 // indirect - github.com/go-openapi/swag/jsonname v0.26.1 // indirect github.com/go-openapi/swag/jsonutils v0.27.3 // indirect github.com/go-openapi/swag/loading v0.27.3 // indirect github.com/go-openapi/swag/mangling v0.27.3 // indirect - github.com/go-openapi/swag/netutils v0.26.1 // indirect + github.com/go-openapi/swag/netutils v0.27.1 // indirect github.com/go-openapi/swag/pools v0.27.3 // indirect github.com/go-openapi/swag/stringutils v0.27.3 // indirect github.com/go-openapi/swag/typeutils v0.27.3 // indirect @@ -655,13 +654,13 @@ require ( honnef.co/go/tools v0.8.0 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect k8s.io/apiserver v0.36.4 // indirect - k8s.io/cli-runtime v0.36.4 // indirect + k8s.io/cli-runtime v0.37.0 // indirect k8s.io/component-base v0.36.4 // indirect k8s.io/component-helpers v0.36.4 // indirect k8s.io/controller-manager v0.36.1 // indirect k8s.io/klog/v2 v2.140.0 // indirect k8s.io/kube-aggregator v0.36.1 // indirect - k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 // indirect + k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad // indirect k8s.io/kubectl v0.36.1 // indirect k8s.io/kubernetes v1.36.1 // indirect k8s.io/streaming v0.36.4 // indirect @@ -674,7 +673,7 @@ require ( sigs.k8s.io/kustomize/api v0.21.1 // indirect sigs.k8s.io/kustomize/kyaml v0.21.1 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect software.sslmate.com/src/go-pkcs12 v0.7.3 // indirect ) diff --git a/go.sum b/go.sum index 3f06bf9b5..9272e7f2f 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.31.0 h1:VL2sheS8+OtOdkm93FMbOm7oXJJNeGK8kv8s5I3ebhk= -github.com/codesphere-cloud/cs-go v1.31.0/go.mod h1:GfXpquo56IOBvkx5u0Tpq7KXsU3xn8+1Chzpqpsm/bE= +github.com/codesphere-cloud/cs-go v1.32.0 h1:A1hjWzVD7D5Oe6RgOHwcqBBANOwaAkywH3ceLmAgJEs= +github.com/codesphere-cloud/cs-go v1.32.0/go.mod h1:84IkBWiJlYjmxx0+ysJEeivGXFgj0KJFFM77OkTiee0= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -3561,16 +3561,14 @@ github.com/go-openapi/strfmt v0.27.0/go.mod h1:s/qhDqfY72irigXUGJmtgid2Rm+3tnz3k github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-openapi/swag v0.26.1 h1:l5sVEyVpwj+DDYeZyo7wQI/Ebn/mKYIyGB/pFwAfGoQ= -github.com/go-openapi/swag v0.26.1/go.mod h1:yNY38BbIVthxbkDtq1UHBCGasBqjakW3lCR6ANzdBEw= -github.com/go-openapi/swag/cmdutils v0.26.1 h1:f2iE1ijYaJ3nuu5PaEMx3zpEhzhZFgivCJObWEObLIQ= -github.com/go-openapi/swag/cmdutils v0.26.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag v0.27.1 h1:VotvOLWW8q/EAxB0YdsBBGC8XYyeL1YwBj2ungAGPNg= +github.com/go-openapi/swag v0.27.1/go.mod h1:GTkJPwHfhJp6MWr4/rCh64HVI3Ofu+tcsbfjfHmTxpE= +github.com/go-openapi/swag/cmdutils v0.27.1 h1:I7sYqaWVl5mq0NEmNQkAmFDyNin9ufvMX/p2zwtQaOE= +github.com/go-openapi/swag/cmdutils v0.27.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= github.com/go-openapi/swag/conv v0.27.3 h1:iqJFmGEjmX3AY0lSszABFqRVqOSt99XS0LzNIMJYuhU= github.com/go-openapi/swag/conv v0.27.3/go.mod h1:nPRmN6jgNme99hpf+nM0auDZGALWIqlwhisKPK/bQhQ= github.com/go-openapi/swag/fileutils v0.27.3 h1:3UVoZ2RLaIs1lt+2jcKzL8RM3Yk0rmsDE9FLA/HGxFE= github.com/go-openapi/swag/fileutils v0.27.3/go.mod h1:VvJFZLTZS0AI854gEQz5tk7dBESdLjiNUMSZ/th2ry8= -github.com/go-openapi/swag/jsonname v0.26.1 h1:VReupaV6WxlAsCn0e4DUfgV6bPmINnPpyJDLqSfNPcE= -github.com/go-openapi/swag/jsonname v0.26.1/go.mod h1:OvdW6BoWoj33pTfi7x9vFrgmT+fk7aw0BRwvCE0YOuc= github.com/go-openapi/swag/jsonutils v0.27.3 h1:1DEz+O82frtSMBcos/7XIn1GnpNTbsD4Bru4Dc/uhRc= github.com/go-openapi/swag/jsonutils v0.27.3/go.mod h1:qiDCoQvzkMxrV3G8FLEdIU5L+EFYc0zcDOHWT3Yofvo= github.com/go-openapi/swag/jsonutils/fixtures_test v0.27.3 h1:h/eT9kmGCDdFLJF29lOhzLtF0FmP1AX2MhLJWVebsb8= @@ -3579,8 +3577,8 @@ github.com/go-openapi/swag/loading v0.27.3 h1:L9nQkEgzU7QgFQL+pLEMfGUKxeM4pWwGwb github.com/go-openapi/swag/loading v0.27.3/go.mod h1:rJ0NeaKsF4CVPnMGjPQl7JlSHzvD0bc2DKXLss1hiuE= github.com/go-openapi/swag/mangling v0.27.3 h1:gRzzD1PAUoLTtGMgI3KpBmCSOlTuLTFWnviLxLcTnyg= github.com/go-openapi/swag/mangling v0.27.3/go.mod h1:jtBE2+V+3pILxOR7Vgce+Cwp6A2PgZbvVqfNntbVs0w= -github.com/go-openapi/swag/netutils v0.26.1 h1:BNctoc39WTAUMxyAs355fExOPzMZtPbZ0ZZ1Am2FR5M= -github.com/go-openapi/swag/netutils v0.26.1/go.mod h1:y02vByhZhQPAVwOX+0KipXFZ/hUbk6G/Enhf5rGaOkQ= +github.com/go-openapi/swag/netutils v0.27.1 h1:mICMFoS82F5TZ4Zy3cqmcQk+BFeCp3Uyq3Np7GI0/qU= +github.com/go-openapi/swag/netutils v0.27.1/go.mod h1:J+WYyFMLtvtCGqa6jLv+YNUmIKI3ZRQRrvfNDMoQoEQ= github.com/go-openapi/swag/pools v0.27.3 h1:gXjImP3F6/56wRRcFgEPld084Y6u2gs21ikPBt8NKBk= github.com/go-openapi/swag/pools v0.27.3/go.mod h1:kVQefhSK5RWuRe7BXsL8htgBPAMpN7HDGpGEknqugeE= github.com/go-openapi/swag/stringutils v0.27.3 h1:Ru28hnbAvN5wycALQYy8IobHvASq+FUFMlp1QzLM0JI= @@ -6922,8 +6920,8 @@ k8s.io/kube-aggregator v0.36.4/go.mod h1:05q7hjy8iKStLM1e+BOQ8mMVPnIfAqfpkhZDPGx k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= -k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25 h1:mPMaPMpBij2V1Wv/fR+HW124vVGXXvOSS9ver/9yjWs= -k8s.io/kube-openapi v0.0.0-20260603220949-865597e52e25/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad h1:oXImqH8mQNk7PmvzKhmN3ddJoY6OnyM225MXwGHPm0A= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad/go.mod h1:0/mqHCVhlumdJ3BhCfnjSZQE037nAhNodh1/hK0T8/I= k8s.io/kubectl v0.36.4 h1:xZd9g1bFBd7hpb1oKjK8lT9jRL18dtgr4DAPQG1Oksk= k8s.io/kubectl v0.36.4/go.mod h1:STWlr78cdEa1hHpr55wpcboaqchvfDueKRNDa1zOd1w= k8s.io/kubelet v0.36.4 h1:mlmXnkrq3H02r/r0H/8M2jdPY7f4I4u4cA0tHnsPzY0= @@ -7033,8 +7031,8 @@ sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxO sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/structured-merge-diff/v6 v6.2.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/structured-merge-diff/v6 v6.3.3/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= -sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index d25d46a3d..6e9cbb7de 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.31.0 +Version: v1.32.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.31.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.32.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -539,15 +539,15 @@ License URL: https://github.com/go-openapi/jsonreference/blob/v1.0.0/LICENSE ---------- Module: github.com/go-openapi/swag -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/v0.26.1/LICENSE +License URL: https://github.com/go-openapi/swag/blob/v0.27.1/LICENSE ---------- Module: github.com/go-openapi/swag/cmdutils -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.26.1/cmdutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/cmdutils/v0.27.1/cmdutils/LICENSE ---------- Module: github.com/go-openapi/swag/conv @@ -561,12 +561,6 @@ Version: v0.27.3 License: Apache-2.0 License URL: https://github.com/go-openapi/swag/blob/fileutils/v0.27.3/fileutils/LICENSE ----------- -Module: github.com/go-openapi/swag/jsonname -Version: v0.26.1 -License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/jsonname/v0.26.1/jsonname/LICENSE - ---------- Module: github.com/go-openapi/swag/jsonutils Version: v0.27.3 @@ -587,9 +581,9 @@ License URL: https://github.com/go-openapi/swag/blob/mangling/v0.27.3/mangling/L ---------- Module: github.com/go-openapi/swag/netutils -Version: v0.26.1 +Version: v0.27.1 License: Apache-2.0 -License URL: https://github.com/go-openapi/swag/blob/netutils/v0.26.1/netutils/LICENSE +License URL: https://github.com/go-openapi/swag/blob/netutils/v0.27.1/netutils/LICENSE ---------- Module: github.com/go-openapi/swag/pools @@ -1685,21 +1679,21 @@ License URL: https://github.com/kubernetes/kube-aggregator/blob/v0.36.4/LICENSE ---------- Module: k8s.io/kube-openapi/pkg -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/LICENSE ---------- Module: k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: BSD-3-Clause -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/internal/third_party/go-json-experiment/json/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/pkg/internal/third_party/go-json-experiment/json/LICENSE ---------- Module: k8s.io/kube-openapi/pkg/validation/spec -Version: v0.0.0-20260603220949-865597e52e25 +Version: v0.0.0-20260721132016-d427ff9ee9ad License: Apache-2.0 -License URL: https://github.com/kubernetes/kube-openapi/blob/865597e52e25/pkg/validation/spec/LICENSE +License URL: https://github.com/kubernetes/kube-openapi/blob/d427ff9ee9ad/pkg/validation/spec/LICENSE ---------- Module: k8s.io/kubectl/pkg @@ -1781,9 +1775,9 @@ License URL: https://github.com/kubernetes-sigs/randfill/blob/v1.0.0/LICENSE ---------- Module: sigs.k8s.io/structured-merge-diff/v6 -Version: v6.4.0 +Version: v6.4.2 License: Apache-2.0 -License URL: https://github.com/kubernetes-sigs/structured-merge-diff/blob/v6.4.0/LICENSE +License URL: https://github.com/kubernetes-sigs/structured-merge-diff/blob/v6.4.2/LICENSE ---------- Module: sigs.k8s.io/yaml From 3561789619bcaaac7159ddb384e7e55665c3277d Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 01:33:55 +0000 Subject: [PATCH 069/132] update(deps): update module k8s.io/streaming to v0.37.0 (#749) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [k8s.io/streaming](https://redirect.github.com/kubernetes/streaming) | `v0.36.4` → `v0.37.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/k8s.io%2fstreaming/v0.37.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/k8s.io%2fstreaming/v0.36.4/v0.37.0?slim=true) | --- ### Release Notes
kubernetes/streaming (k8s.io/streaming) ### [`v0.37.0`](https://redirect.github.com/kubernetes/streaming/compare/v0.36.4...v0.37.0) [Compare Source](https://redirect.github.com/kubernetes/streaming/compare/v0.36.4...v0.37.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 8 ++++++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 6e9cbb7de..c6c297358 100644 --- a/NOTICE +++ b/NOTICE @@ -1709,9 +1709,9 @@ License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg -Version: v0.36.4 +Version: v0.37.0 License: Apache-2.0 -License URL: https://github.com/kubernetes/streaming/blob/v0.36.4/LICENSE +License URL: https://github.com/kubernetes/streaming/blob/v0.37.0/LICENSE ---------- Module: k8s.io/utils diff --git a/go.mod b/go.mod index e26a1160c..924558f1a 100644 --- a/go.mod +++ b/go.mod @@ -721,4 +721,4 @@ replace ( replace k8s.io/cri-streaming => k8s.io/cri-streaming v0.37.0 -replace k8s.io/streaming => k8s.io/streaming v0.36.4 +replace k8s.io/streaming => k8s.io/streaming v0.37.0 diff --git a/go.sum b/go.sum index 9272e7f2f..5e0e20278 100644 --- a/go.sum +++ b/go.sum @@ -5368,6 +5368,7 @@ golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtC golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -5618,6 +5619,7 @@ golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -5972,6 +5974,7 @@ golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -6928,13 +6931,14 @@ k8s.io/kubelet v0.36.4 h1:mlmXnkrq3H02r/r0H/8M2jdPY7f4I4u4cA0tHnsPzY0= k8s.io/kubelet v0.36.4/go.mod h1:jcOhk4E8cdUBn7WswW67WH9waQTe37G057ttnYdcaKY= k8s.io/kubernetes v1.36.4 h1:08GT0ZOMtyCcRnslyvnpWurf1wm20KHbC/aRS+0LxSo= k8s.io/kubernetes v1.36.4/go.mod h1:ZyLkHB4+fxSZ4LqpShPGJhikj4ngJaYAFlaZKs7goP4= -k8s.io/streaming v0.36.4 h1:RS5YlhrdBN2pKGVjgygGntdu6SNdsduyjGWGe3cX0vo= -k8s.io/streaming v0.36.4/go.mod h1:tJ6S2bZa2HxIBauguBbCWSCYyd93Grfz1+z3tcOvlDE= +k8s.io/streaming v0.37.0 h1:iPBUZLZiKt5bV+lxJurASMOV07VuBhNpiwJt2//AWrM= +k8s.io/streaming v0.37.0/go.mod h1:APlJR26ZWRcVy5bIEj0QRrKUXROtBHPcxl2NT7EAzPU= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +k8s.io/utils v0.0.0-20260626114624-be93311217bd/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE= k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM= lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6e9cbb7de..c6c297358 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1709,9 +1709,9 @@ License URL: https://github.com/kubernetes/kubernetes/blob/v1.36.4/LICENSE ---------- Module: k8s.io/streaming/pkg -Version: v0.36.4 +Version: v0.37.0 License: Apache-2.0 -License URL: https://github.com/kubernetes/streaming/blob/v0.36.4/LICENSE +License URL: https://github.com/kubernetes/streaming/blob/v0.37.0/LICENSE ---------- Module: k8s.io/utils From 30a890d6dda2dcbfb8c49b416fae96a4fcaa95bd Mon Sep 17 00:00:00 2001 From: Tim Schrodi Date: Thu, 27 Aug 2026 10:41:48 +0200 Subject: [PATCH 070/132] feat(bootstrap): manage local infrastructure with Argo CD (#731) ## Summary - always bootstrap Argo CD for local installations and register Rook/Ceph and CloudNativePG as declarative Argo CD applications - wait until each application is healthy, synced, and compared against the requested target revision before continuing - add `--ceph-device-filter` and `--ceph-device-path-filter` options while retaining all-device selection as the default - mark the local `codesphere-rbd` storage class as the default storage class - make the installer hash optional, reuse shared package download/extraction helpers, and simplify app-of-apps setup - update the generated `bootstrap-local` command documentation and ignore local `tmp/` artifacts ## Testing - `go test ./...` - `git diff --check` --------- Signed-off-by: schrodit <7979201+schrodit@users.noreply.github.com> Co-authored-by: schrodit <7979201+schrodit@users.noreply.github.com> --- .gitignore | 1 + NOTICE | 6 + cli/cmd/bootstrap_local.go | 14 +- .../install_codesphere_dependencies.go | 8 +- docs/oms_beta_bootstrap-local.md | 39 +++--- internal/bootstrap/local/argocd_app.go | 59 ++++++++ internal/bootstrap/local/installer.go | 126 +++++++----------- internal/bootstrap/local/local.go | 44 +++--- internal/bootstrap/local/postgres.go | 26 ++-- internal/bootstrap/local/rook.go | 77 ++++++++--- .../bootstrap/local/rook_selection_test.go | 74 ++++++++++ internal/installer/argocd/install_and_apps.go | 59 +++++++- internal/installer/bom/bom.go | 17 ++- internal/installer/bom/bom_test.go | 21 +++ internal/installer/package.go | 6 +- internal/installer/pc_apps.go | 10 +- internal/tmpl/NOTICE | 6 + 17 files changed, 418 insertions(+), 175 deletions(-) create mode 100644 internal/bootstrap/local/argocd_app.go create mode 100644 internal/bootstrap/local/rook_selection_test.go diff --git a/.gitignore b/.gitignore index eb2c4d4bf..fc1352a33 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ vendor .envrc .env .installer +tmp # bin file bin/ diff --git a/NOTICE b/NOTICE index c6c297358..99cfabcd6 100644 --- a/NOTICE +++ b/NOTICE @@ -687,6 +687,12 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE +---------- +Module: github.com/google/go-github/v90/github +Version: v90.0.0 +License: BSD-3-Clause +License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE + ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 diff --git a/cli/cmd/bootstrap_local.go b/cli/cmd/bootstrap_local.go index e3b6a7744..c9dcf8315 100644 --- a/cli/cmd/bootstrap_local.go +++ b/cli/cmd/bootstrap_local.go @@ -73,7 +73,7 @@ func AddBootstrapLocalCmd(parent *cobra.Command) { // Installer flags.BoolVarP(&bootstrapLocalCmd.Yes, "yes", "y", false, "Auto-approve the local bootstrapping warning prompt") flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallVersion, "install-version", "", "Codesphere version to install (downloaded from the OMS portal)") - flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallHash, "install-hash", "", "Codesphere package hash (required when install-version is set)") + flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallHash, "install-hash", "", "Optional Codesphere package hash used to select a specific build") flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallLocal, "install-local", "", "Path to a local installer package (tar.gz or unpacked directory)") // Registry flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.RegistryUser, "registry-user", "", "Custom Registry username") @@ -95,9 +95,10 @@ func AddBootstrapLocalCmd(parent *cobra.Command) { flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallDir, "install-dir", ".installer", "Directory for config, secrets, and bundle files") flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.InstallConfigPath, "install-config", "", "Path to install config file (default: /config.yaml)") flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.SecretsFilePath, "secrets-file", "", "Path to secrets file (default: /prod.vault.yaml)") + flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.CephDeviceFilter, "ceph-device-filter", "", "Regular expression selecting Ceph block devices by name") + flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.CephDevicePathFilter, "ceph-device-path-filter", "", "Regular expression selecting Ceph block devices by path") // ArgoCD integration - flags.BoolVar(&bootstrapLocalCmd.CodesphereEnv.UseArgoCD, "argocd", true, "After infra setup: install ArgoCD, update the OCI pull secret, and install pc-apps from the BOM version") - flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.ArgoCDRegistryURL, "registry-url", "oci://ghcr.io/codesphere-cloud/charts", "OCI registry URL used for the ArgoCD helm pull secret (only relevant with --argocd)") + flags.StringVar(&bootstrapLocalCmd.CodesphereEnv.ArgoCDRegistryURL, "registry-url", "oci://ghcr.io/codesphere-cloud/charts", "OCI registry URL used for the ArgoCD helm pull secret") bootstrapLocalCmd.cmd.RunE = bootstrapLocalCmd.RunE util.MarkFlagRequired(bootstrapLocalCmd.cmd, "registry-user") @@ -152,12 +153,7 @@ func (c *BootstrapLocalCmd) BootstrapLocal() error { return fmt.Errorf("failed to initialize Kubernetes client: %w", err) } - helmClient, err := installer.NewHelmClient("codesphere") - if err != nil { - return fmt.Errorf("failed to initialize Helm client: %w", err) - } - - bs := local.NewLocalBootstrapper(ctx, stlog, kubeClient, restConfig, fw, icg, helmClient, c.CodesphereEnv) + bs := local.NewLocalBootstrapper(ctx, stlog, kubeClient, restConfig, fw, icg, c.CodesphereEnv) return bs.Bootstrap() } diff --git a/cli/cmd/codesphere/install_codesphere_dependencies.go b/cli/cmd/codesphere/install_codesphere_dependencies.go index 46d656eec..8abb936d5 100644 --- a/cli/cmd/codesphere/install_codesphere_dependencies.go +++ b/cli/cmd/codesphere/install_codesphere_dependencies.go @@ -16,6 +16,7 @@ import ( "github.com/codesphere-cloud/oms/internal/env" "github.com/codesphere-cloud/oms/internal/installer" argocdinstaller "github.com/codesphere-cloud/oms/internal/installer/argocd" + "github.com/codesphere-cloud/oms/internal/installer/bom" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/system" "github.com/spf13/cobra" @@ -112,6 +113,11 @@ func installCodesphereDepencies(opts *InstallCodesphereOpts, cfg files.RootConfi // installArgoCDAndApps runs ArgoCD install, vault secret sync, and pc-apps install // before the main dependency steps. func installArgoCDAndApps(opts *InstallCodesphereOpts, cfg files.RootConfig, pm installer.PackageManager, installVault *files.InstallVault, restConfig *rest.Config, kubeClient ctrlclient.Client, stlog *bootstrap.StepLogger) error { + bomConfig, err := bom.Parse(pm.GetDependencyPath("bom.json")) + if err != nil { + return fmt.Errorf("failed to parse installer BOM: %w", err) + } + var install *argocdinstaller.AppInstaller if err := stlog.Substep("Load vault data", func() error { @@ -166,7 +172,7 @@ func installArgoCDAndApps(opts *InstallCodesphereOpts, cfg files.RootConfig, pm return err } if err := stlog.Substep("Install pc-apps", func() error { - return install.InstallPCApps(context.Background(), pm.GetDependencyPath("bom.json")) + return install.InstallPCApps(context.Background(), bomConfig) }); err != nil { return err } diff --git a/docs/oms_beta_bootstrap-local.md b/docs/oms_beta_bootstrap-local.md index 4a78c9a07..3dbb5d8c9 100644 --- a/docs/oms_beta_bootstrap-local.md +++ b/docs/oms_beta_bootstrap-local.md @@ -16,25 +16,26 @@ oms beta bootstrap-local [flags] ### Options ``` - --argocd After infra setup: install ArgoCD, update the OCI pull secret, and install pc-apps from the BOM version (default true) - --base-domain string Base domain for Codesphere (default "cs.local") - --feature-flags stringArray Feature flags to enable in Codesphere installation (optional) - -h, --help help for bootstrap-local - --install-config string Path to install config file (default: /config.yaml) - --install-dir string Directory for config, secrets, and bundle files (default ".installer") - --install-hash string Codesphere package hash (required when install-version is set) - --install-local string Path to a local installer package (tar.gz or unpacked directory) - --install-version string Codesphere version to install (downloaded from the OMS portal) - --internal-flags stringArray Internal flags to enable in Codesphere installation (optional) (default [headless-services,vcluster,custom-service-image,ms-in-ls]) - --k0s Use k0s-specific configuration (required to deploy to k0s clusters) - --pod-cidr string Service CIDR of the Kubernetes cluster. If not specified, OMS will try to determine it. - --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh]) - --profile string Profile to apply to the install config like resources (supported: dev, minimal, prod) (default "dev") - --registry-url string OCI registry URL used for the ArgoCD helm pull secret (only relevant with --argocd) (default "oci://ghcr.io/codesphere-cloud/charts") - --registry-user string Custom Registry username - --secrets-file string Path to secrets file (default: /prod.vault.yaml) - --service-cidr string Service CIDR of the Kubernetes cluster. If not specified, OMS will try to determine it. - -y, --yes Auto-approve the local bootstrapping warning prompt + --base-domain string Base domain for Codesphere (default "cs.local") + --ceph-device-filter string Regular expression selecting Ceph block devices by name + --ceph-device-path-filter string Regular expression selecting Ceph block devices by path + --feature-flags stringArray Feature flags to enable in Codesphere installation (optional) + -h, --help help for bootstrap-local + --install-config string Path to install config file (default: /config.yaml) + --install-dir string Directory for config, secrets, and bundle files (default ".installer") + --install-hash string Optional Codesphere package hash used to select a specific build + --install-local string Path to a local installer package (tar.gz or unpacked directory) + --install-version string Codesphere version to install (downloaded from the OMS portal) + --internal-flags stringArray Internal flags to enable in Codesphere installation (optional) (default [headless-services,vcluster,custom-service-image,ms-in-ls]) + --k0s Use k0s-specific configuration (required to deploy to k0s clusters) + --pod-cidr string Service CIDR of the Kubernetes cluster. If not specified, OMS will try to determine it. + --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh]) + --profile string Profile to apply to the install config like resources (supported: dev, minimal, prod) (default "dev") + --registry-url string OCI registry URL used for the ArgoCD helm pull secret (default "oci://ghcr.io/codesphere-cloud/charts") + --registry-user string Custom Registry username + --secrets-file string Path to secrets file (default: /prod.vault.yaml) + --service-cidr string Service CIDR of the Kubernetes cluster. If not specified, OMS will try to determine it. + -y, --yes Auto-approve the local bootstrapping warning prompt ``` ### SEE ALSO diff --git a/internal/bootstrap/local/argocd_app.go b/internal/bootstrap/local/argocd_app.go new file mode 100644 index 000000000..bff5db138 --- /dev/null +++ b/internal/bootstrap/local/argocd_app.go @@ -0,0 +1,59 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package local implements single-node Codesphere cluster bootstrapping. +package local + +import ( + "encoding/json" + "fmt" + + argov1alpha1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/codesphere-cloud/oms/internal/installer/argocd" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" +) + +type helmApplicationConfig struct { + Name, Chart, RepoURL, TargetRevision, Namespace string + Values map[string]interface{} +} + +func (b *LocalBootstrapper) installHelmApplication(cfg helmApplicationConfig) error { + rawValues, err := json.Marshal(cfg.Values) + if err != nil { + return fmt.Errorf("failed to marshal values for ArgoCD Application %q: %w", cfg.Name, err) + } + + desired := &argov1alpha1.Application{ + ObjectMeta: metav1.ObjectMeta{Name: cfg.Name, Namespace: argocd.DefaultNamespace}, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: cfg.RepoURL, Chart: cfg.Chart, TargetRevision: cfg.TargetRevision, + Helm: &argov1alpha1.ApplicationSourceHelm{ReleaseName: cfg.Name, ValuesObject: &runtime.RawExtension{Raw: rawValues}}, + }, + Destination: argov1alpha1.ApplicationDestination{Server: "https://kubernetes.default.svc", Namespace: cfg.Namespace}, + SyncPolicy: &argov1alpha1.SyncPolicy{ + Automated: &argov1alpha1.SyncPolicyAutomated{Prune: ptr.To(true), SelfHeal: ptr.To(true)}, + SyncOptions: argov1alpha1.SyncOptions{"CreateNamespace=true", "ServerSideApply=true"}, + }, + }, + } + + current := &argov1alpha1.Application{ObjectMeta: desired.ObjectMeta} + if _, err := controllerutil.CreateOrUpdate(b.ctx, b.kubeClient, current, func() error { + current.Spec = desired.Spec + return nil + }); err != nil { + return fmt.Errorf("failed to apply ArgoCD Application %q: %w", cfg.Name, err) + } + + if err := argocd.WaitForApplicationHealthy(b.ctx, b.kubeClient, cfg.Name, cfg.TargetRevision, b.stlog.Logf); err != nil { + return fmt.Errorf("failed to wait for ArgoCD Application %q: %w", cfg.Name, err) + } + + return nil +} diff --git a/internal/bootstrap/local/installer.go b/internal/bootstrap/local/installer.go index 40e42dd74..425039e86 100644 --- a/internal/bootstrap/local/installer.go +++ b/internal/bootstrap/local/installer.go @@ -14,9 +14,10 @@ import ( "strings" "time" + "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/bom" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/portal" - "github.com/codesphere-cloud/oms/internal/util" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -44,11 +45,8 @@ func (b *LocalBootstrapper) DownloadInstallerPackage() (string, error) { if version == "" { return "", fmt.Errorf("install version is required to download from the portal") } - if hash == "" { - return "", fmt.Errorf("install hash must be set when install version is set") - } - log.Printf("Downloading Codesphere package %s (hash %s) from the OMS portal...", version, hash) + log.Printf("Downloading Codesphere package %s from the OMS portal...", version) p := portal.NewPortalClient() @@ -64,41 +62,8 @@ func (b *LocalBootstrapper) DownloadInstallerPackage() (string, error) { return destPath, nil } - download, err := build.GetBuildForDownload(installerArtifactFilename) - if err != nil { - return "", fmt.Errorf("artifact %q not found in build: %w", installerArtifactFilename, err) - } - - // Support resuming a partial download. - out, err := b.fw.OpenAppend(destPath) - if err != nil { - out, err = b.fw.Create(destPath) - if err != nil { - return "", fmt.Errorf("failed to create file %s: %w", destPath, err) - } - } - defer util.CloseFileIgnoreError(out) - - fileSize := 0 - fileInfo, err := out.Stat() - if err == nil { - fileSize = int(fileInfo.Size()) - } - - err = p.DownloadBuildArtifact(portal.CodesphereProduct, download, out, fileSize, false) - if err != nil { - return "", fmt.Errorf("failed to download build artifact: %w", err) - } - - // Verify integrity. - verifyFile, err := b.fw.Open(destPath) - if err != nil { - return "", fmt.Errorf("failed to open downloaded file for verification: %w", err) - } - defer util.CloseFileIgnoreError(verifyFile) - - if err := p.VerifyBuildArtifactDownload(verifyFile, download); err != nil { - return "", fmt.Errorf("artifact verification failed: %w", err) + if err := portal.DownloadAndVerifyBuild(p, b.fw, portal.CodesphereProduct, build, installerArtifactFilename, destPath, portal.DownloadOptions{Resume: true}); err != nil { + return "", fmt.Errorf("failed to download installer package: %w", err) } return destPath, nil @@ -106,7 +71,7 @@ func (b *LocalBootstrapper) DownloadInstallerPackage() (string, error) { // PrepareInstallerBundle resolves the installer package to a directory. // It handles three cases: -// 1. Portal download: InstallVersion+InstallHash are set → download tar.gz, then extract. +// 1. Portal download: InstallVersion is set → download tar.gz, then extract. // 2. Local tar.gz/tgz: InstallLocal points to an archive → extract. // 3. Local directory: InstallLocal points to an already-unpacked directory → use as-is. func (b *LocalBootstrapper) PrepareInstallerBundle() (string, error) { @@ -144,23 +109,35 @@ func (b *LocalBootstrapper) PrepareInstallerBundle() (string, error) { return "", fmt.Errorf("installer bundle %q is neither a directory nor a .tar.gz/.tgz archive", bundlePath) } - destDir := strings.TrimSuffix(strings.TrimSuffix(bundlePath, ".gz"), ".tar") - destDir = strings.TrimSuffix(destDir, ".tgz") - if destDir == bundlePath { - destDir = bundlePath + "-unpacked" + packageManager := installer.NewPackage(filepath.Dir(bundlePath), bundlePath) + if err := packageManager.Extract(false); err != nil { + return "", fmt.Errorf("failed to extract installer bundle: %w", err) } - if b.fw.Exists(destDir) { - log.Printf("Installer bundle is already extracted. Skipping extraction...\n") - return destDir, nil + return packageManager.GetWorkDir(), nil +} + +// PrepareInstaller resolves and extracts the installer bundle before the +// bootstrap needs any version information from its BOM. +func (b *LocalBootstrapper) PrepareInstaller() error { + if b.Env.InstallVersion == "" && b.Env.InstallLocal == "" { + return nil } - log.Printf("Extracting installer bundle %s → %s", bundlePath, destDir) - if err := util.ExtractTarGz(b.fw, bundlePath, destDir); err != nil { - return "", fmt.Errorf("failed to extract installer bundle: %w", err) + bundleDir, err := b.PrepareInstallerBundle() + if err != nil { + return err } - return destDir, nil + bomConfig, err := bom.Parse(filepath.Join(bundleDir, "deps", "bom.json")) + if err != nil { + return fmt.Errorf("failed to parse installer BOM: %w", err) + } + + b.installerBundleDir = bundleDir + b.installerBOM = bomConfig + + return nil } // symlinkLocalBinaries replaces bundled node, helm and kubectl binaries with @@ -393,8 +370,7 @@ func (b *LocalBootstrapper) configurePostgresForMigration(host string, port int3 }, nil } -// RunInstaller extracts the deps.tar.gz archive locally and then runs the -// install-components.js script directly on the local machine for each +// RunInstaller runs the install-components.js script directly on the local machine for each // required component step (setUpCluster, codesphere), instead of running // the private-cloud-installer.js which orchestrates remote nodes via SSH. func (b *LocalBootstrapper) RunInstaller() (err error) { @@ -403,9 +379,9 @@ func (b *LocalBootstrapper) RunInstaller() (err error) { return nil } - bundleDir, err := b.PrepareInstallerBundle() - if err != nil { - return fmt.Errorf("failed to prepare installer bundle: %w", err) + bundleDir := b.installerBundleDir + if bundleDir == "" { + return fmt.Errorf("installer bundle is not prepared") } // On non-Linux hosts the bundled binaries are Linux ELF executables that @@ -414,34 +390,22 @@ func (b *LocalBootstrapper) RunInstaller() (err error) { return fmt.Errorf("failed to symlink local binaries: %w", err) } - // Extract deps.tar.gz locally so that install-components.js can find - // all dependency binaries (helm charts, sops, etc.) on the local machine. - archivePath := filepath.Join(bundleDir, "deps.tar.gz") depsDir := filepath.Join(bundleDir, "deps") - if b.fw.Exists(depsDir) { - log.Printf("deps directory already exists at %s, skipping extraction", depsDir) - } else { - log.Printf("Extracting deps.tar.gz → %s", depsDir) - if err := util.ExtractTarGz(b.fw, archivePath, depsDir); err != nil { - return fmt.Errorf("failed to extract deps.tar.gz: %w", err) - } + if b.argoCDAndAppsInstall == nil { + return fmt.Errorf("ArgoCD and apps installer is not initialized") } - if b.Env.UseArgoCD { - if b.argoCDAndAppsInstall == nil { - return fmt.Errorf("ArgoCD and apps installer is not initialized") - } - if err := b.stlog.Substep("Sync vault secret", func() error { - return b.argoCDAndAppsInstall.SyncVaultSecret(b.ctx) - }); err != nil { - return err - } - if err := b.stlog.Substep("Register pc-apps app-of-apps", func() error { - return b.argoCDAndAppsInstall.InstallPCApps(b.ctx, filepath.Join(depsDir, "bom.json")) - }); err != nil { - return err - } + if err := b.stlog.Substep("Sync vault secret", func() error { + return b.argoCDAndAppsInstall.SyncVaultSecret(b.ctx) + }); err != nil { + return fmt.Errorf("failed to sync vault secret: %w", err) + } + + if err := b.stlog.Substep("Register pc-apps app-of-apps", func() error { + return b.argoCDAndAppsInstall.InstallPCApps(b.ctx, b.installerBOM) + }); err != nil { + return fmt.Errorf("failed to register pc-apps app-of-apps: %w", err) } // Symlink sops and age inside the extracted deps directory so that diff --git a/internal/bootstrap/local/local.go b/internal/bootstrap/local/local.go index 994620fc4..be82d1d6d 100644 --- a/internal/bootstrap/local/local.go +++ b/internal/bootstrap/local/local.go @@ -15,6 +15,7 @@ import ( "github.com/codesphere-cloud/oms/internal/bootstrap" "github.com/codesphere-cloud/oms/internal/installer" "github.com/codesphere-cloud/oms/internal/installer/argocd" + "github.com/codesphere-cloud/oms/internal/installer/bom" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/vault" "github.com/codesphere-cloud/oms/internal/installer/vault/sops" @@ -59,7 +60,6 @@ type LocalBootstrapper struct { restConfig *rest.Config fw util.FileIO icg installer.InstallConfigManager - helm installer.HelmClient // Environment Env *CodesphereEnvironment // cephCredentials holds the Ceph auth credentials read after setup. @@ -70,6 +70,8 @@ type LocalBootstrapper struct { ageKeyPath string // argoCDAndAppsInstall is reused for the ArgoCD, vault, and pc-apps stages. argoCDAndAppsInstall *argocd.AppInstaller + installerBundleDir string + installerBOM *bom.Config } type CodesphereEnvironment struct { @@ -86,21 +88,23 @@ type CodesphereEnvironment struct { RegistryUser string `json:"-"` RegistryPassword string `json:"-"` // Config - InstallDir string `json:"-"` - ExistingConfigUsed bool `json:"-"` - InstallConfigPath string `json:"-"` - SecretsFilePath string `json:"-"` - InstallConfig *files.RootConfig `json:"-"` - Vault *files.InstallVault `json:"-"` - K0s bool `json:"-"` - PodCIDR string `json:"pod_cidr"` - ServiceCIDR string `json:"service_cidr"` + InstallDir string `json:"-"` + ExistingConfigUsed bool `json:"-"` + InstallConfigPath string `json:"-"` + SecretsFilePath string `json:"-"` + InstallConfig *files.RootConfig `json:"-"` + Vault *files.InstallVault `json:"-"` + K0s bool `json:"-"` + PodCIDR string `json:"pod_cidr"` + ServiceCIDR string `json:"service_cidr"` + CephDeviceFilter string `json:"-"` + CephDevicePathFilter string `json:"-"` // ArgoCD integration - UseArgoCD bool `json:"-"` ArgoCDRegistryURL string `json:"-"` } -func NewLocalBootstrapper(ctx context.Context, stlog *bootstrap.StepLogger, kubeClient client.Client, restConfig *rest.Config, fw util.FileIO, icg installer.InstallConfigManager, helm installer.HelmClient, env *CodesphereEnvironment) *LocalBootstrapper { +// NewLocalBootstrapper creates a bootstrapper for a local Codesphere cluster. +func NewLocalBootstrapper(ctx context.Context, stlog *bootstrap.StepLogger, kubeClient client.Client, restConfig *rest.Config, fw util.FileIO, icg installer.InstallConfigManager, env *CodesphereEnvironment) *LocalBootstrapper { return &LocalBootstrapper{ ctx: ctx, stlog: stlog, @@ -108,13 +112,17 @@ func NewLocalBootstrapper(ctx context.Context, stlog *bootstrap.StepLogger, kube restConfig: restConfig, fw: fw, icg: icg, - helm: helm, Env: env, } } func (b *LocalBootstrapper) Bootstrap() error { - err := b.stlog.Step("Ensure install config", b.EnsureInstallConfig) + err := b.stlog.Step("Prepare installer bundle", b.PrepareInstaller) + if err != nil { + return fmt.Errorf("failed to prepare installer bundle: %w", err) + } + + err = b.stlog.Step("Ensure install config", b.EnsureInstallConfig) if err != nil { return fmt.Errorf("failed to ensure install config: %w", err) } @@ -134,11 +142,9 @@ func (b *LocalBootstrapper) Bootstrap() error { return fmt.Errorf("failed to ensure namespaces: %w", err) } - if b.Env.UseArgoCD { - err = b.stlog.Step("Bootstrap ArgoCD", b.BootstrapArgoCD) - if err != nil { - return fmt.Errorf("failed to bootstrap ArgoCD: %w", err) - } + err = b.stlog.Step("Bootstrap ArgoCD", b.BootstrapArgoCD) + if err != nil { + return fmt.Errorf("failed to bootstrap ArgoCD: %w", err) } err = b.stlog.Step("Install Rook and test Ceph cluster", func() error { diff --git a/internal/bootstrap/local/postgres.go b/internal/bootstrap/local/postgres.go index d7747af7f..f51895dcf 100644 --- a/internal/bootstrap/local/postgres.go +++ b/internal/bootstrap/local/postgres.go @@ -10,7 +10,6 @@ import ( "time" cnpgv1 "github.com/cloudnative-pg/cloudnative-pg/api/v1" - "github.com/codesphere-cloud/oms/internal/installer" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" apimeta "k8s.io/apimachinery/pkg/api/meta" @@ -32,15 +31,22 @@ const ( cnpgReadyTimeout = 15 * time.Minute cnpgReadyPollInterval = 5 * time.Second cnpgSecretPasswordKey = "password" + cnpgBOMComponent = "postgres-operator" ) func (b *LocalBootstrapper) InstallCloudNativePGHelmChart() error { - if err := b.helm.UpgradeChart(b.ctx, installer.ChartConfig{ - ReleaseName: cnpgReleaseName, - ChartName: "cloudnative-pg", - RepoURL: cnpgRepoURL, - Namespace: codesphereNamespace, - CreateNamespace: true, + if b.installerBOM == nil { + return fmt.Errorf("installer BOM is not prepared") + } + + chart, ok := b.installerBOM.GetChart(cnpgBOMComponent) + if !ok { + return fmt.Errorf("CloudNativePG chart is missing from BOM component %q", cnpgBOMComponent) + } + + return b.installHelmApplication(helmApplicationConfig{ + Name: cnpgReleaseName, Chart: "cloudnative-pg", RepoURL: cnpgRepoURL, + TargetRevision: chart.Tag(), Namespace: codesphereNamespace, Values: map[string]interface{}{ "config": map[string]interface{}{ "clusterWide": true, @@ -55,11 +61,7 @@ func (b *LocalBootstrapper) InstallCloudNativePGHelmChart() error { }, }, }, - }, installer.UpgradeChartOptions{InstallIfNotExist: true}); err != nil { - return fmt.Errorf("failed to deploy Helm chart %q: %w", cnpgReleaseName, err) - } - - return nil + }) } func (b *LocalBootstrapper) DeployPostgresDatabase() error { diff --git a/internal/bootstrap/local/rook.go b/internal/bootstrap/local/rook.go index fc2330b75..e9417ae3d 100644 --- a/internal/bootstrap/local/rook.go +++ b/internal/bootstrap/local/rook.go @@ -8,9 +8,9 @@ import ( "encoding/json" "errors" "fmt" + "strings" "time" - "github.com/codesphere-cloud/oms/internal/installer" rookcephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1" corev1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" @@ -34,9 +34,11 @@ const ( rookReadyTimeout = 30 * time.Minute rookReadyPollInterval = 5 * time.Second - cephBlockPoolName = "codesphere-rbd" - cephStorageClassName = "codesphere-rbd" - cephRBDProvisionerName = "rook-ceph.rbd.csi.ceph.com" + cephBlockPoolName = "codesphere-rbd" + cephStorageClassName = "codesphere-rbd" + cephRBDProvisionerName = "rook-ceph.rbd.csi.ceph.com" + defaultStorageClassAnnotation = "storageclass.kubernetes.io/is-default-class" + legacyDefaultClassAnnotation = "storageclass.beta.kubernetes.io/is-default-class" ) // csiResourceEntry represents a single container resource definition for Rook CSI drivers. @@ -139,19 +141,10 @@ func (b *LocalBootstrapper) InstallRookHelmChart() error { return fmt.Errorf("failed to build Helm values: %w", err) } - if err := b.helm.UpgradeChart(b.ctx, installer.ChartConfig{ - ReleaseName: rookReleaseName, - ChartName: "rook-ceph", - RepoURL: rookRepoURL, - Version: rookVersion, - Namespace: rookNamespace, - CreateNamespace: true, - Values: helmValues, - }, installer.UpgradeChartOptions{InstallIfNotExist: true}); err != nil { - return fmt.Errorf("failed to deploy Helm chart %q: %w", rookReleaseName, err) - } - - return nil + return b.installHelmApplication(helmApplicationConfig{ + Name: rookReleaseName, Chart: "rook-ceph", RepoURL: rookRepoURL, + TargetRevision: rookVersion, Namespace: rookNamespace, Values: helmValues, + }) } func (b *LocalBootstrapper) DeployTestCephCluster() error { @@ -178,11 +171,8 @@ func (b *LocalBootstrapper) DeployTestCephCluster() error { AllowMultiplePerNode: true, }, Storage: rookcephv1.StorageScopeSpec{ - // TODO: make configurable. - UseAllNodes: true, - Selection: rookcephv1.Selection{ - UseAllDevices: ptr.To(true), - }, + UseAllNodes: true, + Selection: b.cephDeviceSelection(), AllowDeviceClassUpdate: true, AllowOsdCrushWeightUpdate: false, }, @@ -241,6 +231,17 @@ func (b *LocalBootstrapper) DeployTestCephCluster() error { return nil } +func (b *LocalBootstrapper) cephDeviceSelection() rookcephv1.Selection { + selection := rookcephv1.Selection{UseAllDevices: ptr.To(true)} + if b.Env.CephDeviceFilter != "" || b.Env.CephDevicePathFilter != "" { + selection.UseAllDevices = ptr.To(false) + selection.DeviceFilter = b.Env.CephDeviceFilter + selection.DevicePathFilter = b.Env.CephDevicePathFilter + } + + return selection +} + func (b *LocalBootstrapper) WaitForTestCephClusterReady() error { ctx, cancel := context.WithTimeout(b.ctx, rookReadyTimeout) defer cancel() @@ -339,6 +340,13 @@ func (b *LocalBootstrapper) DeployCephBlockPoolAndStorageClass() error { return fmt.Errorf("failed to create or update CephBlockPool %q: %w", cephBlockPoolName, err) } + storageClasses := &storagev1.StorageClassList{} + if err := b.kubeClient.List(b.ctx, storageClasses); err != nil { + return fmt.Errorf("failed to list StorageClasses: %w", err) + } + + hasOtherDefault := hasDefaultStorageClass(storageClasses.Items, cephStorageClassName) + // Create StorageClass reclaimPolicy := corev1.PersistentVolumeReclaimDelete volumeBindingMode := storagev1.VolumeBindingImmediate @@ -349,6 +357,16 @@ func (b *LocalBootstrapper) DeployCephBlockPoolAndStorageClass() error { } _, err = controllerutil.CreateOrUpdate(b.ctx, b.kubeClient, storageClass, func() error { + if storageClass.Annotations == nil { + storageClass.Annotations = make(map[string]string) + } + + if hasOtherDefault { + delete(storageClass.Annotations, defaultStorageClassAnnotation) + delete(storageClass.Annotations, legacyDefaultClassAnnotation) + } else { + storageClass.Annotations[defaultStorageClassAnnotation] = "true" + } storageClass.Provisioner = cephRBDProvisionerName storageClass.Parameters = map[string]string{ "clusterID": rookNamespace, @@ -375,6 +393,21 @@ func (b *LocalBootstrapper) DeployCephBlockPoolAndStorageClass() error { return nil } +func hasDefaultStorageClass(storageClasses []storagev1.StorageClass, excludeName string) bool { + for _, storageClass := range storageClasses { + if storageClass.Name == excludeName { + continue + } + + if strings.EqualFold(storageClass.Annotations[defaultStorageClassAnnotation], "true") || + strings.EqualFold(storageClass.Annotations[legacyDefaultClassAnnotation], "true") { + return true + } + } + + return false +} + func isRookCephClusterReady(cluster *rookcephv1.CephCluster) bool { if cluster == nil { return false diff --git a/internal/bootstrap/local/rook_selection_test.go b/internal/bootstrap/local/rook_selection_test.go new file mode 100644 index 000000000..ed4879333 --- /dev/null +++ b/internal/bootstrap/local/rook_selection_test.go @@ -0,0 +1,74 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package local + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var _ = Describe("Ceph device selection", func() { + It("uses all devices by default", func() { + selection := (&LocalBootstrapper{Env: &CodesphereEnvironment{}}).cephDeviceSelection() + Expect(selection.UseAllDevices).NotTo(BeNil()) + Expect(*selection.UseAllDevices).To(BeTrue()) + Expect(selection.DeviceFilter).To(BeEmpty()) + Expect(selection.DevicePathFilter).To(BeEmpty()) + }) + + It("uses only the configured device-name filter", func() { + selection := (&LocalBootstrapper{Env: &CodesphereEnvironment{CephDeviceFilter: "^sd[b-z]$"}}).cephDeviceSelection() + Expect(*selection.UseAllDevices).To(BeFalse()) + Expect(selection.DeviceFilter).To(Equal("^sd[b-z]$")) + Expect(selection.DevicePathFilter).To(BeEmpty()) + }) + + It("uses only the configured device-path filter", func() { + selection := (&LocalBootstrapper{Env: &CodesphereEnvironment{CephDevicePathFilter: "^/dev/disk/by-id/"}}).cephDeviceSelection() + Expect(*selection.UseAllDevices).To(BeFalse()) + Expect(selection.DeviceFilter).To(BeEmpty()) + Expect(selection.DevicePathFilter).To(Equal("^/dev/disk/by-id/")) + }) + + It("passes both explicit filters to Rook", func() { + selection := (&LocalBootstrapper{Env: &CodesphereEnvironment{ + CephDeviceFilter: "^nvme", + CephDevicePathFilter: "^/dev/disk/by-id/", + }}).cephDeviceSelection() + Expect(*selection.UseAllDevices).To(BeFalse()) + Expect(selection.DeviceFilter).To(Equal("^nvme")) + Expect(selection.DevicePathFilter).To(Equal("^/dev/disk/by-id/")) + }) +}) + +var _ = Describe("Default storage class selection", func() { + It("detects another stable default storage class", func() { + classes := []storagev1.StorageClass{{ + ObjectMeta: metav1.ObjectMeta{Name: "existing", Annotations: map[string]string{ + defaultStorageClassAnnotation: "true", + }}, + }} + Expect(hasDefaultStorageClass(classes, cephStorageClassName)).To(BeTrue()) + }) + + It("detects another legacy default storage class", func() { + classes := []storagev1.StorageClass{{ + ObjectMeta: metav1.ObjectMeta{Name: "existing", Annotations: map[string]string{ + legacyDefaultClassAnnotation: "TRUE", + }}, + }} + Expect(hasDefaultStorageClass(classes, cephStorageClassName)).To(BeTrue()) + }) + + It("ignores the Codesphere storage class itself", func() { + classes := []storagev1.StorageClass{{ + ObjectMeta: metav1.ObjectMeta{Name: cephStorageClassName, Annotations: map[string]string{ + defaultStorageClassAnnotation: "true", + }}, + }} + Expect(hasDefaultStorageClass(classes, cephStorageClassName)).To(BeFalse()) + }) +}) diff --git a/internal/installer/argocd/install_and_apps.go b/internal/installer/argocd/install_and_apps.go index 77795cd52..6d11a524c 100644 --- a/internal/installer/argocd/install_and_apps.go +++ b/internal/installer/argocd/install_and_apps.go @@ -6,16 +6,71 @@ package argocd import ( "context" "fmt" + "time" + argov1alpha1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" "github.com/codesphere-cloud/oms/internal/installer" + "github.com/codesphere-cloud/oms/internal/installer/bom" "github.com/codesphere-cloud/oms/internal/installer/files" "github.com/codesphere-cloud/oms/internal/installer/secrets" "github.com/codesphere-cloud/oms/internal/installer/vault" "github.com/codesphere-cloud/oms/internal/util" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" ) +const ( + applicationReadyTimeout = 30 * time.Minute + applicationReadyPollInterval = 5 * time.Second +) + +// LogFunc records formatted application readiness messages. +type LogFunc func(format string, args ...interface{}) + +// WaitForApplicationHealthy waits until Argo CD has compared the requested target revision +// and reports the Application as healthy and synced. +func WaitForApplicationHealthy(ctx context.Context, kubeClient client.Client, name, targetRevision string, logf LogFunc) error { + if logf == nil { + logf = func(string, ...interface{}) {} + } + + logf("Waiting for ArgoCD Application %q to become healthy and synced (timeout %s)", name, applicationReadyTimeout) + + lastHealth, lastSync, lastTargetRevision := "", "", "" + + err := wait.PollUntilContextTimeout(ctx, applicationReadyPollInterval, applicationReadyTimeout, true, func(ctx context.Context) (bool, error) { + app := &argov1alpha1.Application{} + if err := kubeClient.Get(ctx, client.ObjectKey{Name: name, Namespace: DefaultNamespace}, app); err != nil { + if !apierrors.IsNotFound(err) { + return false, fmt.Errorf("failed to read ArgoCD Application %q: %w", name, err) + } + + logf("Waiting for ArgoCD Application %q: failed to read status: %v", name, err) + + return false, nil + } + + lastHealth, lastSync = string(app.Status.Health.Status), string(app.Status.Sync.Status) + + lastTargetRevision = app.Status.Sync.ComparedTo.Source.TargetRevision + if lastTargetRevision == targetRevision && app.Status.Health.Status == "Healthy" && app.Status.Sync.Status == argov1alpha1.SyncStatusCodeSynced { + logf("ArgoCD Application %q is healthy and synced", name) + return true, nil + } + + logf("Waiting for ArgoCD Application %q (target-revision=%q/%q, health=%q, sync=%q)", name, lastTargetRevision, targetRevision, lastHealth, lastSync) + + return false, nil + }) + if err != nil { + return fmt.Errorf("timed out waiting for ArgoCD Application %q to become healthy and synced at target revision %q (observed target revision=%q, health=%q, sync=%q): %w", name, targetRevision, lastTargetRevision, lastHealth, lastSync, err) + } + + return nil +} + // InstallerAPI is implemented by the concrete ArgoCD chart installer. type InstallerAPI interface { Install() error @@ -69,14 +124,14 @@ func (i *AppInstaller) SyncVaultSecret(ctx context.Context) error { // InstallPCApps creates or updates the pc-applications app-of-apps ArgoCD // Application using the chart version from the supplied installer BOM. -func (i *AppInstaller) InstallPCApps(ctx context.Context, bomPath string) error { +func (i *AppInstaller) InstallPCApps(ctx context.Context, bomConfig *bom.Config) error { // Values derived from the install config form the base; an explicit pcApps block in // config.yaml wins over them, and the --pc-apps-values files win over both. values := util.DeepMergeMaps(installer.OpenFgaPcAppsValues(&i.cfg.Config, i.cfg.Vault), i.cfg.Config.PcApps) pcApps, err := installer.NewPcAppsFromBom( i.cfg.KubeClient, - bomPath, + bomConfig, DefaultNamespace, i.cfg.PCAppsValues, values, diff --git a/internal/installer/bom/bom.go b/internal/installer/bom/bom.go index a83ca1af2..d631fc7a2 100644 --- a/internal/installer/bom/bom.go +++ b/internal/installer/bom/bom.go @@ -8,6 +8,7 @@ import ( "fmt" "os" "sort" + "strings" "github.com/distribution/reference" ) @@ -100,8 +101,14 @@ func Parse(filePath string) (*Config, error) { // components["pc-applications"].files["chart"].ociRef. // Returns (nil, false) when the component is absent, the chart file entry is // missing, or the ociRef has no recognisable tag. -func (b *Config) GetPCApps() (reference.Tagged, bool) { - comp, ok := b.Components["pc-applications"] +func (b *Config) GetPCApps() (reference.NamedTagged, bool) { + return b.GetChart("pc-applications") +} + +// GetChart returns the tagged OCI chart reference stored in the named +// component's files["chart"].ociRef entry. +func (b *Config) GetChart(component string) (reference.NamedTagged, bool) { + comp, ok := b.Components[component] if !ok { return nil, false } @@ -109,11 +116,13 @@ func (b *Config) GetPCApps() (reference.Tagged, bool) { if !ok || chart.OciRef == "" { return nil, false } - ref, err := reference.ParseNormalizedNamed(chart.OciRef) + + ref, err := reference.ParseNormalizedNamed(strings.TrimPrefix(chart.OciRef, "oci://")) if err != nil { return nil, false } - tagged, ok := ref.(reference.Tagged) + + tagged, ok := ref.(reference.NamedTagged) if !ok { return nil, false } diff --git a/internal/installer/bom/bom_test.go b/internal/installer/bom/bom_test.go index 2c71d4f44..b871ed737 100644 --- a/internal/installer/bom/bom_test.go +++ b/internal/installer/bom/bom_test.go @@ -214,6 +214,27 @@ var _ = Describe("Bom", func() { }) }) + Describe("GetChart", func() { + It("returns a tagged OCI chart for the requested component", func() { + cfg := &bom.Config{Components: map[string]bom.ComponentConfig{ + "argocd": {Files: map[string]bom.FileRef{ + "chart": {OciRef: "oci://ghcr.io/codesphere-cloud/charts/argocd:1.2.3"}, + }}, + }} + + chart, ok := cfg.GetChart("argocd") + Expect(ok).To(BeTrue()) + Expect(chart.Name()).To(Equal("ghcr.io/codesphere-cloud/charts/argocd")) + Expect(chart.Tag()).To(Equal("1.2.3")) + }) + + It("returns false when the component has no tagged chart", func() { + cfg := &bom.Config{Components: map[string]bom.ComponentConfig{}} + _, ok := cfg.GetChart("argocd") + Expect(ok).To(BeFalse()) + }) + }) + Describe("GetOCIArtifacts", func() { It("returns sorted unique container images and OCI Helm charts from all components", func() { cfg := &bom.Config{Components: map[string]bom.ComponentConfig{ diff --git a/internal/installer/package.go b/internal/installer/package.go index 7713f700c..8b060a992 100644 --- a/internal/installer/package.go +++ b/internal/installer/package.go @@ -54,7 +54,11 @@ func (p *Package) FileIO() util.FileIO { // GetWorkDir returns the working directory path for the package // by joining the OmsWorkdir and the filename (without the .tar.gz extension). func (p *Package) GetWorkDir() string { - return path.Join(p.OmsWorkdir, strings.ReplaceAll(p.Filename, ".tar.gz", "")) + filename := filepath.Base(p.Filename) + filename = strings.TrimSuffix(filename, ".tar.gz") + filename = strings.TrimSuffix(filename, ".tgz") + + return path.Join(p.OmsWorkdir, filename) } // GetDependencyPath returns the full path to a dependency file within the package's deps directory. diff --git a/internal/installer/pc_apps.go b/internal/installer/pc_apps.go index a8d42de68..9eddbe1c5 100644 --- a/internal/installer/pc_apps.go +++ b/internal/installer/pc_apps.go @@ -80,17 +80,17 @@ func NewPCApps(c client.Client, version, namespace string, valuesFiles []string, }, nil } -func NewPcAppsFromBom(c client.Client, bomPath string, namespace string, valuesFiles []string, valuesOverride map[string]interface{}) (*PCApps, error) { +// NewPcAppsFromBom creates a PCApps installer from the pc-applications entry in a BOM. +func NewPcAppsFromBom(c client.Client, bomConfig *bom.Config, namespace string, valuesFiles []string, valuesOverride map[string]interface{}) (*PCApps, error) { if err := checkArgoCDScheme(c); err != nil { return nil, err } - bomCfg, err := bom.Parse(bomPath) - if err != nil { - return nil, fmt.Errorf("failed to parse bom.json: %w", err) + if bomConfig == nil { + return nil, fmt.Errorf("BOM is required") } - pcApps, ok := bomCfg.GetPCApps() + pcApps, ok := bomConfig.GetPCApps() if !ok { return nil, fmt.Errorf("pc-applications component not found in BOM") } diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index c6c297358..99cfabcd6 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -687,6 +687,12 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE +---------- +Module: github.com/google/go-github/v90/github +Version: v90.0.0 +License: BSD-3-Clause +License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE + ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 From 4bf649b0ecd58b932aa98ae7183f180dfbdbd76e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 11:03:05 +0000 Subject: [PATCH 071/132] update(deps): update module github.com/argoproj/argo-cd/v3 to v3.5.2 (#750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/argoproj/argo-cd/v3](https://redirect.github.com/argoproj/argo-cd) | `v3.5.1` → `v3.5.2` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.1/v3.5.2?slim=true) | --- ### Release Notes
argoproj/argo-cd (github.com/argoproj/argo-cd/v3) ### [`v3.5.2`](https://redirect.github.com/argoproj/argo-cd/releases/tag/v3.5.2) [Compare Source](https://redirect.github.com/argoproj/argo-cd/compare/v3.5.1...v3.5.2) #### Quick Start ##### Non-HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.2/manifests/install.yaml ``` ##### HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.2/manifests/ha/install.yaml ``` #### Release Signatures and Provenance All Argo CD container images are signed by cosign. A Provenance is generated for container images and CLI binaries which meet the SLSA Level 3 specifications. See the [documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/signed-release-assets) on how to verify. #### Release Notes Blog Post For a detailed breakdown of the key changes and improvements in this release, check out the [official blog post](https://blog.argoproj.io/argo-cd-v3-0-release-candidate-a0b933f4e58f) #### Upgrading If upgrading from a different minor version, be sure to read the [upgrading](https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/overview/) documentation. #### Changelog ##### Bug fixes - [`f1f109c`](https://redirect.github.com/argoproj/argo-cd/commit/f1f109cc20895275ebae2dc62e51cba6c788586b): fix(appset): restore ignoreApplicationDifferences after normalization (cherry-pick [#​29070](https://redirect.github.com/argoproj/argo-cd/issues/29070) for 3.5) ([#​29195](https://redirect.github.com/argoproj/argo-cd/issues/29195)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`a45dd38`](https://redirect.github.com/argoproj/argo-cd/commit/a45dd38594f6f30bcc6c743e6f11080187cc84a1): fix(repository): resolve untyped helm source type in UpdateRevisionForPaths (cherry-pick [#​28904](https://redirect.github.com/argoproj/argo-cd/issues/28904) for 3.5) ([#​29399](https://redirect.github.com/argoproj/argo-cd/issues/29399)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`417c675`](https://redirect.github.com/argoproj/argo-cd/commit/417c675b17207730f3b89ed579132267c9af4892): fix(revert): auto-sync skipped when newer commit arrives during sync (cherry-pick [#​28692](https://redirect.github.com/argoproj/argo-cd/issues/28692) for 3.5) ([#​29224](https://redirect.github.com/argoproj/argo-cd/issues/29224)) ([@​rumstead](https://redirect.github.com/rumstead)) - [`961ee40`](https://redirect.github.com/argoproj/argo-cd/commit/961ee40cc32717bad323629284085b9f2cd7173f): fix(ui): remove kind filter from appset page ([#​29310](https://redirect.github.com/argoproj/argo-cd/issues/29310)) ([#​29311](https://redirect.github.com/argoproj/argo-cd/issues/29311)) (cherry-pick 3.5) ([#​29314](https://redirect.github.com/argoproj/argo-cd/issues/29314)) ([@​crenshaw-dev](https://redirect.github.com/crenshaw-dev)) - [`cc1f3ee`](https://redirect.github.com/argoproj/argo-cd/commit/cc1f3eef40dfee35842cc5a4c27a80b5f5dbe82e): fix(ui): show operation state on applications list page (cherry-pick release-3.5) ([#​29344](https://redirect.github.com/argoproj/argo-cd/issues/29344)) ([@​antonu17](https://redirect.github.com/antonu17)) - [`5accee3`](https://redirect.github.com/argoproj/argo-cd/commit/5accee3440f1a140de32071a035b783d653ce452): fix: don't degrade Cluster API Cluster health while Ready is False during provisioning (cherry-pick [#​29237](https://redirect.github.com/argoproj/argo-cd/issues/29237) for 3.5) ([#​29273](https://redirect.github.com/argoproj/argo-cd/issues/29273)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`4d99c52`](https://redirect.github.com/argoproj/argo-cd/commit/4d99c524afda80d091dff81e8745eb3365285874): fix: recover from kubectl panic in AuthReconcile when SA is forbidden (cherry-pick [#​28669](https://redirect.github.com/argoproj/argo-cd/issues/28669) for 3.5) ([#​29294](https://redirect.github.com/argoproj/argo-cd/issues/29294)) ([@​alexymantha](https://redirect.github.com/alexymantha)) ##### Dependency updates - [`8b9e270`](https://redirect.github.com/argoproj/argo-cd/commit/8b9e270fa2cefb4eb370609b38606bf1a3ae410e): chore(deps): update dependency dexidp/dex to v2.45.1 ([#​29334](https://redirect.github.com/argoproj/argo-cd/issues/29334)) ([@​nitishfy](https://redirect.github.com/nitishfy)) ##### Other work - [`e258ee2`](https://redirect.github.com/argoproj/argo-cd/commit/e258ee23c3e52266d407572f4bcdfe7d9ed36cb5): chore: bump version to 3.5.2 on release-3.5 branch ([#​29404](https://redirect.github.com/argoproj/argo-cd/issues/29404)) ([@​github-actions](https://redirect.github.com/github-actions)\[bot]) - [`a9d94d6`](https://redirect.github.com/argoproj/argo-cd/commit/a9d94d68c8a5bee4e1708f6640e7922b91736fec): fix(notification-controller): deep-copy before mutating object from a shared cache (cherry-pick [#​29350](https://redirect.github.com/argoproj/argo-cd/issues/29350) for 3.5) ([#​29354](https://redirect.github.com/argoproj/argo-cd/issues/29354)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`cc1d7a2`](https://redirect.github.com/argoproj/argo-cd/commit/cc1d7a2601ce87695808a2632687975a84900a54): fix(notification-controller): read appprojects from informer cache ([#​28815](https://redirect.github.com/argoproj/argo-cd/issues/28815)) (cherry-pick release-3.5) ([#​29345](https://redirect.github.com/argoproj/argo-cd/issues/29345)) ([@​antonu17](https://redirect.github.com/antonu17)) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 10 ++-------- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 10 ++-------- 4 files changed, 7 insertions(+), 19 deletions(-) diff --git a/NOTICE b/NOTICE index 99cfabcd6..6a0f02600 100644 --- a/NOTICE +++ b/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.1 +Version: v3.5.2 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.1/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.2/LICENSE ---------- Module: github.com/argoproj/pkg/v2 @@ -687,12 +687,6 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE ----------- -Module: github.com/google/go-github/v90/github -Version: v90.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE - ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 diff --git a/go.mod b/go.mod index 924558f1a..d80b02f8d 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( filippo.io/age v1.3.1 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/semver/v3 v3.5.0 - github.com/argoproj/argo-cd/v3 v3.5.1 + github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 github.com/codesphere-cloud/cs-go v1.32.0 github.com/creativeprojects/go-selfupdate v1.6.0 diff --git a/go.sum b/go.sum index 5e0e20278..9f9aa64ca 100644 --- a/go.sum +++ b/go.sum @@ -2922,8 +2922,8 @@ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d h1:/rO/uVUBn8ywSeYGDCXIIpKiCgxZ23+xshH+5UeuLUo= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d/go.mod h1:RsOM4gdM/lsvAfIuzAhYrnHDTLA1AGooZRzVyxbVT3A= -github.com/argoproj/argo-cd/v3 v3.5.1 h1:jtwPLEFX9mNj3jSq88ugFcScGnOZVs2DWaXFuZxrRT8= -github.com/argoproj/argo-cd/v3 v3.5.1/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= +github.com/argoproj/argo-cd/v3 v3.5.2 h1:vYtfW2pEBSL+smt8XdpVZHUg31uERINYH6eXzdiLCY4= +github.com/argoproj/argo-cd/v3 v3.5.2/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= github.com/argoproj/pkg/v2 v2.0.1 h1:O/gCETzB/3+/hyFL/7d/VM/6pSOIRWIiBOTb2xqAHvc= github.com/argoproj/pkg/v2 v2.0.1/go.mod h1:sdifF6sUTx9ifs38ZaiNMRJuMpSCBB9GulHfbPgQeRE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 99cfabcd6..6a0f02600 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.1 +Version: v3.5.2 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.1/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.2/LICENSE ---------- Module: github.com/argoproj/pkg/v2 @@ -687,12 +687,6 @@ Version: v88.0.0 License: BSD-3-Clause License URL: https://github.com/google/go-github/blob/v88.0.0/LICENSE ----------- -Module: github.com/google/go-github/v90/github -Version: v90.0.0 -License: BSD-3-Clause -License URL: https://github.com/google/go-github/blob/v90.0.0/LICENSE - ---------- Module: github.com/google/go-querystring/query Version: v1.2.0 From b8d48bdf492ad21c3e0c4a57df7e06bf1879bbd4 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:06:35 +0000 Subject: [PATCH 072/132] update(deps): update module cloud.google.com/go/compute to v1.67.0 (#753) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cloud.google.com/go/compute](https://redirect.github.com/googleapis/google-cloud-go) | `v1.66.0` → `v1.67.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2fcompute/v1.67.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2fcompute/v1.66.0/v1.67.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 6a0f02600..878eedd7d 100644 --- a/NOTICE +++ b/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/auth/oauth2adapt ---------- Module: cloud.google.com/go/compute -Version: v1.66.0 +Version: v1.67.0 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.66.0/compute/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.67.0/compute/LICENSE ---------- Module: cloud.google.com/go/compute/metadata diff --git a/go.mod b/go.mod index d80b02f8d..20b90dd31 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ replace ( require ( cloud.google.com/go/artifactregistry v1.26.0 - cloud.google.com/go/compute v1.66.0 + cloud.google.com/go/compute v1.67.0 cloud.google.com/go/iam v1.13.0 cloud.google.com/go/resourcemanager v1.16.0 cloud.google.com/go/serviceusage v1.15.0 diff --git a/go.sum b/go.sum index 9f9aa64ca..7d025f81a 100644 --- a/go.sum +++ b/go.sum @@ -692,8 +692,8 @@ cloud.google.com/go/compute v1.29.0/go.mod h1:HFlsDurE5DpQZClAGf/cYh+gxssMhBxBov cloud.google.com/go/compute v1.31.0/go.mod h1:4SCUCDAvOQvMGu4ze3YIJapnY0UQa5+WvJJeYFsQRoo= cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8= cloud.google.com/go/compute v1.34.0/go.mod h1:zWZwtLwZQyonEvIQBuIa0WvraMYK69J5eDCOw9VZU4g= -cloud.google.com/go/compute v1.66.0 h1:v8pAJeA0xYPe/tJDMcyimdnHZ115LVrw3xCi9ZelTNQ= -cloud.google.com/go/compute v1.66.0/go.mod h1:h1O3BCv0Zd0/8rZ6PGx8aRBhKBtDC0AuvURtWg1hLLE= +cloud.google.com/go/compute v1.67.0 h1:CdAcTBCWUCoymOxOCU5sAwsGekn3KWaHI6mBkAGLQOA= +cloud.google.com/go/compute v1.67.0/go.mod h1:h1O3BCv0Zd0/8rZ6PGx8aRBhKBtDC0AuvURtWg1hLLE= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6a0f02600..878eedd7d 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/auth/oauth2adapt ---------- Module: cloud.google.com/go/compute -Version: v1.66.0 +Version: v1.67.0 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.66.0/compute/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.67.0/compute/LICENSE ---------- Module: cloud.google.com/go/compute/metadata From 5a41502ef817063dde81148591924438d392b1cb Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 20:04:27 +0000 Subject: [PATCH 073/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.33.0 (#754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.32.0` → `v1.33.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.33.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.32.0/v1.33.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.33.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.33.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.32.0...v1.33.0) #### Changelog - [`984233b`](https://redirect.github.com/codesphere-cloud/cs-go/commit/984233b26a55423f7759ceb0e8af3ee5cdaa0f87) update(deps): update module github.com/onsi/gomega to v1.43.0 ([#​319](https://redirect.github.com/codesphere-cloud/cs-go/issues/319)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/NOTICE b/NOTICE index 878eedd7d..04639e9e9 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.32.0 +Version: v1.33.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.32.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.33.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -1067,9 +1067,9 @@ License URL: https://github.com/munnerz/goautoneg/blob/a7dc8b61c822/LICENSE ---------- Module: github.com/onsi/gomega -Version: v1.42.1 +Version: v1.43.0 License: MIT -License URL: https://github.com/onsi/gomega/blob/v1.42.1/LICENSE +License URL: https://github.com/onsi/gomega/blob/v1.43.0/LICENSE ---------- Module: github.com/opencontainers/go-digest diff --git a/go.mod b/go.mod index 20b90dd31..a335c6e28 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.32.0 + github.com/codesphere-cloud/cs-go v1.33.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 @@ -44,7 +44,7 @@ require ( github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible github.com/onsi/ginkgo/v2 v2.32.1 - github.com/onsi/gomega v1.42.1 + github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f github.com/spf13/cobra v1.10.2 diff --git a/go.sum b/go.sum index 7d025f81a..7dc00b37a 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.32.0 h1:A1hjWzVD7D5Oe6RgOHwcqBBANOwaAkywH3ceLmAgJEs= -github.com/codesphere-cloud/cs-go v1.32.0/go.mod h1:84IkBWiJlYjmxx0+ysJEeivGXFgj0KJFFM77OkTiee0= +github.com/codesphere-cloud/cs-go v1.33.0 h1:r1E9SPu++P50uWdMxnmznlvtRvhP1JTBUNrUfeVLo/A= +github.com/codesphere-cloud/cs-go v1.33.0/go.mod h1:Lr5sVT9hagHxu57CscNSHYDJ1YezBiTU0qomdlUXFr0= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -4499,8 +4499,8 @@ github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/onsi/gomega v1.42.1 h1:iN1rCUX+44NZ1Dc97MPoeFYbFR0vh8zxoxMFwKdyZ6I= -github.com/onsi/gomega v1.42.1/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= +github.com/onsi/gomega v1.43.0 h1:VlG/1FxqNxhSO+lq/OHBNaaqwiBK/mO8JbVkX9Y+FeU= +github.com/onsi/gomega v1.43.0/go.mod h1:REff/hsDsodHoKlWsP2mAPhu1+5/6hVYNf9rIEBpeSg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 878eedd7d..04639e9e9 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.32.0 +Version: v1.33.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.32.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.33.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl @@ -1067,9 +1067,9 @@ License URL: https://github.com/munnerz/goautoneg/blob/a7dc8b61c822/LICENSE ---------- Module: github.com/onsi/gomega -Version: v1.42.1 +Version: v1.43.0 License: MIT -License URL: https://github.com/onsi/gomega/blob/v1.42.1/LICENSE +License URL: https://github.com/onsi/gomega/blob/v1.43.0/LICENSE ---------- Module: github.com/opencontainers/go-digest From e59bfed8231ed37486b7fb69db4d6c6ffe8f419e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 23:55:13 +0000 Subject: [PATCH 074/132] update(deps): update module github.com/golangci/golangci-lint/v2 to v2.13.2 (#755) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/golangci/golangci-lint/v2](https://redirect.github.com/golangci/golangci-lint) | `v2.13.1` → `v2.13.2` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgolangci%2fgolangci-lint%2fv2/v2.13.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgolangci%2fgolangci-lint%2fv2/v2.13.1/v2.13.2?slim=true) | --- ### Release Notes
golangci/golangci-lint (github.com/golangci/golangci-lint/v2) ### [`v2.13.2`](https://redirect.github.com/golangci/golangci-lint/blob/HEAD/CHANGELOG.md#v2132) [Compare Source](https://redirect.github.com/golangci/golangci-lint/compare/v2.13.1...v2.13.2) *Released on 2026-08-28* 1. Bug fixes - Decrease cache entropy 2. Linters bug fixes - `iface`: from 1.5.0 to 1.5.1 - `staticcheck`: from 0.8.0 to 0.8.1 - `unparam`: from [`3f964bc`](https://redirect.github.com/golangci/golangci-lint/commit/3f964bcb5673) to [`2fa3d84`](https://redirect.github.com/golangci/golangci-lint/commit/2fa3d841b0c8) - `canonicalheader`: from v1.1.2 to a temporary fork
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index a335c6e28..22854a1fb 100644 --- a/go.mod +++ b/go.mod @@ -327,10 +327,11 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golangci/asciicheck v0.5.0 // indirect + github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect - github.com/golangci/golangci-lint/v2 v2.13.1 // indirect + github.com/golangci/golangci-lint/v2 v2.13.2 // indirect github.com/golangci/golines v0.15.0 // indirect github.com/golangci/misspell v0.8.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect @@ -439,7 +440,6 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lasiar/canonicalheader v1.1.2 // indirect github.com/ldez/exptostd v0.4.5 // indirect github.com/ldez/gomoddirectives v0.9.0 // indirect github.com/ldez/grignotin v0.10.1 // indirect @@ -586,7 +586,7 @@ require ( github.com/ultraware/funlen v0.2.0 // indirect github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.1 // indirect - github.com/uudashr/iface v1.5.0 // indirect + github.com/uudashr/iface v1.5.1 // indirect github.com/vektra/mockery/v3 v3.7.4 // indirect github.com/vmihailenco/go-tinylfu v0.2.2 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect @@ -651,7 +651,7 @@ require ( gopkg.in/validator.v2 v2.0.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - honnef.co/go/tools v0.8.0 // indirect + honnef.co/go/tools v0.8.1 // indirect k8s.io/apiextensions-apiserver v0.36.2 // indirect k8s.io/apiserver v0.36.4 // indirect k8s.io/cli-runtime v0.37.0 // indirect @@ -666,7 +666,7 @@ require ( k8s.io/streaming v0.36.4 // indirect lukechampine.com/blake3 v1.4.1 // indirect mvdan.cc/gofumpt v0.11.0 // indirect - mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 // indirect + mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 // indirect oras.land/oras-go/v2 v2.6.2 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/kind v0.32.0 // indirect diff --git a/go.sum b/go.sum index 7dc00b37a..7223cc666 100644 --- a/go.sum +++ b/go.sum @@ -3743,14 +3743,16 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0= github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ= +github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 h1:fVLolA3dG6s0brGetsiDAtcnpMSwVa2LqXJEw/9RJG4= +github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6/go.mod h1:1xo+NFW5S+bEf2DKXhaxuzvcDN5AR6o/KMwvqC5Mkpo= github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 h1:CbTB8KpqnViI6lIXxp03Oclc4VFHi3K4BWC1TacsZ+A= github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 h1:WL8YKrt3UbOBqSRU7GpP5BTtQTMWtVtj+mfPijgZeIg= github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792/go.mod h1:te5hX0dW4C5r6YbXs+6ysNr8Q5UTmdIqGbb+mlFiYmA= -github.com/golangci/golangci-lint/v2 v2.13.1 h1:RuM4OcluM4xFQcGuRE6R7jA33pqxK/W1EsBxpugdZjg= -github.com/golangci/golangci-lint/v2 v2.13.1/go.mod h1:HwX7mDzqHbcSxlhrTygjX1GJbAfQ3sJAqOx41qQlhDE= +github.com/golangci/golangci-lint/v2 v2.13.2 h1:bCyq3E4vo9qwzifjpzJqYndEt7Ncva80qkk8G2B4TXU= +github.com/golangci/golangci-lint/v2 v2.13.2/go.mod h1:5xaMd1kAxV7GSBPEyngw8gnnjoRocqW9UVKdBR6627w= github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= @@ -4257,8 +4259,6 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= -github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= github.com/ldez/gomoddirectives v0.9.0 h1:2YV/EX7nVlWL4jySusYTzBKHuE3D2fgcRsQuMa3yIoo= @@ -4950,8 +4950,8 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS4= github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= -github.com/uudashr/iface v1.5.0 h1:PgdMt4uAettGG8K/Kbamc4B9FABgUgnS3TLbl6fnjEk= -github.com/uudashr/iface v1.5.0/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= +github.com/uudashr/iface v1.5.1 h1:BS3yrgaT55s3dAtJoxuTnsZNbsejq/mVuzp49YDyfBA= +github.com/uudashr/iface v1.5.1/go.mod h1:5UWoT6SvTdTww/KToRj6clO+n4Kg3/NrAQvgOB+5Ggw= github.com/vektra/mockery/v3 v3.7.4 h1:t2qElHpzlKKJA63nrEmnkdwy+OaBV1t6uAf/YpHu4EU= github.com/vektra/mockery/v3 v3.7.4/go.mod h1:K+L72OoFVizA9eWtO4L+kU65oylgreiJEJ57Gu8g9Ew= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= @@ -6884,8 +6884,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -honnef.co/go/tools v0.8.0 h1:UacpzPr7D6i5BAjTkA7sNVcx4kIbhAZcQ4zYtKiXx68= -honnef.co/go/tools v0.8.0/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= +honnef.co/go/tools v0.8.1 h1:+JKf3xJ1ni4CwrhVg4/pqsfPGP6vNAXcKbMXJodYx3w= +honnef.co/go/tools v0.8.1/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= k8s.io/api v0.36.4 h1:RxrvqCL6vgH5/+UnTeu1IIFqYmGfy0hnyrod1rn35Oo= k8s.io/api v0.36.4/go.mod h1:S2B3orCFBDhrgyWbLeuKcT2QdHIpQesBkCYSlWtwUOw= k8s.io/apiextensions-apiserver v0.36.4 h1:SfvCVt+4CqKWvzuVytYDT5g9hyb9MztoiYELIkPVrFc= @@ -7005,8 +7005,8 @@ modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= mvdan.cc/gofumpt v0.11.0 h1:0H01XB95PnN2QgCSR9ELdZyTlJqNZ7181B0BTMh5VZc= mvdan.cc/gofumpt v0.11.0/go.mod h1:BeT5wCsOJt6J9zT2MZIOGszjUHzFkn1/l9g6xAzqsXo= -mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673 h1:dEE6li4OPIE54oojY2qaayFS1fSp17G14si0gXRxl0U= -mvdan.cc/unparam v0.0.0-20260818115549-3f964bcb5673/go.mod h1:62roFV3D3nYOWIXv3PfGO4UYEKAotz2WgLywT87ONd8= +mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 h1:Re1NRyLpiAt9kB+ImaaoapwWiQXrKwER4tY8fLOkDew= +mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8/go.mod h1:MrS/+zJ1M2xvGXhKktiHbNQeQPyg3Qel+KkzT+f7/i4= oras.land/oras-go/v2 v2.6.2 h1:N04RXngAp1LJKTG6ifz3xHPipasEkWr+hFmInja5YKo= oras.land/oras-go/v2 v2.6.2/go.mod h1:PlTtg4JTDJkDe8yVHpM2wz7/YDc00GVas+i4jAW2TZ4= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= From f0184cb67608577bb6398600948d084474e3153b Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:23:46 +0000 Subject: [PATCH 075/132] update(deps): update github.com/rook/rook/pkg/apis digest to 0707c25 (#751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `01bbd46` → `0707c25` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 04639e9e9..63b43710e 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260826094747-01bbd460392f +Version: v0.0.0-20260827185806-0707c25069e4 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/01bbd460392f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0707c25069e4/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 22854a1fb..3fa46c33c 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f + github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 7223cc666..e067a6ffd 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f h1:c5VjAG3YnAhMZj/B0qNdZ+dw0w30j5DoeUa2w5T1bcU= -github.com/rook/rook/pkg/apis v0.0.0-20260826094747-01bbd460392f/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4 h1:BU2xvKnUgoyzntfcdds7K6HpkgxdV4J0X6fNYCT2alE= +github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 04639e9e9..63b43710e 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260826094747-01bbd460392f +Version: v0.0.0-20260827185806-0707c25069e4 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/01bbd460392f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0707c25069e4/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 58860b1bfacef8a654ad172bf0c428ad93051b64 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:50:52 +0000 Subject: [PATCH 076/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.34.0 (#756) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.33.0` → `v1.34.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.34.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.33.0/v1.34.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.34.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.34.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.33.0...v1.34.0) #### Changelog - [`8210c2e`](https://redirect.github.com/codesphere-cloud/cs-go/commit/8210c2e000b87c2a2f9f908d109a537e6fc17e42) update(deps): update module github.com/golangci/golangci-lint/v2 to v2.13.2 ([#​310](https://redirect.github.com/codesphere-cloud/cs-go/issues/310)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 63b43710e..e24cc0d88 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.33.0 +Version: v1.34.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.33.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.34.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 3fa46c33c..8ab4cd9b3 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.33.0 + github.com/codesphere-cloud/cs-go v1.34.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index e067a6ffd..e603bf248 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.33.0 h1:r1E9SPu++P50uWdMxnmznlvtRvhP1JTBUNrUfeVLo/A= -github.com/codesphere-cloud/cs-go v1.33.0/go.mod h1:Lr5sVT9hagHxu57CscNSHYDJ1YezBiTU0qomdlUXFr0= +github.com/codesphere-cloud/cs-go v1.34.0 h1:NIFkxXx4eTgo8e6YooUNCxiB4LrockqbTk8RctxyEGI= +github.com/codesphere-cloud/cs-go v1.34.0/go.mod h1:lsoBVqpfZyMhPr63vNmyjNKMw1LdJOd+YR7vMNfh6Ps= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 63b43710e..e24cc0d88 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.33.0 +Version: v1.34.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.33.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.34.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 012b5255e5e7ed070f462be8d71b4fb939585daa Mon Sep 17 00:00:00 2001 From: Utku Erol Date: Fri, 28 Aug 2026 10:41:57 +0300 Subject: [PATCH 077/132] feat: add pc apps defaults to include managed service backends (#757) Have a single function to set all pc application values. Also enables rabbitmq-operator and ms-backend-k8s in pc-applications. See my PR to remove rabbitmq-operator and ms-backend-k8s from pc installer: https://github.com/codesphere-cloud/codesphere-monorepo/pull/21347 Signed-off-by: utkuerol --- internal/bootstrap/gcp/install_config.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 19c73ddc8..6b3beb085 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -204,7 +204,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { "cloud.google.com/load-balancer-ipv4": b.Env.PublicGatewayIP, } - b.applySshProxyConfig() + b.applyPcAppsDefaults() dnsProject := b.Env.DNSProjectID if b.Env.DNSProjectID == "" { @@ -427,7 +427,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { return nil } -func (b *GCPBootstrapper) applySshProxyConfig() { +func (b *GCPBootstrapper) applyPcAppsDefaults() { b.Env.InstallConfig.PcApps = util.DeepMergeMaps(b.Env.InstallConfig.PcApps, files.ChartValues{ "applications": map[string]any{ "ssh-workspace-proxy": map[string]any{ @@ -443,6 +443,12 @@ func (b *GCPBootstrapper) applySshProxyConfig() { }, }, }, + "rabbitmq-operator": map[string]any{ + "enabled": true, + }, + "ms-backend-k8s": map[string]any{ + "enabled": true, + }, }, }) } From 56e18e74d050ffcc72d7cab43379019b72fe7aff Mon Sep 17 00:00:00 2001 From: Utku Erol Date: Fri, 28 Aug 2026 15:47:18 +0300 Subject: [PATCH 078/132] feat!: move default managed service config from installer to gcp bootstrap (#758) We were (imo) wrongly setting a default list of managed service providers, if the config didn't include any. This is very opinionated for OMS to decide, if we should have always enabled per default managed service providers, then this should be decided at application layer instead of the installer. But in general, i don't think we need or want something like this. This PR moves the default managed service config from the installer to GCP bootstrap, which is the only place where we actually need to set something in OMS code directly (for now). BREAKING CHANGE: if someone was ever installing codesphere with omitted `managedServices` section, they won't get any managed services on their CS instance. I checked all prod environments, and they all explicitly enable managed service providers and opt-in to specific providers. So, this won't break any CS instance known to me. --------- Signed-off-by: utkuerol --- internal/bootstrap/gcp/install_config.go | 13 +++++++++++++ internal/installer/config_manager_profile.go | 9 --------- internal/installer/config_manager_profile_test.go | 5 ++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 6b3beb085..9292fac13 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -205,6 +205,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { } b.applyPcAppsDefaults() + b.applyManagedServiceDefaults() dnsProject := b.Env.DNSProjectID if b.Env.DNSProjectID == "" { @@ -453,6 +454,18 @@ func (b *GCPBootstrapper) applyPcAppsDefaults() { }) } +func (b *GCPBootstrapper) applyManagedServiceDefaults() { + if b.Env.InstallConfig.Codesphere.ManagedServices == nil { + b.Env.InstallConfig.Codesphere.ManagedServices = []files.ManagedServiceConfig{ + {Name: "postgres", Version: "v1"}, + {Name: "babelfish", Version: "v1"}, + {Name: "s3", Version: "v1"}, + {Name: "virtual-k8s", Version: "v1"}, + {Name: "ferretdb", Version: "v0"}, + } + } +} + func (b *GCPBootstrapper) applyExternalLokiConfig() { if b.Env.ExternalLokiEndpoint == "" { return diff --git a/internal/installer/config_manager_profile.go b/internal/installer/config_manager_profile.go index 50dd7c442..4da3a43a0 100644 --- a/internal/installer/config_manager_profile.go +++ b/internal/installer/config_manager_profile.go @@ -186,15 +186,6 @@ func (g *InstallConfig) applyCommonProperties() { } else if g.Config.ManagedServiceBackends.Postgres == nil { g.Config.ManagedServiceBackends.Postgres = &files.PgManagedServiceConfig{} } - if g.Config.Codesphere.ManagedServices == nil { - g.Config.Codesphere.ManagedServices = []files.ManagedServiceConfig{ - {Name: "postgres", Version: "v1"}, - {Name: "babelfish", Version: "v1"}, - {Name: "s3", Version: "v1"}, - {Name: "virtual-k8s", Version: "v1"}, - {Name: "ferretdb", Version: "v0"}, - } - } if g.Config.Secrets.BaseDir == "" { g.Config.Secrets.BaseDir = "/root/secrets" } diff --git a/internal/installer/config_manager_profile_test.go b/internal/installer/config_manager_profile_test.go index 246a22325..fc7ccc5e7 100644 --- a/internal/installer/config_manager_profile_test.go +++ b/internal/installer/config_manager_profile_test.go @@ -149,9 +149,8 @@ var _ = Describe("ConfigManagerProfile", func() { Expect(config.ManagedServiceBackends).ToNot(BeNil()) Expect(config.ManagedServiceBackends.Postgres).ToNot(BeNil()) - // Managed service config - Expect(config.Codesphere.ManagedServices).ToNot(BeNil()) - Expect(len(config.Codesphere.ManagedServices)).To(Equal(5)) + // Managed service config is opt-in, with no defaults + Expect(config.Codesphere.ManagedServices).To(BeNil()) // Secrets Expect(config.Secrets.BaseDir).To(Equal("/root/secrets")) From 2d87293c29e5b57046ce25c06b5d1b4530a73d1c Mon Sep 17 00:00:00 2001 From: Utku Erol Date: Fri, 28 Aug 2026 17:32:22 +0300 Subject: [PATCH 079/132] chore: add new providers to GCP bootstrap defaults (#760) These will be used in QA, since we're now working towards making these "preview ready". --------- Signed-off-by: utkuerol --- internal/bootstrap/gcp/gcp_test.go | 2 -- internal/bootstrap/gcp/install_config.go | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/bootstrap/gcp/gcp_test.go b/internal/bootstrap/gcp/gcp_test.go index 43edc3ccd..41bacb596 100644 --- a/internal/bootstrap/gcp/gcp_test.go +++ b/internal/bootstrap/gcp/gcp_test.go @@ -293,8 +293,6 @@ var _ = Describe("GCP Bootstrapper", func() { Expect(cpNode.GetExternalIP()).To(Equal("1.2.3.4")) Expect(cpNode.GetInternalIP()).To(Equal("10.0.0.1")) } - - Expect(len(bs.Env.InstallConfig.Codesphere.ManagedServices)).To(Equal(5)) }) }) diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 9292fac13..03a2b7fe4 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -462,6 +462,10 @@ func (b *GCPBootstrapper) applyManagedServiceDefaults() { {Name: "s3", Version: "v1"}, {Name: "virtual-k8s", Version: "v1"}, {Name: "ferretdb", Version: "v0"}, + {Name: "opensearch", Version: "v0"}, + {Name: "valkey", Version: "v0"}, + {Name: "rabbitmq", Version: "v0"}, + {Name: "url-shortener", Version: "v0"}, } } } From 6cf91dc795e96da8634953a745c57d447731c388 Mon Sep 17 00:00:00 2001 From: Utku Erol Date: Fri, 28 Aug 2026 18:35:46 +0300 Subject: [PATCH 080/132] chore: enable ms-backend-opensearch on gcp bootstrap (#761) So that we can test it on QA environment before enabling elsewhere. Signed-off-by: utkuerol --- internal/bootstrap/gcp/install_config.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 03a2b7fe4..23f7bf1cd 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -450,6 +450,9 @@ func (b *GCPBootstrapper) applyPcAppsDefaults() { "ms-backend-k8s": map[string]any{ "enabled": true, }, + "ms-backend-opensearch": map[string]any{ + "enabled": true, + }, }, }) } From d65117fce11185e7ed13caf94d001f31d6d75aab Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 19:01:59 +0000 Subject: [PATCH 081/132] update(deps): update module google.golang.org/api to v0.295.0 (#762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/api](https://redirect.github.com/googleapis/google-api-go-client) | `v0.294.0` → `v0.295.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fapi/v0.295.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fapi/v0.294.0/v0.295.0?slim=true) | --- ### Release Notes
googleapis/google-api-go-client (google.golang.org/api) ### [`v0.295.0`](https://redirect.github.com/googleapis/google-api-go-client/releases/tag/v0.295.0) [Compare Source](https://redirect.github.com/googleapis/google-api-go-client/compare/v0.294.0...v0.295.0) ##### Features - **all:** Auto-regenerate discovery clients ([#​3715](https://redirect.github.com/googleapis/google-api-go-client/issues/3715)) ([ddc3759](https://redirect.github.com/googleapis/google-api-go-client/commit/ddc3759c9d2481a16aa1b9994603f409c72a27a3)) - **all:** Auto-regenerate discovery clients ([#​3717](https://redirect.github.com/googleapis/google-api-go-client/issues/3717)) ([9e79798](https://redirect.github.com/googleapis/google-api-go-client/commit/9e7979872411b52ae54cb6a6ac771a5008522dff))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NOTICE b/NOTICE index e24cc0d88..5b2ee546e 100644 --- a/NOTICE +++ b/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.294.0 +Version: v0.295.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.294.0 +Version: v0.295.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis diff --git a/go.mod b/go.mod index 8ab4cd9b3..51f792ced 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 - google.golang.org/api v0.294.0 + google.golang.org/api v0.295.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index e603bf248..680d5e9cc 100644 --- a/go.sum +++ b/go.sum @@ -6258,8 +6258,8 @@ google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1Gk google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/api v0.294.0 h1:8gASjJxdtcIieB3OqbkLcF0FfbXVNqKtU5iozD1ssvA= -google.golang.org/api v0.294.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= +google.golang.org/api v0.295.0 h1:SSqFeEVjnK5SKo6t7D0E0M7EfX8SP7K0+OJd2Ly5FzU= +google.golang.org/api v0.295.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index e24cc0d88..5b2ee546e 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.294.0 +Version: v0.295.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.294.0 +Version: v0.295.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.294.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis From 6f01ce0c47d2d456506ff247d321f4a707adf10e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Sat, 29 Aug 2026 19:03:35 +0000 Subject: [PATCH 082/132] update(deps): update module filippo.io/age to v1.3.2 (#763) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [filippo.io/age](https://redirect.github.com/FiloSottile/age) | `v1.3.1` → `v1.3.2` | ![age](https://developer.mend.io/api/mc/badges/age/go/filippo.io%2fage/v1.3.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/filippo.io%2fage/v1.3.1/v1.3.2?slim=true) | --- ### Release Notes
FiloSottile/age (filippo.io/age) ### [`v1.3.2`](https://redirect.github.com/FiloSottile/age/releases/tag/v1.3.2): age v1.3.2 [Compare Source](https://redirect.github.com/FiloSottile/age/compare/v1.3.1...v1.3.2) age v1.3.2 is a minor release with a wide range of fixes and hardening improvements. Some previously-accepted inputs are now rejected: headers over 2 MiB or 1024 recipients, malformed SSH keys in recipients files, and non-UTF-8 plaintext written to a terminal (force with `-o -`). Pre-built binaries now cover windows/arm64 and darwin/amd64, and release archives include the compatibility plugins (age-plugin-pq, age-plugin-tag, and age-plugin-tagpq).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 8 ++++---- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/NOTICE b/NOTICE index 5b2ee546e..47473fb60 100644 --- a/NOTICE +++ b/NOTICE @@ -71,9 +71,9 @@ License URL: https://github.com/imdario/mergo/blob/v1.0.2/LICENSE ---------- Module: filippo.io/age -Version: v1.3.1 +Version: v1.3.2 License: BSD-3-Clause -License URL: https://github.com/FiloSottile/age/blob/v1.3.1/LICENSE +License URL: https://github.com/FiloSottile/age/blob/v1.3.2/LICENSE ---------- Module: filippo.io/edwards25519 diff --git a/go.mod b/go.mod index 51f792ced..af5684c5c 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( cloud.google.com/go/iam v1.13.0 cloud.google.com/go/resourcemanager v1.16.0 cloud.google.com/go/serviceusage v1.15.0 - filippo.io/age v1.3.1 + filippo.io/age v1.3.2 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 diff --git a/go.sum b/go.sum index 680d5e9cc..09d16a121 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-2023072100362 buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U= buf.build/go/protovalidate v0.12.0/go.mod h1:q3PFfbzI05LeqxSwq+begW2syjy2Z6hLxZSkP1OH/D0= -c2sp.org/CCTV/age v0.0.0-20251208015420-e9274a7bdbfd h1:ZLsPO6WdZ5zatV4UfVpr7oAwLGRZ+sebTUruuM4Ra3M= -c2sp.org/CCTV/age v0.0.0-20251208015420-e9274a7bdbfd/go.mod h1:SrHC2C7r5GkDk8R+NFVzYy/sdj0Ypg9htaPXQq5Cqeo= +c2sp.org/CCTV/age v0.0.0-20260829155415-4448f2097b2d h1:Blprhc2SbChNZtWcU+BLTM4YdoqYAS9V7cJgOwJKyAs= +c2sp.org/CCTV/age v0.0.0-20260829155415-4448f2097b2d/go.mod h1:SrHC2C7r5GkDk8R+NFVzYy/sdj0Ypg9htaPXQq5Cqeo= cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= @@ -2667,8 +2667,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20221208032759-85de2813cf6b/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= -filippo.io/age v1.3.1 h1:hbzdQOJkuaMEpRCLSN1/C5DX74RPcNCk6oqhKMXmZi0= -filippo.io/age v1.3.1/go.mod h1:EZorDTYUxt836i3zdori5IJX/v2Lj6kWFU0cfh6C0D4= +filippo.io/age v1.3.2 h1:r6RSZLFSMm6rzKepZ7ZAYkKCu14f3/Me8c7uKYh7C8c= +filippo.io/age v1.3.2/go.mod h1:TH/Yr2sSRhCKbaH4XPxpUV0Us8Gv6txYUpiZQWz8Evk= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 5b2ee546e..47473fb60 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -71,9 +71,9 @@ License URL: https://github.com/imdario/mergo/blob/v1.0.2/LICENSE ---------- Module: filippo.io/age -Version: v1.3.1 +Version: v1.3.2 License: BSD-3-Clause -License URL: https://github.com/FiloSottile/age/blob/v1.3.1/LICENSE +License URL: https://github.com/FiloSottile/age/blob/v1.3.2/LICENSE ---------- Module: filippo.io/edwards25519 From 841f091958da9bf6830828c08849116f7f355f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Naz=C4=B1m=20Umut=20Ekici?= <42119171+Emut@users.noreply.github.com> Date: Mon, 31 Aug 2026 16:19:34 +0200 Subject: [PATCH 083/132] feat(gcp): enable KubeVirt/CDI for GCP QA installs (#737) - Enable `kubevirt-operator`, `kubevirt-cr`, `cdi-operator`, `cdi-cr` in `pcApps` for every GCP bootstrap, same pattern as `applySshProxyConfig`. - Add `virtual-machines` to `DefaultPreviewFlags` so the VM feature is available on GCP QA clusters. Signed-off-by: uekici --- docs/oms_beta_bootstrap-gcp.md | 2 +- docs/oms_beta_bootstrap-local.md | 2 +- internal/bootstrap/gcp/gcp.go | 1 + internal/bootstrap/gcp/install_config.go | 14 ++++++++++++++ internal/bootstrap/gcp/install_config_test.go | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/oms_beta_bootstrap-gcp.md b/docs/oms_beta_bootstrap-gcp.md index fd6e88e75..096b3081d 100644 --- a/docs/oms_beta_bootstrap-gcp.md +++ b/docs/oms_beta_bootstrap-gcp.md @@ -66,7 +66,7 @@ oms beta bootstrap-gcp [flags] --openbao-uri string URI for OpenBao (optional) --openbao-user string OpenBao username (optional) (default "admin") --preemptible Use preemptible VMs for Codesphere infrastructure. Mutually exclusive with --spot-vms (default: false) - --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh]) + --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh,virtual-machines]) --project-name string Unique GCP Project Name (required) --project-ttl string Time to live for the GCP project. Cleanup workflows will remove it afterwards. (default: 2 hours) (default "2h") --prometheus-remote-write-password string Prometheus remote write password stored in the generated vault (optional) diff --git a/docs/oms_beta_bootstrap-local.md b/docs/oms_beta_bootstrap-local.md index 3dbb5d8c9..9551845c5 100644 --- a/docs/oms_beta_bootstrap-local.md +++ b/docs/oms_beta_bootstrap-local.md @@ -29,7 +29,7 @@ oms beta bootstrap-local [flags] --internal-flags stringArray Internal flags to enable in Codesphere installation (optional) (default [headless-services,vcluster,custom-service-image,ms-in-ls]) --k0s Use k0s-specific configuration (required to deploy to k0s clusters) --pod-cidr string Service CIDR of the Kubernetes cluster. If not specified, OMS will try to determine it. - --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh]) + --preview-flags stringArray Preview flags to enable in Codesphere installation (optional) (default [openfga-authz,cluster-admin,secret-management,sub-path-mount,workspace-ssh,virtual-machines]) --profile string Profile to apply to the install config like resources (supported: dev, minimal, prod) (default "dev") --registry-url string OCI registry URL used for the ArgoCD helm pull secret (default "oci://ghcr.io/codesphere-cloud/charts") --registry-user string Custom Registry username diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index 2902070ca..06dd4b7ae 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -82,6 +82,7 @@ var DefaultPreviewFlags []string = []string{ "secret-management", "sub-path-mount", "workspace-ssh", + "virtual-machines", } var DefaultFeatureFlags []string = []string{} diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 23f7bf1cd..76864504d 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -453,6 +453,20 @@ func (b *GCPBootstrapper) applyPcAppsDefaults() { "ms-backend-opensearch": map[string]any{ "enabled": true, }, + // KubeVirt and CDI are needed for VM image import/DataVolumes; the + // pc-applications chart ships both disabled by default. + "kubevirt-operator": map[string]any{ + "enabled": true, + }, + "kubevirt-cr": map[string]any{ + "enabled": true, + }, + "cdi-operator": map[string]any{ + "enabled": true, + }, + "cdi-cr": map[string]any{ + "enabled": true, + }, }, }) } diff --git a/internal/bootstrap/gcp/install_config_test.go b/internal/bootstrap/gcp/install_config_test.go index 9655fc1c4..30bb50e62 100644 --- a/internal/bootstrap/gcp/install_config_test.go +++ b/internal/bootstrap/gcp/install_config_test.go @@ -339,6 +339,11 @@ var _ = Describe("Installconfig & Secrets", func() { sshProxyAnnotations := sshProxyService["annotations"].(map[string]interface{}) Expect(sshProxyAnnotations["cloud.google.com/load-balancer-ipv4"]).To(Equal("3.3.3.3")) + Expect(applications["kubevirt-operator"].(map[string]interface{})["enabled"]).To(Equal(true)) + Expect(applications["kubevirt-cr"].(map[string]interface{})["enabled"]).To(Equal(true)) + Expect(applications["cdi-operator"].(map[string]interface{})["enabled"]).To(Equal(true)) + Expect(applications["cdi-cr"].(map[string]interface{})["enabled"]).To(Equal(true)) + Expect(bs.Env.InstallConfig.Datacenter.ID).To(Equal(1)) Expect(bs.Env.InstallConfig.Datacenter.Name).To(Equal("dev")) Expect(bs.Env.InstallConfig.Codesphere.Domain).To(Equal("cs.example.com")) From 57c892c46cbadcf97e96a842359d8631a7d0783a Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 17:01:43 +0000 Subject: [PATCH 084/132] update(deps): update github.com/rook/rook/pkg/apis digest to 9cbf3c4 (#764) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `0707c25` → `9cbf3c4` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 47473fb60..3b96cf49b 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260827185806-0707c25069e4 +Version: v0.0.0-20260831155005-9cbf3c45312d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0707c25069e4/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/9cbf3c45312d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index af5684c5c..f30eb2f78 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4 + github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 09d16a121..50519aa54 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4 h1:BU2xvKnUgoyzntfcdds7K6HpkgxdV4J0X6fNYCT2alE= -github.com/rook/rook/pkg/apis v0.0.0-20260827185806-0707c25069e4/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d h1:Q7Uw/bpkaTpXPHq4WXQo6GZdyVs4g5dzgyNk/xzwM6s= +github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 47473fb60..3b96cf49b 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260827185806-0707c25069e4 +Version: v0.0.0-20260831155005-9cbf3c45312d License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0707c25069e4/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/9cbf3c45312d/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From bfce56607e690f6735c76690c408e382274a6868 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:01:07 +0000 Subject: [PATCH 085/132] update(deps): update github.com/rook/rook/pkg/apis digest to 5471e1d (#766) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `9cbf3c4` → `5471e1d` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 3b96cf49b..6389f8645 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260831155005-9cbf3c45312d +Version: v0.0.0-20260831181021-5471e1d9b6a1 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/9cbf3c45312d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5471e1d9b6a1/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index f30eb2f78..648484cdf 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d + github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 50519aa54..4f92485d6 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d h1:Q7Uw/bpkaTpXPHq4WXQo6GZdyVs4g5dzgyNk/xzwM6s= -github.com/rook/rook/pkg/apis v0.0.0-20260831155005-9cbf3c45312d/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1 h1:Oq22CH4ar6jjGjgJ49uCVg2AcWGnyc9ivxFRDQxF3CY= +github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3b96cf49b..6389f8645 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260831155005-9cbf3c45312d +Version: v0.0.0-20260831181021-5471e1d9b6a1 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/9cbf3c45312d/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/5471e1d9b6a1/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From fdc4e52d04cda94ff92b7fafc6c813bebbf05cc2 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 21:02:19 +0000 Subject: [PATCH 086/132] update(deps): update module google.golang.org/api to v0.296.0 (#765) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/api](https://redirect.github.com/googleapis/google-api-go-client) | `v0.295.0` → `v0.296.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fapi/v0.296.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fapi/v0.295.0/v0.296.0?slim=true) | --- ### Release Notes
googleapis/google-api-go-client (google.golang.org/api) ### [`v0.296.0`](https://redirect.github.com/googleapis/google-api-go-client/releases/tag/v0.296.0) [Compare Source](https://redirect.github.com/googleapis/google-api-go-client/compare/v0.295.0...v0.296.0) ##### Features - **all:** Auto-regenerate discovery clients ([#​3718](https://redirect.github.com/googleapis/google-api-go-client/issues/3718)) ([6d6e873](https://redirect.github.com/googleapis/google-api-go-client/commit/6d6e8730a5301a880132270f735a8b159e1eb4b5)) - **all:** Auto-regenerate discovery clients ([#​3720](https://redirect.github.com/googleapis/google-api-go-client/issues/3720)) ([3264fb2](https://redirect.github.com/googleapis/google-api-go-client/commit/3264fb29afb37ebef526bab5595a2d50d68fd441)) - **all:** Auto-regenerate discovery clients ([#​3722](https://redirect.github.com/googleapis/google-api-go-client/issues/3722)) ([bfa0bef](https://redirect.github.com/googleapis/google-api-go-client/commit/bfa0befbbbea8f683fe1c2d995eac1facbc03388))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NOTICE b/NOTICE index 6389f8645..e4581c2c9 100644 --- a/NOTICE +++ b/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.295.0 +Version: v0.296.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.295.0 +Version: v0.296.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis diff --git a/go.mod b/go.mod index 648484cdf..5ee9ff434 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 - google.golang.org/api v0.295.0 + google.golang.org/api v0.296.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 4f92485d6..bef948b8e 100644 --- a/go.sum +++ b/go.sum @@ -6258,8 +6258,8 @@ google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1Gk google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/api v0.295.0 h1:SSqFeEVjnK5SKo6t7D0E0M7EfX8SP7K0+OJd2Ly5FzU= -google.golang.org/api v0.295.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= +google.golang.org/api v0.296.0 h1:Nn5EHeKdGx70MFClaV/II0gsWUm6xhEjb0xYLylVvaA= +google.golang.org/api v0.296.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6389f8645..e4581c2c9 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.295.0 +Version: v0.296.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.295.0 +Version: v0.296.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.295.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis From 94128219db8243c14e3df0c052b3ca4a3735a591 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 17:01:19 +0000 Subject: [PATCH 087/132] update(deps): update github.com/rook/rook/pkg/apis digest to a53e536 (#767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `5471e1d` → `a53e536` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index e4581c2c9..bb97aae7a 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260831181021-5471e1d9b6a1 +Version: v0.0.0-20260901154209-a53e536d200c License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5471e1d9b6a1/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/a53e536d200c/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 5ee9ff434..d59b8c56c 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1 + github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index bef948b8e..3e9754871 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1 h1:Oq22CH4ar6jjGjgJ49uCVg2AcWGnyc9ivxFRDQxF3CY= -github.com/rook/rook/pkg/apis v0.0.0-20260831181021-5471e1d9b6a1/go.mod h1:gu9nBzjqYQuvEIActE40PyU8YoRS7Rgm49l4dntW7Mk= +github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c h1:J6AXnQx0tmOlaf3q/o+5bziQTZfqvZpZpY9S3CvmvDo= +github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c/go.mod h1:lV3oMtngPMBHWpQbEamhiFg+3X5SJdqhg1Rgvr8SBlU= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index e4581c2c9..bb97aae7a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260831181021-5471e1d9b6a1 +Version: v0.0.0-20260901154209-a53e536d200c License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/5471e1d9b6a1/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/a53e536d200c/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 9e394b586182a44bfe90a77aa053892ceb4b678f Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 19:02:08 +0000 Subject: [PATCH 088/132] update(deps): update github.com/rook/rook/pkg/apis digest to b3e997f (#768) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `a53e536` → `b3e997f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index bb97aae7a..cc9152867 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901154209-a53e536d200c +Version: v0.0.0-20260901165719-b3e997fc48ae License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/a53e536d200c/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/b3e997fc48ae/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index d59b8c56c..cb56f5cbe 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c + github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 3e9754871..1a61a2920 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c h1:J6AXnQx0tmOlaf3q/o+5bziQTZfqvZpZpY9S3CvmvDo= -github.com/rook/rook/pkg/apis v0.0.0-20260901154209-a53e536d200c/go.mod h1:lV3oMtngPMBHWpQbEamhiFg+3X5SJdqhg1Rgvr8SBlU= +github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae h1:mQeiLA+fQTrPfdazNd9/Edc8EJILjbcIot75S9SJcyY= +github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index bb97aae7a..cc9152867 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901154209-a53e536d200c +Version: v0.0.0-20260901165719-b3e997fc48ae License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/a53e536d200c/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/b3e997fc48ae/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From fa4e78e3d4ded27f8b3a94292b6fb42d032a6f62 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 22:34:12 +0000 Subject: [PATCH 089/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.35.0 (#770) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.34.0` → `v1.35.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.35.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.34.0/v1.35.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.35.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.35.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.34.0...v1.35.0) #### Changelog - [`8b83a9b`](https://redirect.github.com/codesphere-cloud/cs-go/commit/8b83a9b121ae853cdbd9fe025464959eb9bf126e) update(deps): update go module directive to v1.27.1 ([#​320](https://redirect.github.com/codesphere-cloud/cs-go/issues/320)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 4 ++-- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/NOTICE b/NOTICE index cc9152867..3efd4e6f8 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.34.0 +Version: v1.35.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.34.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.35.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index cb56f5cbe..425633eff 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/codesphere-cloud/oms -go 1.27.0 +go 1.27.1 replace ( // GoReleaser pulls github.com/chrismellard/docker-credential-acr-env, @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.34.0 + github.com/codesphere-cloud/cs-go v1.35.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 1a61a2920..ca13e4d2c 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.34.0 h1:NIFkxXx4eTgo8e6YooUNCxiB4LrockqbTk8RctxyEGI= -github.com/codesphere-cloud/cs-go v1.34.0/go.mod h1:lsoBVqpfZyMhPr63vNmyjNKMw1LdJOd+YR7vMNfh6Ps= +github.com/codesphere-cloud/cs-go v1.35.0 h1:kz57b/8g3BBnb3v4n1/NMrTIDlafBIK60GHZbyX4hTo= +github.com/codesphere-cloud/cs-go v1.35.0/go.mod h1:AWBNqVE/u8kLhojXr7MM27bhRhPKEz8DMYbeHsOFRqM= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index cc9152867..3efd4e6f8 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.34.0 +Version: v1.35.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.34.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.35.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 710af2be7523a20c8e6455af05a48041c4d32b05 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 00:01:23 +0000 Subject: [PATCH 090/132] update(deps): update github.com/rook/rook/pkg/apis digest to 98b201f (#771) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `b3e997f` → `98b201f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 3efd4e6f8..24cc8a031 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901165719-b3e997fc48ae +Version: v0.0.0-20260901223245-98b201f3e829 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/b3e997fc48ae/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/98b201f3e829/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 425633eff..a7bc7e289 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae + github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index ca13e4d2c..22c012ef1 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae h1:mQeiLA+fQTrPfdazNd9/Edc8EJILjbcIot75S9SJcyY= -github.com/rook/rook/pkg/apis v0.0.0-20260901165719-b3e997fc48ae/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= +github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829 h1:lURlXCfKpxdiulRXHI8ih4vk0vOa6W3zsgrYUwJC5J8= +github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3efd4e6f8..24cc8a031 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901165719-b3e997fc48ae +Version: v0.0.0-20260901223245-98b201f3e829 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/b3e997fc48ae/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/98b201f3e829/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 3943f59beeacc6247439ffbbaa795187ddc6c947 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 01:33:53 +0000 Subject: [PATCH 091/132] update(deps): update module google.golang.org/api to v0.297.0 (#772) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/api](https://redirect.github.com/googleapis/google-api-go-client) | `v0.296.0` → `v0.297.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fapi/v0.297.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fapi/v0.296.0/v0.297.0?slim=true) | --- ### Release Notes
googleapis/google-api-go-client (google.golang.org/api) ### [`v0.297.0`](https://redirect.github.com/googleapis/google-api-go-client/releases/tag/v0.297.0) [Compare Source](https://redirect.github.com/googleapis/google-api-go-client/compare/v0.296.0...v0.297.0) ##### Features - Move to go1.26.0 as the lowest supported go version ([#​3724](https://redirect.github.com/googleapis/google-api-go-client/issues/3724)) ([7770e01](https://redirect.github.com/googleapis/google-api-go-client/commit/7770e01ef389ba48386a38befceca28a60ab3d1a))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NOTICE b/NOTICE index 24cc8a031..7e5c9a75e 100644 --- a/NOTICE +++ b/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.296.0 +Version: v0.297.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.296.0 +Version: v0.297.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis diff --git a/go.mod b/go.mod index a7bc7e289..544d9d11e 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 - google.golang.org/api v0.296.0 + google.golang.org/api v0.297.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 22c012ef1..2bf0bfaf0 100644 --- a/go.sum +++ b/go.sum @@ -6258,8 +6258,8 @@ google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1Gk google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/api v0.296.0 h1:Nn5EHeKdGx70MFClaV/II0gsWUm6xhEjb0xYLylVvaA= -google.golang.org/api v0.296.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= +google.golang.org/api v0.297.0 h1:WktxTsnnx0yZNnsR6j0q6hR21RnnK81FHTOPy/ux4OE= +google.golang.org/api v0.297.0/go.mod h1:S4m8x0M6OkQpkOzGk1y9JG2sm4fFQrMh6dxzjCTszhE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 24cc8a031..7e5c9a75e 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.296.0 +Version: v0.297.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.296.0 +Version: v0.297.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.296.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis From d0889956fbe3054b7c4e24d73ae04d38cc84295c Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 11:03:10 +0000 Subject: [PATCH 092/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.36.0 (#773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.35.0` → `v1.36.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.36.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.35.0/v1.36.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.36.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.36.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.35.0...v1.36.0) #### Changelog - [`2b3140c`](https://redirect.github.com/codesphere-cloud/cs-go/commit/2b3140c4c9af134961a4f5e39079bfb66dbaba8a) update(deps): update module google.golang.org/grpc to v1.83.1 \[security] ([#​321](https://redirect.github.com/codesphere-cloud/cs-go/issues/321)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 7e5c9a75e..90384a2ec 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.35.0 +Version: v1.36.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.35.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.36.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 544d9d11e..133e96d57 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.35.0 + github.com/codesphere-cloud/cs-go v1.36.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 2bf0bfaf0..2423a7905 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.35.0 h1:kz57b/8g3BBnb3v4n1/NMrTIDlafBIK60GHZbyX4hTo= -github.com/codesphere-cloud/cs-go v1.35.0/go.mod h1:AWBNqVE/u8kLhojXr7MM27bhRhPKEz8DMYbeHsOFRqM= +github.com/codesphere-cloud/cs-go v1.36.0 h1:r+ap6o4+KlJ8ns7xsQiJ94+Z622hROFq/bVGzwnfiC8= +github.com/codesphere-cloud/cs-go v1.36.0/go.mod h1:EutNQFD4M44L/kvK5JkexjoOfPY7v3843W9IAfm5iZU= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 7e5c9a75e..90384a2ec 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.35.0 +Version: v1.36.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.35.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.36.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 227871002d433ea073709da2b2d8cc18a00963c5 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 18:03:21 +0000 Subject: [PATCH 093/132] update(deps): update github.com/rook/rook/pkg/apis digest to 844566b (#774) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `98b201f` → `844566b` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 90384a2ec..d9ba6fcde 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901223245-98b201f3e829 +Version: v0.0.0-20260902163555-844566b0af98 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/98b201f3e829/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/844566b0af98/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 133e96d57..a6174a292 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829 + github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 2423a7905..6382a4b60 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829 h1:lURlXCfKpxdiulRXHI8ih4vk0vOa6W3zsgrYUwJC5J8= -github.com/rook/rook/pkg/apis v0.0.0-20260901223245-98b201f3e829/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= +github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98 h1:6vNH7Xk22prTiQzuOHhY8psJ4sxcOy/1AMioGqGfuv8= +github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 90384a2ec..d9ba6fcde 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260901223245-98b201f3e829 +Version: v0.0.0-20260902163555-844566b0af98 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/98b201f3e829/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/844566b0af98/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 54f38ebb75ad01a65197c591776dac4a346c6c00 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:03:45 +0000 Subject: [PATCH 094/132] update(deps): update module golang.org/x/crypto to v0.56.0 (#775) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto) | [`v0.55.0` → `v0.56.0`](https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.55.0...refs/tags/v0.56.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fcrypto/v0.56.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fcrypto/v0.55.0/v0.56.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index d9ba6fcde..65cacaafc 100644 --- a/NOTICE +++ b/NOTICE @@ -1451,9 +1451,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.55.0 +Version: v0.56.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.55.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver diff --git a/go.mod b/go.mod index a6174a292..d65c76072 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 - golang.org/x/crypto v0.55.0 + golang.org/x/crypto v0.56.0 golang.org/x/mod v0.40.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 diff --git a/go.sum b/go.sum index 6382a4b60..20e8fa1d5 100644 --- a/go.sum +++ b/go.sum @@ -5369,8 +5369,8 @@ golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+ golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= -golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= -golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= +golang.org/x/crypto v0.56.0 h1:GUh5Ii4J5jtcseSMiRqr1jXCNHoxjeV9Fmekc2oLy6Y= +golang.org/x/crypto v0.56.0/go.mod h1:OMW5y6CY9l38uPLmxU6l6pwcXp1obtLo3e6gT7gQR2I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index d9ba6fcde..65cacaafc 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1451,9 +1451,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.55.0 +Version: v0.56.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.55.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver From 23c18f3d244c4a843df9ec1ffa34436cc139a5ba Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:03:57 +0000 Subject: [PATCH 095/132] update(deps): update github.com/rook/rook/pkg/apis digest to 4169b18 (#776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `844566b` → `4169b18` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 22 +++++++++++----------- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 22 +++++++++++----------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/NOTICE b/NOTICE index 65cacaafc..6c58fe293 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260902163555-844566b0af98 +Version: v0.0.0-20260903142735-4169b1898fcd License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/844566b0af98/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/4169b1898fcd/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate @@ -1453,55 +1453,55 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE Module: golang.org/x/crypto Version: v0.56.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/mod/semver Version: v0.40.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/net Version: v0.58.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/oauth2 Version: v0.36.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/sync Version: v0.22.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/sys Version: v0.47.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/term Version: v0.45.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/text Version: v0.41.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/time/rate Version: v0.15.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE +License URL: Unknown ---------- Module: gomodules.xyz/jsonpatch/v2 diff --git a/go.mod b/go.mod index d65c76072..b241ab0e3 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98 + github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 20e8fa1d5..15723a837 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98 h1:6vNH7Xk22prTiQzuOHhY8psJ4sxcOy/1AMioGqGfuv8= -github.com/rook/rook/pkg/apis v0.0.0-20260902163555-844566b0af98/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= +github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd h1:1+xPeG3jPMK5q6rGb5Le56I8CEkQET7pmoz8uKB6R/w= +github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 65cacaafc..6c58fe293 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260902163555-844566b0af98 +Version: v0.0.0-20260903142735-4169b1898fcd License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/844566b0af98/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/4169b1898fcd/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate @@ -1453,55 +1453,55 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE Module: golang.org/x/crypto Version: v0.56.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/mod/semver Version: v0.40.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/net Version: v0.58.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/oauth2 Version: v0.36.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/sync Version: v0.22.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/sys Version: v0.47.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/term Version: v0.45.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/text Version: v0.41.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE +License URL: Unknown ---------- Module: golang.org/x/time/rate Version: v0.15.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE +License URL: Unknown ---------- Module: gomodules.xyz/jsonpatch/v2 From b235ba4e008e502774ab417cb7b39168c56059de Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 19:02:38 +0000 Subject: [PATCH 096/132] update(deps): update github.com/rook/rook/pkg/apis digest to d364b1e (#779) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `4169b18` → `d364b1e` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 22 +++++++++++----------- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 22 +++++++++++----------- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/NOTICE b/NOTICE index 6c58fe293..9b7f59263 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260903142735-4169b1898fcd +Version: v0.0.0-20260903170734-d364b1e8ad7f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/4169b1898fcd/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/d364b1e8ad7f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate @@ -1453,55 +1453,55 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE Module: golang.org/x/crypto Version: v0.56.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver Version: v0.40.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE ---------- Module: golang.org/x/net Version: v0.58.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 Version: v0.36.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE ---------- Module: golang.org/x/sync Version: v0.22.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE ---------- Module: golang.org/x/sys Version: v0.47.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE ---------- Module: golang.org/x/term Version: v0.45.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE ---------- Module: golang.org/x/text Version: v0.41.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE ---------- Module: golang.org/x/time/rate Version: v0.15.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE ---------- Module: gomodules.xyz/jsonpatch/v2 diff --git a/go.mod b/go.mod index b241ab0e3..26258e376 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd + github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 15723a837..2ac421018 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd h1:1+xPeG3jPMK5q6rGb5Le56I8CEkQET7pmoz8uKB6R/w= -github.com/rook/rook/pkg/apis v0.0.0-20260903142735-4169b1898fcd/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= +github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f h1:3OL9xwVtRSqNzJq6kmGEHBwd8/aN1ReyvRuraymIpv0= +github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6c58fe293..9b7f59263 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260903142735-4169b1898fcd +Version: v0.0.0-20260903170734-d364b1e8ad7f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/4169b1898fcd/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/d364b1e8ad7f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate @@ -1453,55 +1453,55 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE Module: golang.org/x/crypto Version: v0.56.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver Version: v0.40.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE ---------- Module: golang.org/x/net Version: v0.58.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 Version: v0.36.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE ---------- Module: golang.org/x/sync Version: v0.22.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE ---------- Module: golang.org/x/sys Version: v0.47.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE ---------- Module: golang.org/x/term Version: v0.45.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE ---------- Module: golang.org/x/text Version: v0.41.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE ---------- Module: golang.org/x/time/rate Version: v0.15.0 License: BSD-3-Clause -License URL: Unknown +License URL: https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE ---------- Module: gomodules.xyz/jsonpatch/v2 From ccd0a7089250756fea5a1fb761f630d9e8f2aa0f Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 01:37:44 +0000 Subject: [PATCH 097/132] update(deps): update module github.com/google/go-containerregistry to v0.22.1 (#780) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/google/go-containerregistry](https://redirect.github.com/google/go-containerregistry) | `v0.22.0` → `v0.22.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgoogle%2fgo-containerregistry/v0.22.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgoogle%2fgo-containerregistry/v0.22.0/v0.22.1?slim=true) | --- ### Release Notes
google/go-containerregistry (github.com/google/go-containerregistry) ### [`v0.22.1`](https://redirect.github.com/google/go-containerregistry/releases/tag/v0.22.1) [Compare Source](https://redirect.github.com/google/go-containerregistry/compare/v0.22.0...v0.22.1) #### What's Changed - Reject non-canonical IP literals in all SSRF guards by [@​shaggyinsomniac](https://redirect.github.com/shaggyinsomniac) in [#​2426](https://redirect.github.com/google/go-containerregistry/pull/2426) - daemon: fix stale docker/docker reference in WithClient docs by [@​BobDu](https://redirect.github.com/BobDu) in [#​2428](https://redirect.github.com/google/go-containerregistry/pull/2428) - build(deps): bump the go-deps group across 2 directories with 4 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2422](https://redirect.github.com/google/go-containerregistry/pull/2422) - authn: do not overwrite AuthConfig.Auth when username and password are empty by [@​nileshpatil6](https://redirect.github.com/nileshpatil6) in [#​2420](https://redirect.github.com/google/go-containerregistry/pull/2420) - build(deps): bump the actions group across 1 directory with 8 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2423](https://redirect.github.com/google/go-containerregistry/pull/2423) - Support pulling images by sha512 digest by [@​BobDu](https://redirect.github.com/BobDu) in [#​2427](https://redirect.github.com/google/go-containerregistry/pull/2427) - Allow empty label and annotation values in crane mutate by [@​theadsingh](https://redirect.github.com/theadsingh) in [#​2418](https://redirect.github.com/google/go-containerregistry/pull/2418) - fix(build): Use dependencies.gitSource in cloudbuild\_v2.yaml by [@​tprussak](https://redirect.github.com/tprussak) in [#​2434](https://redirect.github.com/google/go-containerregistry/pull/2434) - validate: support index attestation manifests and empty configs by [@​Subserial](https://redirect.github.com/Subserial) in [#​2414](https://redirect.github.com/google/go-containerregistry/pull/2414) - name: improve error when parsing a reference with a URL scheme by [@​locker95](https://redirect.github.com/locker95) in [#​2431](https://redirect.github.com/google/go-containerregistry/pull/2431) - fix(build): install binaries to /ko-app and add to PATH ([#​2424](https://redirect.github.com/google/go-containerregistry/issues/2424)) by [@​tprussak](https://redirect.github.com/tprussak) in [#​2436](https://redirect.github.com/google/go-containerregistry/pull/2436) - fix(release): honor declared Go toolchain by [@​rksharma-owg](https://redirect.github.com/rksharma-owg) in [#​2435](https://redirect.github.com/google/go-containerregistry/pull/2435) - remote: apply checkRedirectSSRF to writer-side HTTP clients by [@​locker95](https://redirect.github.com/locker95) in [#​2432](https://redirect.github.com/google/go-containerregistry/pull/2432) - flatten: preserve config and layer media types when flattening by [@​Subserial](https://redirect.github.com/Subserial) in [#​2438](https://redirect.github.com/google/go-containerregistry/pull/2438) - fix(mutate): make Time layer updates lazy by [@​amarkdotdev](https://redirect.github.com/amarkdotdev) in [#​2429](https://redirect.github.com/google/go-containerregistry/pull/2429) - build(deps): bump the go-deps group across 2 directories with 3 updates by [@​dependabot](https://redirect.github.com/dependabot)\[bot] in [#​2439](https://redirect.github.com/google/go-containerregistry/pull/2439) - remote: copy manifest annotations to referrers fallback tag descriptors by [@​codysoyland](https://redirect.github.com/codysoyland) in [#​2441](https://redirect.github.com/google/go-containerregistry/pull/2441) #### New Contributors - [@​shaggyinsomniac](https://redirect.github.com/shaggyinsomniac) made their first contribution in [#​2426](https://redirect.github.com/google/go-containerregistry/pull/2426) - [@​BobDu](https://redirect.github.com/BobDu) made their first contribution in [#​2428](https://redirect.github.com/google/go-containerregistry/pull/2428) - [@​nileshpatil6](https://redirect.github.com/nileshpatil6) made their first contribution in [#​2420](https://redirect.github.com/google/go-containerregistry/pull/2420) - [@​theadsingh](https://redirect.github.com/theadsingh) made their first contribution in [#​2418](https://redirect.github.com/google/go-containerregistry/pull/2418) - [@​locker95](https://redirect.github.com/locker95) made their first contribution in [#​2431](https://redirect.github.com/google/go-containerregistry/pull/2431) - [@​rksharma-owg](https://redirect.github.com/rksharma-owg) made their first contribution in [#​2435](https://redirect.github.com/google/go-containerregistry/pull/2435) - [@​codysoyland](https://redirect.github.com/codysoyland) made their first contribution in [#​2441](https://redirect.github.com/google/go-containerregistry/pull/2441) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 9b7f59263..ae023753b 100644 --- a/NOTICE +++ b/NOTICE @@ -665,9 +665,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.22.0 +Version: v0.22.1 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.22.0/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.22.1/LICENSE ---------- Module: github.com/google/go-github/v69/github diff --git a/go.mod b/go.mod index 26258e376..968d9edba 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 github.com/golang-jwt/jwt/v5 v5.3.1 - github.com/google/go-containerregistry v0.22.0 + github.com/google/go-containerregistry v0.22.1 github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible diff --git a/go.sum b/go.sum index 2ac421018..682593807 100644 --- a/go.sum +++ b/go.sum @@ -3801,8 +3801,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.22.0 h1:eGbCiPeYxAH/7WLLq6zTBALP0tUIFsoyRauhxXDJ53I= -github.com/google/go-containerregistry v0.22.0/go.mod h1:bJR35SK8XgisYmhg/FMQ/5RK0S/XrOAqLBV5/LR2XE0= +github.com/google/go-containerregistry v0.22.1 h1:RZuuSYhTvlDvtsK+NkutoCZ//C0X2ebLK8X8l3ULs84= +github.com/google/go-containerregistry v0.22.1/go.mod h1:bJR35SK8XgisYmhg/FMQ/5RK0S/XrOAqLBV5/LR2XE0= github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE= github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM= github.com/google/go-github/v86 v86.0.0 h1:S/6aANJhwRm8EQmGKVML3j41yq0h2BsTP8FnDkO7kcA= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 9b7f59263..ae023753b 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -665,9 +665,9 @@ License URL: https://github.com/google/go-cmp/blob/v0.7.0/LICENSE ---------- Module: github.com/google/go-containerregistry -Version: v0.22.0 +Version: v0.22.1 License: Apache-2.0 -License URL: https://github.com/google/go-containerregistry/blob/v0.22.0/LICENSE +License URL: https://github.com/google/go-containerregistry/blob/v0.22.1/LICENSE ---------- Module: github.com/google/go-github/v69/github From 6e22a4b84d6295478987e3cfce74cc8d1551646d Mon Sep 17 00:00:00 2001 From: Jonas Kauke Date: Fri, 4 Sep 2026 09:23:33 +0200 Subject: [PATCH 098/132] chore(bootstrap): refactor k0s gcp bootstrapping package (#777) Move k0s related functions in gcp bootstrapping into its own folder. Refactor string concatenation. --------- Signed-off-by: joka134 <27293650+joka134@users.noreply.github.com> --- internal/bootstrap/gcp/cleanup.go | 22 ++ internal/bootstrap/gcp/datacenter.go | 1 + internal/bootstrap/gcp/errors.go | 7 + internal/bootstrap/gcp/gce.go | 32 +++ internal/bootstrap/gcp/gce_test.go | 36 ++- internal/bootstrap/gcp/gcp.go | 209 ++++++------------ internal/bootstrap/gcp/gcp_client.go | 52 +++++ .../bootstrap/gcp/gcp_client_cleanup_test.go | 2 +- internal/bootstrap/gcp/gcp_test.go | 62 +++--- internal/bootstrap/gcp/iam_admin.go | 4 + internal/bootstrap/gcp/iam_admin_test.go | 5 +- .../gcp/iam_admin_unexported_test.go | 6 +- internal/bootstrap/gcp/infrafile.go | 2 + internal/bootstrap/gcp/infrafile_test.go | 1 + internal/bootstrap/gcp/install_config.go | 33 +++ internal/bootstrap/gcp/install_config_test.go | 6 + internal/bootstrap/gcp/k0s.go | 182 +++++++++++++++ internal/bootstrap/gcp/test_helpers_test.go | 6 + 18 files changed, 485 insertions(+), 183 deletions(-) create mode 100644 internal/bootstrap/gcp/k0s.go diff --git a/internal/bootstrap/gcp/cleanup.go b/internal/bootstrap/gcp/cleanup.go index f30e59a73..c29a464bc 100644 --- a/internal/bootstrap/gcp/cleanup.go +++ b/internal/bootstrap/gcp/cleanup.go @@ -56,20 +56,25 @@ func NewCleanupExecutor(opts *CleanupOpts, deps *CleanupDeps) (*CleanupExecutor, if err := exec.loadInfraFileIfNeeded(); err != nil { return nil, err } + if err := exec.resolveProjectID(); err != nil { return nil, err } + exec.resolveDNSSettings() + return exec, nil } // loadInfraFileIfNeeded loads the infra file when the project ID or DNS info is missing. func (e *CleanupExecutor) loadInfraFileIfNeeded() error { missingDNSProjectID := e.Opts.DNSProjectID == "" + missingDNSInfo := missingDNSProjectID if !e.Opts.SkipDNSCleanup { missingDNSInfo = missingDNSProjectID || e.Opts.BaseDomain == "" || e.Opts.DNSZoneName == "" } + if e.ProjectID != "" && !missingDNSInfo { return nil } @@ -79,13 +84,16 @@ func (e *CleanupExecutor) loadInfraFileIfNeeded() error { if e.ProjectID == "" { return fmt.Errorf("failed to load infra file: %w", err) } + log.Printf("Warning: %v", err) + return nil } if infraEnv.ProjectID != "" { e.InfraEnv = infraEnv e.InfraFileLoaded = true + return nil } @@ -104,6 +112,7 @@ func (e *CleanupExecutor) resolveProjectID() error { e.InfraEnv = CodesphereEnvironment{} e.InfraFileLoaded = false } + return nil } @@ -113,6 +122,7 @@ func (e *CleanupExecutor) resolveProjectID() error { e.ProjectID = e.InfraEnv.ProjectID log.Printf("Using project ID from infra file: %s", e.ProjectID) + return nil } @@ -122,14 +132,17 @@ func (e *CleanupExecutor) resolveDNSSettings() { if e.BaseDomain == "" { e.BaseDomain = e.InfraEnv.BaseDomain } + e.DNSZoneName = e.Opts.DNSZoneName if e.DNSZoneName == "" { e.DNSZoneName = e.InfraEnv.DNSZoneName } + e.DNSProjectID = e.Opts.DNSProjectID if e.DNSProjectID == "" { e.DNSProjectID = e.InfraEnv.DNSProjectID } + if e.DNSProjectID == "" { e.DNSProjectID = e.ProjectID } @@ -147,6 +160,7 @@ func (e *CleanupExecutor) VerifyAndConfirm() error { if err != nil { return fmt.Errorf("failed to verify project: %w", err) } + if !isOMSManaged { return fmt.Errorf("project %s was not bootstrapped by OMS (missing 'oms-managed' label). Use --force to override this check", e.ProjectID) } @@ -160,13 +174,16 @@ func (e *CleanupExecutor) confirmDeletion() error { log.Println("Type the project ID to confirm deletion: ") reader := bufio.NewReader(e.Deps.ConfirmReader) + confirmation, err := reader.ReadString('\n') if err != nil { return fmt.Errorf("failed to read confirmation: %w", err) } + if strings.TrimSpace(confirmation) != e.ProjectID { return fmt.Errorf("confirmation did not match project ID, aborting cleanup") } + return nil } @@ -176,10 +193,12 @@ func (e *CleanupExecutor) CleanupDNSRecords() error { if e.Opts.SkipDNSCleanup { return nil } + if e.BaseDomain == "" || e.DNSZoneName == "" { log.Printf("Skipping DNS cleanup: missing base domain or DNS zone name (provide --base-domain/--dns-zone-name or use --skip-dns-cleanup)") return nil } + return e.Deps.GCPClient.DeleteDNSRecordSets(e.DNSProjectID, e.DNSZoneName, e.BaseDomain) } @@ -189,6 +208,7 @@ func (e *CleanupExecutor) RemoveDNSIAMBinding() error { if e.DNSProjectID == "" || e.DNSProjectID == e.ProjectID { return nil } + return e.Deps.GCPClient.RemoveIAMRoleBinding(e.DNSProjectID, "cloud-controller", e.ProjectID, []string{"roles/dns.admin"}) } @@ -202,9 +222,11 @@ func (e *CleanupExecutor) RemoveLocalInfraFile() { if !e.InfraFileLoaded || e.InfraEnv.ProjectID != e.ProjectID { return } + if err := e.Deps.FileIO.Remove(e.Deps.InfraFilePath); err != nil { log.Printf("Warning: failed to remove local infra file: %v", err) return } + log.Printf("Removed local infra file: %s", e.Deps.InfraFilePath) } diff --git a/internal/bootstrap/gcp/datacenter.go b/internal/bootstrap/gcp/datacenter.go index f75aee177..75f23fda7 100644 --- a/internal/bootstrap/gcp/datacenter.go +++ b/internal/bootstrap/gcp/datacenter.go @@ -151,6 +151,7 @@ func newDataCenter(env *CodesphereEnvironment, id int, suffix string) *datacente SSHBaseDomain: sshBaseDomain(env, id), ExternalPostgres: suffix != "", } + return dc } diff --git a/internal/bootstrap/gcp/errors.go b/internal/bootstrap/gcp/errors.go index 1c6f44e61..8e38f05ae 100644 --- a/internal/bootstrap/gcp/errors.go +++ b/internal/bootstrap/gcp/errors.go @@ -18,13 +18,16 @@ func IsNotFoundError(err error) bool { if err == nil { return false } + if status.Code(err) == codes.NotFound { return true } + var apiErr *googleapi.Error if errors.As(err, &apiErr) { return apiErr.Code == 404 } + return false } @@ -33,10 +36,13 @@ func IsSpotCapacityError(err error) bool { if err == nil { return false } + if status.Code(err) == codes.ResourceExhausted { return true } + errStr := strings.ToLower(err.Error()) + return strings.Contains(errStr, "zone_resource_pool_exhausted") || strings.Contains(errStr, "unsupported_operation") || strings.Contains(errStr, "stockout") || @@ -48,5 +54,6 @@ func IsAlreadyExistsError(err error) bool { if err == nil { return false } + return status.Code(err) == codes.AlreadyExists || strings.Contains(err.Error(), "already exists") } diff --git a/internal/bootstrap/gcp/gce.go b/internal/bootstrap/gcp/gce.go index e71f7927d..73df5e0f7 100644 --- a/internal/bootstrap/gcp/gce.go +++ b/internal/bootstrap/gcp/gce.go @@ -97,6 +97,7 @@ func (b *GCPBootstrapper) validateVMProvisioningOptions() error { if b.Env.SpotVMs && b.Env.Preemptible { return fmt.Errorf("cannot specify both --spot-vms and --preemptible flags; use --spot-vms for the newer spot VM model") } + return nil } @@ -129,14 +130,17 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { wg.Add(1) go func(vm VMDef) { defer wg.Done() + result, err := b.ensureVM(vm, b.Env.RootDiskSize, sshKeys, logCh) if err != nil { errCh <- err return } + resultCh <- result }(vm) } + wg.Wait() close(errCh) @@ -151,6 +155,7 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { for err := range errCh { errs = append(errs, err) } + if len(errs) > 0 { return fmt.Errorf("error ensuring compute instances: %w", errors.Join(errs...)) } @@ -167,6 +172,7 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { dc.ControlPlaneNodes = nil dcByID[dc.ID] = dc } + for result := range resultCh { switch result.vmType { case "jumpbox": @@ -208,8 +214,10 @@ func (b *GCPBootstrapper) EnsureComputeInstances() error { func (b *GCPBootstrapper) getSSHKeys() (string, error) { sshKeys := "" + if b.Env.GitHubPAT != "" && b.Env.GitHubTeamOrg != "" && b.Env.GitHubTeamSlug != "" { var err error + sshKeys, err = github.GetSSHKeysFromGitHubTeam(b.GitHubClient, b.Env.GitHubTeamOrg, b.Env.GitHubTeamSlug) if err != nil { return "", fmt.Errorf("failed to get SSH keys from GitHub team: %w", err) @@ -222,6 +230,7 @@ func (b *GCPBootstrapper) getSSHKeys() (string, error) { } sshKeys += fmt.Sprintf("root:%s\nubuntu:%s", pubKey+"root", pubKey+"ubuntu") + return sshKeys, nil } @@ -250,6 +259,7 @@ func (b *GCPBootstrapper) ensureVM(vm VMDef, rootDiskSize int64, sshKeys string, if err != nil { return vmResult{}, err } + if err := b.CreateInstanceWithFallback(projectID, zone, instance, vm.Name, logCh); err != nil { return vmResult{}, err } @@ -261,6 +271,7 @@ func (b *GCPBootstrapper) ensureVM(vm VMDef, rootDiskSize int64, sshKeys string, } internalIP, externalIP := ExtractInstanceIPs(readyInstance) + return vmResult{ vmType: vm.Tags[0], name: vm.Name, @@ -355,6 +366,7 @@ func ExtractInstanceIPs(inst *computepb.Instance) (internalIP, externalIP string externalIP = inst.GetNetworkInterfaces()[0].GetAccessConfigs()[0].GetNatIP() } } + return } @@ -364,13 +376,16 @@ func IsInstanceReady(inst *computepb.Instance, needsExternalIP bool) bool { if inst.GetStatus() != "RUNNING" || len(inst.GetNetworkInterfaces()) == 0 { return false } + ni := inst.GetNetworkInterfaces()[0] if ni.GetNetworkIP() == "" { return false } + if needsExternalIP && (len(ni.GetAccessConfigs()) == 0 || ni.GetAccessConfigs()[0].GetNatIP() == "") { return false } + return true } @@ -384,6 +399,7 @@ func (b *GCPBootstrapper) BuildSchedulingConfig() *computepb.Scheduling { InstanceTerminationAction: protoString("STOP"), } } + if b.Env.Preemptible { return &computepb.Scheduling{ Preemptible: protoBool(true), @@ -407,11 +423,14 @@ func (b *GCPBootstrapper) CreateInstanceWithFallback(projectID, zone string, ins if b.Env.SpotVMs && IsSpotCapacityError(err) { logCh <- fmt.Sprintf("Spot capacity unavailable for %s, falling back to standard VM", vmName) + instance.Scheduling = &computepb.Scheduling{} + err = b.GCPClient.CreateInstance(projectID, zone, instance) if err != nil && !IsAlreadyExistsError(err) { return fmt.Errorf("failed to create instance %s (fallback to standard VM): %w", vmName, err) } + return nil } @@ -433,8 +452,10 @@ func (b *GCPBootstrapper) waitForInstanceRunning(projectID, zone, name string, n if attempt < maxAttempts-1 { b.Time.Sleep(pollInterval) } + continue } + return nil, fmt.Errorf("failed to poll instance %s: %w", name, err) } @@ -446,6 +467,7 @@ func (b *GCPBootstrapper) waitForInstanceRunning(projectID, zone, name string, n b.Time.Sleep(pollInterval) } } + return nil, fmt.Errorf("timed out waiting for instance %s to be RUNNING with IPs assigned after %s", name, pollInterval*time.Duration(maxAttempts)) } @@ -458,6 +480,7 @@ func findVMDef(defs []VMDef, name string) *VMDef { return &defs[i] } } + return nil } @@ -467,6 +490,7 @@ func validVMNames(defs []VMDef) []string { for i, vm := range defs { names[i] = vm.Name } + return names } @@ -487,6 +511,7 @@ func (b *GCPBootstrapper) RestartVM(name string) error { if IsNotFoundError(err) { return fmt.Errorf("instance %s does not exist in project %s / zone %s; did you run bootstrap first?", name, projectID, zone) } + return fmt.Errorf("failed to get instance %s: %w", name, err) } @@ -496,6 +521,7 @@ func (b *GCPBootstrapper) RestartVM(name string) error { return nil case "TERMINATED", "STOPPED": log.Printf("Starting stopped instance %s...", name) + if err := b.GCPClient.StartInstance(projectID, zone, name); err != nil { return fmt.Errorf("failed to start instance %s: %w", name, err) } @@ -512,6 +538,7 @@ func (b *GCPBootstrapper) RestartVM(name string) error { internalIP, externalIP := ExtractInstanceIPs(readyInstance) log.Printf("Instance %s is now running (internal=%s, external=%s)", name, internalIP, externalIP) + return nil } @@ -524,23 +551,28 @@ func (b *GCPBootstrapper) RestartVMs() error { errs = append(errs, err) } } + if len(errs) > 0 { return fmt.Errorf("errors restarting VMs: %w", errors.Join(errs...)) } + return nil } // ReadSSHKey reads an SSH key file, expanding ~ in the path func (b *GCPBootstrapper) ReadSSHKey(path string) (string, error) { realPath := util.ExpandPath(path) + data, err := b.fw.ReadFile(realPath) if err != nil { return "", fmt.Errorf("error reading SSH key from %s: %w", realPath, err) } + key := strings.TrimSpace(string(data)) if key == "" { return "", fmt.Errorf("SSH key at %s is empty", realPath) } + return key, nil } diff --git a/internal/bootstrap/gcp/gce_test.go b/internal/bootstrap/gcp/gce_test.go index 352608bfb..5737e8e3e 100644 --- a/internal/bootstrap/gcp/gce_test.go +++ b/internal/bootstrap/gcp/gce_test.go @@ -21,7 +21,6 @@ import ( ) var _ = Describe("GCE", func() { - Describe("VMDefsForEnv", func() { It("keeps the names a single-data-center bootstrap has always used", func() { env := &gcp.CodesphereEnvironment{} @@ -350,6 +349,7 @@ var _ = Describe("GCE", func() { DescribeTable("falls back to standard VM on capacity errors", func(capacityErr error) { instance := spotInstance("test-vm") + gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything).Return(capacityErr).Once() gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything).Return(nil).Once() @@ -365,6 +365,7 @@ var _ = Describe("GCE", func() { It("clears scheduling config on fallback", func() { instance := spotInstance("test-vm") + gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). Return(fmt.Errorf("ZONE_RESOURCE_POOL_EXHAUSTED")).Once() gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.MatchedBy(func(inst *computepb.Instance) bool { @@ -378,6 +379,7 @@ var _ = Describe("GCE", func() { It("returns error with context when fallback also fails", func() { instance := spotInstance("test-vm") + gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). Return(fmt.Errorf("ZONE_RESOURCE_POOL_EXHAUSTED")).Once() gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). @@ -391,6 +393,7 @@ var _ = Describe("GCE", func() { It("does NOT fall back on non-capacity errors", func() { instance := spotInstance("test-vm") + gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). Return(fmt.Errorf("permission denied")).Once() @@ -403,6 +406,7 @@ var _ = Describe("GCE", func() { It("succeeds when fallback retry returns AlreadyExists", func() { instance := spotInstance("test-vm") + gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). Return(grpcstatus.Errorf(codes.ResourceExhausted, "exhausted")).Once() gc.EXPECT().CreateInstance("test-pid", "us-central1-a", mock.Anything). @@ -560,6 +564,7 @@ var _ = Describe("GCE", func() { It("reads and trims SSH key", func() { fw.EXPECT().ReadFile(mock.Anything).Return([]byte("ssh-rsa AAAA... \n"), nil) + key, err := bs.ReadSSHKey("~/.ssh/id_rsa.pub") Expect(err).NotTo(HaveOccurred()) Expect(key).To(Equal("ssh-rsa AAAA...")) @@ -567,6 +572,7 @@ var _ = Describe("GCE", func() { It("returns error when file read fails", func() { fw.EXPECT().ReadFile(mock.Anything).Return(nil, fmt.Errorf("no such file")) + _, err := bs.ReadSSHKey("~/.ssh/missing.pub") Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("error reading SSH key")) @@ -574,6 +580,7 @@ var _ = Describe("GCE", func() { It("returns error when key file is empty", func() { fw.EXPECT().ReadFile(mock.Anything).Return([]byte(" \n "), nil) + _, err := bs.ReadSSHKey("~/.ssh/empty.pub") Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("is empty")) @@ -622,8 +629,10 @@ var _ = Describe("GCE", func() { It("Sets the root disk size", func() { fw.EXPECT().ReadFile(mock.Anything).Return([]byte("ssh-rsa AAA..."), nil).Times(1) + allRootDiskSizesCorrect := true mu := sync.Mutex{} + gc.EXPECT().CreateInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn( // Testing the disk size like this instead of a matcher // to avoid the test to panic in case of a mismatch in the parallel go funcs @@ -633,6 +642,7 @@ var _ = Describe("GCE", func() { allRootDiskSizesCorrect = false mu.Unlock() } + return nil }, ).Times(8) @@ -646,6 +656,7 @@ var _ = Describe("GCE", func() { It("creates all instances", func() { fw.EXPECT().ReadFile(mock.Anything).Return([]byte("ssh-rsa AAA..."), nil).Times(1) gc.EXPECT().CreateInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).Return(nil).Times(8) + ipResp := makeRunningInstance("10.0.0.x", "1.2.3.x") mockGetInstanceNotFoundThenRunning(gc, csEnv.ProjectID, csEnv.Zone, ipResp, 8) @@ -678,20 +689,24 @@ var _ = Describe("GCE", func() { }) It("fetches GitHub team keys", func() { mockGitHubClient.EXPECT().GetTeamMemberSSHKeys(mock.Anything, csEnv.GitHubTeamOrg, csEnv.GitHubTeamSlug).Return([]github.TeamMemberKeys{{Login: "alice", Keys: []string{"ssh-rsa AAALICE..."}}}, nil).Maybe() + ipResp := makeRunningInstance("10.0.0.x", "1.2.3.x") mockGetInstanceNotFoundThenRunning(gc, csEnv.ProjectID, csEnv.Zone, ipResp, 8) fw.EXPECT().ReadFile(csEnv.SSHPublicKeyPath).Return([]byte("ssh-rsa AAA..."), nil).Times(1) gc.EXPECT().CreateInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn(func(projectID, zone string, instance *computepb.Instance) error { sshMetadata := "" + for _, item := range instance.GetMetadata().GetItems() { if item.GetKey() == "ssh-keys" { sshMetadata = item.GetValue() } } + if !strings.Contains(sshMetadata, "AAALICE...") { return fmt.Errorf("expected ssh metadata to include team user key") } + return nil }).Times(8) @@ -735,15 +750,19 @@ var _ = Describe("GCE", func() { It("fails when GetInstance fails after creation", func() { instanceCalls := make(map[string]int) + var mu sync.Mutex + gc.EXPECT().GetInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn( func(projectID, zone, name string) (*computepb.Instance, error) { mu.Lock() defer mu.Unlock() + instanceCalls[name]++ if instanceCalls[name] == 1 { return nil, notFoundErr } + return nil, fmt.Errorf("get error") }, ).Maybe() @@ -785,15 +804,20 @@ var _ = Describe("GCE", func() { fw.EXPECT().ReadFile(mock.Anything).Return([]byte("ssh-rsa AAA..."), nil).Times(1) createCalls := make(map[string]int) + var mu sync.Mutex + gc.EXPECT().CreateInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn(func(projectID, zone string, instance *computepb.Instance) error { mu.Lock() defer mu.Unlock() + name := *instance.Name + createCalls[name]++ if createCalls[name] == 1 { return fmt.Errorf("ZONE_RESOURCE_POOL_EXHAUSTED") } + return nil }).Times(16) @@ -803,12 +827,16 @@ var _ = Describe("GCE", func() { It("restarts stopped VMs instead of creating new ones", func() { instanceCalls := make(map[string]int) + var mu sync.Mutex + stoppedResp := makeStoppedInstance("10.0.0.x", "1.2.3.x") runningResp := makeRunningInstance("10.0.0.x", "1.2.3.x") + gc.EXPECT().GetInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn(func(projectID, zone, name string) (*computepb.Instance, error) { mu.Lock() defer mu.Unlock() + instanceCalls[name]++ if instanceCalls[name] == 1 { // First call, VM exists but is stopped @@ -837,13 +865,17 @@ var _ = Describe("GCE", func() { It("handles VMs in intermediate states (STAGING/PROVISIONING)", func() { instanceCalls := make(map[string]int) + var mu sync.Mutex + stagingResp := makeInstance("STAGING", "10.0.0.x", "1.2.3.x") runningResp := makeRunningInstance("10.0.0.x", "1.2.3.x") + fw.EXPECT().ReadFile(mock.Anything).Return([]byte("ssh-rsa AAAA... \n"), nil) gc.EXPECT().GetInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn(func(projectID, zone, name string) (*computepb.Instance, error) { mu.Lock() defer mu.Unlock() + instanceCalls[name]++ if instanceCalls[name] == 1 { // First call: instance exists but is still staging @@ -1014,11 +1046,13 @@ var _ = Describe("GCE", func() { runningInst := makeRunningInstance("10.0.0.1", "1.2.3.4") callCounts := map[string]int{} + gc.EXPECT().GetInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).RunAndReturn(func(_, _, name string) (*computepb.Instance, error) { callCounts[name]++ if callCounts[name] == 1 { return stoppedInst, nil } + return runningInst, nil }).Times(16) gc.EXPECT().StartInstance(csEnv.ProjectID, csEnv.Zone, mock.Anything).Return(nil).Times(8) diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index 06dd4b7ae..9db6fedec 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -29,12 +29,25 @@ import ( "google.golang.org/api/dns/v1" ) +// RegistryType is a custom type to define which registry is used in the bootstrapper type RegistryType string const ( - RegistryTypeLocalContainer RegistryType = "local-container" + // RegistryTypeLocalContainer runs a container registry inside the cluster, + // which is set up on the nodes during bootstrapping. + // Used for air-gapped installation + RegistryTypeLocalContainer RegistryType = "local-container" + + // RegistryTypeArtifactRegistry uses GCP Artifact Registry. Bootstrapping + // creates the registry, a dedicated service account with writer + // permissions, and stores its key as the registry credentials. RegistryTypeArtifactRegistry RegistryType = "artifact-registry" - RegistryTypeGitHub RegistryType = "github" + + // RegistryTypeGitHub pulls images directly from the GitHub container + // registry. Since no images need to be loaded into a self-hosted registry, + // bootstrapping only configures GitHub access and installs the lite + // package. + RegistryTypeGitHub RegistryType = "github" ) // CheckOMSManagedLabel checks if the given labels map indicates an OMS-managed project. @@ -43,7 +56,9 @@ func CheckOMSManagedLabel(labels map[string]string) bool { if labels == nil { return false } + value, exists := labels[OMSManagedLabel] + return exists && value == "true" } @@ -369,22 +384,12 @@ func (b *GCPBootstrapper) Bootstrap() error { return fmt.Errorf("failed to ensure DNS records: %w", err) } - err = b.stlog.Step("Generate k0s config script", b.GenerateK0sConfigScript) - if err != nil { - return fmt.Errorf("failed to generate k0s config script: %w", err) - } - if b.Env.InstallVersion != "" || b.Env.InstallLocal != "" { - err = b.stlog.Step("Install k0s", b.InstallK0s) + err = b.stlog.Step("Install K0s", b.EnsureK0s) if err != nil { return fmt.Errorf("failed to install k0s: %w", err) } - err = b.stlog.Step("Wait for k0s nodes", b.WaitForK0sNodes) - if err != nil { - return fmt.Errorf("failed waiting for k0s nodes: %w", err) - } - err = b.stlog.Step("Install Codesphere", b.InstallCodesphere) if err != nil { return fmt.Errorf("failed to install Codesphere: %w", err) @@ -419,10 +424,12 @@ func (b *GCPBootstrapper) createTestUser() error { if b.Env.InstallConfig == nil { return fmt.Errorf("install config not found in bootstrap environment") } + pgPasswordSecret := b.icg.GetVault().GetSecret(files.SecretPostgresPassword) if pgPasswordSecret == nil || pgPasswordSecret.Fields == nil { return fmt.Errorf("postgres admin password not found in vault") } + pgPassword := pgPasswordSecret.Fields.Password result, err := testuser.CreateTestUser(testuser.CreateTestUserOpts{ @@ -439,8 +446,10 @@ func (b *GCPBootstrapper) createTestUser() error { } testuser.LogAndPersistResult(result, b.Env.OmsWorkdir) + return nil } + func (b *GCPBootstrapper) ValidateInput() error { if b.Env.GoogleACMEIssuer && b.Env.ACMEStaging { return fmt.Errorf("acme-staging cannot be combined with google-acme-issuer") @@ -508,6 +517,7 @@ func (b *GCPBootstrapper) validateClusterAdminEmail() error { if err != nil { return fmt.Errorf("invalid cluster admin email: %w", err) } + b.Env.ClusterAdminEmail = email return nil @@ -519,14 +529,18 @@ func (b *GCPBootstrapper) validateInstallVersion() error { if b.Env.InstallVersion != "" || b.Env.InstallHash != "" { return fmt.Errorf("cannot specify both install-local and install-version/install-hash") } + if !b.fw.Exists(b.Env.InstallLocal) { return fmt.Errorf("local installer package not found at path: %s", b.Env.InstallLocal) } + return nil } + if b.Env.InstallVersion == "" { return nil } + build, err := b.PortalClient.GetBuild(portal.CodesphereProduct, b.Env.InstallVersion, b.Env.InstallHash) if err != nil { return fmt.Errorf("failed to get codesphere package: %w", err) @@ -540,6 +554,7 @@ func (b *GCPBootstrapper) validateInstallVersion() error { if b.Env.RegistryType == RegistryTypeGitHub { requiredFilename = "installer-lite.tar.gz" } + filenames := []string{} // Validate required file exists in package artifacts for _, artifact := range build.Artifacts { @@ -587,6 +602,7 @@ func (b *GCPBootstrapper) validateGitProviderParams() error { if p.id != "" && p.secret == "" { return fmt.Errorf("%s client ID is set but client secret is missing", p.name) } + if p.secret != "" && p.id == "" { return fmt.Errorf("%s client secret is set but client ID is missing", p.name) } @@ -621,9 +637,11 @@ func (b *GCPBootstrapper) validatePrometheusRemoteWriteParams() error { if b.Env.PrometheusRemoteWriteURL != "" && (b.Env.PrometheusRemoteWriteUser == "" || b.Env.PrometheusRemoteWritePassword == "") { return fmt.Errorf("prometheus remote write username and password must both be set when remote write URL is specified") } + if (b.Env.PrometheusRemoteWriteUser != "" || b.Env.PrometheusRemoteWritePassword != "") && b.Env.PrometheusRemoteWriteURL == "" { return fmt.Errorf("prometheus remote write URL is required when remote write username or password is set") } + return nil } @@ -635,6 +653,7 @@ func (b *GCPBootstrapper) validateTelemetryExportParams() error { if b.Env.CentralOtelUsername != "" && b.Env.CentralOtelPassword == "" { return fmt.Errorf("central OTel username is set but password is missing") } + if b.Env.CentralOtelPassword != "" && b.Env.CentralOtelUsername == "" { return fmt.Errorf("central OTel password is set but username is missing") } @@ -664,10 +683,12 @@ func (b *GCPBootstrapper) ensureDnsPermissions() error { if b.Env.DNSProjectID == "" { dnsProject = b.Env.ProjectID } + err := b.ensureIAMRoleWithRetry(dnsProject, "cloud-controller", b.Env.ProjectID, []string{"roles/dns.admin"}) if err != nil { return err } + return nil } @@ -705,6 +726,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { TargetTags: []string{"ssh"}, Description: protoString("Allow external SSH to Jumpbox"), } + err := b.GCPClient.CreateFirewallRule(b.Env.ProjectID, sshRule) if err != nil { return fmt.Errorf("failed to create jumpbox ssh firewall rule: %w", err) @@ -722,6 +744,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { SourceRanges: []string{"10.10.0.0/20"}, Description: protoString("Allow all internal traffic"), } + err = b.GCPClient.CreateFirewallRule(b.Env.ProjectID, internalRule) if err != nil { return fmt.Errorf("failed to create internal firewall rule: %w", err) @@ -739,6 +762,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { DestinationRanges: []string{"0.0.0.0/0"}, Description: protoString("Allow all egress"), } + err = b.GCPClient.CreateFirewallRule(b.Env.ProjectID, egressRule) if err != nil { return fmt.Errorf("failed to create egress firewall rule: %w", err) @@ -756,6 +780,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { SourceRanges: []string{"0.0.0.0/0"}, Description: protoString("Allow HTTP/HTTPS ingress"), } + err = b.GCPClient.CreateFirewallRule(b.Env.ProjectID, webRule) if err != nil { return fmt.Errorf("failed to create web firewall rule: %w", err) @@ -774,6 +799,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { TargetTags: []string{"postgres"}, Description: protoString("Allow external access to PostgreSQL"), } + err = b.GCPClient.CreateFirewallRule(b.Env.ProjectID, postgresRule) if err != nil { return fmt.Errorf("failed to create postgres firewall rule: %w", err) @@ -786,14 +812,17 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { // controllers of the cluster (gateway and public gateway) and the SSH workspace proxy. func (b *GCPBootstrapper) EnsureGatewayIPAddresses() error { var err error + b.Env.GatewayIP, err = b.EnsureExternalIP("gateway") if err != nil { return fmt.Errorf("failed to ensure gateway IP: %w", err) } + b.Env.PublicGatewayIP, err = b.EnsureExternalIP("public-gateway") if err != nil { return fmt.Errorf("failed to ensure public gateway IP: %w", err) } + b.Env.SshProxyIP, err = b.EnsureExternalIP("ssh-proxy") if err != nil { return fmt.Errorf("failed to ensure ssh proxy IP: %w", err) @@ -870,9 +899,11 @@ func (b *GCPBootstrapper) ensureRootLoginEnabledInNode(node *node.Node) error { if err == nil { break } + if i == 2 { return fmt.Errorf("failed to enable root login on %s: %w", node.GetName(), err) } + b.stlog.LogRetry() b.Time.Sleep(10 * time.Second) } @@ -912,6 +943,7 @@ func (b *GCPBootstrapper) EnsureOmsInstalled() (err error) { if err != nil { return fmt.Errorf("failed to make local OMS binary executable on jumpbox: %w", err) } + return nil } @@ -938,6 +970,7 @@ func (b *GCPBootstrapper) EnsureHostsConfigured() error { return fmt.Errorf("failed to configure inotify watches on %s: %w", node.GetName(), err) } } + if !node.HasMemoryMapConfigured() { err := node.ConfigureMemoryMap() if err != nil { @@ -955,16 +988,20 @@ func (b *GCPBootstrapper) EnsureLocalContainerRegistry() error { // Figure out if registry is already running b.stlog.Logf("Checking if local container registry is already running on postgres node") + checkCommand := `test "$(podman ps --filter 'name=registry' --format '{{.Names}}' | wc -l)" -eq "1"` err := b.Env.PostgreSQLNode.RunSSHCommand("root", checkCommand) registryUsername := "" registryPassword := "" + if s := b.icg.GetVault().GetSecret(files.SecretRegistryUsername); s != nil && s.Fields != nil { registryUsername = s.Fields.Password } + if s := b.icg.GetVault().GetSecret(files.SecretRegistryPassword); s != nil && s.Fields != nil { registryPassword = s.Fields.Password } + if err == nil && b.Env.InstallConfig.Registry != nil && b.Env.InstallConfig.Registry.Server == localRegistryServer && registryUsername != "" && registryPassword != "" { b.stlog.Logf("Local container registry already running on postgres node") @@ -974,6 +1011,7 @@ func (b *GCPBootstrapper) EnsureLocalContainerRegistry() error { b.Env.InstallConfig.Registry.Server = localRegistryServer registryUsername = "custom-registry" registryPassword = shortuuid.New() + b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretRegistryUsername, Fields: &files.SecretFields{Password: registryUsername}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretRegistryPassword, Fields: &files.SecretFields{Password: registryPassword}}) @@ -1000,6 +1038,7 @@ func (b *GCPBootstrapper) EnsureLocalContainerRegistry() error { } for _, cmd := range commands { b.stlog.Logf("Running command on postgres node: %s", util.Truncate(cmd, 12)) + err := b.Env.PostgreSQLNode.RunSSHCommand("root", cmd) if err != nil { return fmt.Errorf("failed to run command on postgres node: %w", err) @@ -1009,14 +1048,17 @@ func (b *GCPBootstrapper) EnsureLocalContainerRegistry() error { allNodes := append(b.Env.ControlPlaneNodes, b.Env.CephNodes...) for _, node := range allNodes { b.stlog.Logf("Configuring node '%s' to trust local registry certificate", node.GetName()) + err := b.Env.PostgreSQLNode.RunSSHCommand("root", "scp -o StrictHostKeyChecking=no /root/registry.crt root@"+node.GetInternalIP()+":/usr/local/share/ca-certificates/registry.crt") if err != nil { return fmt.Errorf("failed to copy registry certificate to node %s: %w", node.GetInternalIP(), err) } + err = node.RunSSHCommand("root", "update-ca-certificates") if err != nil { return fmt.Errorf("failed to update CA certificates on node %s: %w", node.GetInternalIP(), err) } + err = node.RunSSHCommand("root", "systemctl restart docker.service || true") // docker is probably not yet installed if err != nil { return fmt.Errorf("failed to restart docker service on node %s: %w", node.GetInternalIP(), err) @@ -1030,11 +1072,13 @@ func (b *GCPBootstrapper) EnsureGitHubAccessConfigured() error { if b.Env.GitHubPAT == "" { return fmt.Errorf("GitHub PAT is not set") } + b.Env.InstallConfig.Registry.Server = "ghcr.io" b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretRegistryUsername, Fields: &files.SecretFields{Password: b.Env.RegistryUser}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretRegistryPassword, Fields: &files.SecretFields{Password: b.Env.GitHubPAT}}) b.Env.InstallConfig.Registry.ReplaceImagesInBom = false b.Env.InstallConfig.Registry.LoadContainerImages = false + return nil } @@ -1045,6 +1089,7 @@ func (b *GCPBootstrapper) EnsureDNSRecords() error { } zoneName := b.Env.DNSZoneName + err := b.GCPClient.EnsureDNSManagedZone(gcpProject, zoneName, b.Env.BaseDomain+".", "Codesphere DNS zone") if err != nil { return fmt.Errorf("failed to ensure DNS managed zone: %w", err) @@ -1103,33 +1148,6 @@ func (b *GCPBootstrapper) InstallCodesphere() error { return nil } -// InstallK0s deploys k0s with the native OMS installer and stores its -// kubeconfig in the encrypted install vault for the remaining installer steps. -func (b *GCPBootstrapper) InstallK0s() error { - // Reuse matching cached binaries and let k0sctl reconcile normally. Without - // --force, an unchanged cluster remains untouched on bootstrap retries. - installCmd := fmt.Sprintf("oms install k0s --version %s --install-config /etc/codesphere/config.yaml --vault %s --vault-priv-key %s/age_key.txt", - installer.DefaultK0sVersion, filepath.Join(b.Env.SecretsDir, "prod.vault.yaml"), b.Env.SecretsDir) - if err := b.Env.Jumpbox.RunSSHCommand("root", installCmd); err != nil { - return fmt.Errorf("failed to install k0s from jumpbox: %w", err) - } - - return nil -} - -// WaitForK0sNodes restores the readiness barrier from the TypeScript -// Kubernetes setup. k0sctl apply completing is not sufficient for the -// Codesphere charts: all schedulable nodes must be Ready before gateway -// controllers and their admission webhooks are installed. -func (b *GCPBootstrapper) WaitForK0sNodes() error { - const command = "k0s kubectl wait --for=condition=Ready nodes --all --timeout=30m" - if err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", command); err != nil { - return fmt.Errorf("k0s nodes did not become ready: %w", err) - } - - return nil -} - func (b *GCPBootstrapper) codespherePackageFilename() string { packageFilename := b.codespherePackageArchiveName() if b.Env.InstallLocal != "" { @@ -1166,9 +1184,11 @@ func (b *GCPBootstrapper) ensureCodespherePackageOnJumpbox() error { if b.Env.InstallHash == "" { return fmt.Errorf("install hash must be set when install version is set") } + b.stlog.Logf("Downloading Codesphere package...") downloadCmd := fmt.Sprintf("oms download package -f %s -H %s %s", b.codespherePackageArchiveName(), b.Env.InstallHash, b.Env.InstallVersion) + err := b.Env.Jumpbox.RunSSHCommand("root", downloadCmd) if err != nil { return fmt.Errorf("failed to download Codesphere package from jumpbox: %w", err) @@ -1181,6 +1201,7 @@ func (b *GCPBootstrapper) runInstallCommand(packageFilename string) error { b.stlog.Logf("Installing Codesphere...") installCmd := fmt.Sprintf("oms install codesphere -c /etc/codesphere/config.yaml -k %s/age_key.txt --vault %s -p %s%s", b.Env.SecretsDir, filepath.Join(b.Env.SecretsDir, "prod.vault.yaml"), packageFilename, b.generateSkipStepsArg()) + return b.Env.Jumpbox.RunSSHCommand("root", installCmd) } @@ -1193,116 +1214,10 @@ func (b *GCPBootstrapper) generateSkipStepsArg() string { if b.Env.RegistryType == RegistryTypeGitHub { skipSteps = util.AppendUnique(skipSteps, "load-container-images") } + if len(skipSteps) == 0 { return "" } return " -s " + strings.Join(skipSteps, ",") } -func (b *GCPBootstrapper) GenerateK0sConfigScript() error { - script := `#!/bin/bash - -cat < cloud.conf -[Global] -project-id = "$PROJECT_ID" -EOF - -cat <> cc-deployment.yaml -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: cloud-controller-manager - namespace: kube-system - labels: - component: cloud-controller-manager -spec: - selector: - matchLabels: - component: cloud-controller-manager - template: - metadata: - labels: - component: cloud-controller-manager - spec: - serviceAccountName: cloud-controller-manager - containers: - - name: cloud-controller-manager - image: k8scloudprovidergcp/cloud-controller-manager:latest - command: - - /usr/local/bin/cloud-controller-manager - args: - - --v=5 - - --cloud-provider=gce - - --cloud-config=/etc/gce/cloud.conf - - --leader-elect-resource-name=k0s-gcp-ccm - - --use-service-account-credentials=true - - --controllers=cloud-node,cloud-node-lifecycle,service - - --allocate-node-cidrs=false - - --configure-cloud-routes=false - volumeMounts: - - name: cloud-config-volume - mountPath: /etc/gce - readOnly: true - volumes: - - name: cloud-config-volume - configMap: - name: cloud-config - tolerations: - - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - effect: NoSchedule - - key: node-role.kubernetes.io/master - effect: NoSchedule - - key: node-role.kubernetes.io/control-plane - effect: NoSchedule -EOF - -KUBECTL="/etc/codesphere/deps/kubernetes/files/k0s kubectl" -$KUBECTL create configmap cloud-config --from-file=cloud.conf -n kube-system -echo alias kubectl=\"$KUBECTL\" >> /root/.bashrc -echo alias k=\"$KUBECTL\" >> /root/.bashrc - -$KUBECTL apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-gcp/refs/tags/providers/v0.28.2/deploy/packages/default/manifest.yaml - -$KUBECTL apply -f cc-deployment.yaml - -# set loadBalancerIP for public-gateway-controller and gateway-controller -$KUBECTL patch svc public-gateway-controller -n codesphere -p '{"spec": {"loadBalancerIP": "'` + b.Env.PublicGatewayIP + `'"}}' -$KUBECTL patch svc gateway-controller -n codesphere -p '{"spec": {"loadBalancerIP": "'` + b.Env.GatewayIP + `'"}}' - -sed -i 's/k0scontroller/k0scontroller --enable-cloud-provider/g' /etc/systemd/system/k0scontroller.service - -ssh -o StrictHostKeyChecking=no root@` + b.Env.ControlPlaneNodes[1].GetInternalIP() + ` "sed -i 's/k0sworker/k0sworker --enable-cloud-provider/g' /etc/systemd/system/k0sworker.service; systemctl daemon-reload; systemctl restart k0sworker" - -ssh -o StrictHostKeyChecking=no root@` + b.Env.ControlPlaneNodes[2].GetInternalIP() + ` "sed -i 's/k0sworker/k0sworker --enable-cloud-provider/g' /etc/systemd/system/k0sworker.service; systemctl daemon-reload; systemctl restart k0sworker" - -systemctl daemon-reload -systemctl restart k0scontroller -` - // Probably we need to enable the cloud provider plugin in k0s configuration. - // --enable-cloud-provider on worker nodes systemd file /etc/systemd/system/k0sworker.service - // in addition on the first node: /etc/systemd/system/k0scontroller.service the flag --enable-cloud-provider - - err := b.fw.WriteFile("configure-k0s.sh", []byte(script), 0755) - if err != nil { - return fmt.Errorf("failed to write configure-k0s.sh: %w", err) - } - err = b.Env.ControlPlaneNodes[0].NodeClient.CopyFile(b.Env.ControlPlaneNodes[0], "configure-k0s.sh", "/root/configure-k0s.sh") - if err != nil { - return fmt.Errorf("failed to copy configure-k0s.sh to control plane node: %w", err) - } - err = b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "chmod +x /root/configure-k0s.sh") - if err != nil { - return fmt.Errorf("failed to make configure-k0s.sh executable on control plane node: %w", err) - } - return nil -} - -func (b *GCPBootstrapper) RunK0sConfigScript() error { - err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "/root/configure-k0s.sh") - if err != nil { - return fmt.Errorf("failed to install Codesphere from jumpbox: %w", err) - } - - return nil -} diff --git a/internal/bootstrap/gcp/gcp_client.go b/internal/bootstrap/gcp/gcp_client.go index 7b764de32..1d1799242 100644 --- a/internal/bootstrap/gcp/gcp_client.go +++ b/internal/bootstrap/gcp/gcp_client.go @@ -101,6 +101,7 @@ func (c *GCPClient) GetProjectByName(folderID string, displayName string) (*reso // No more results found return nil, fmt.Errorf("project not found: %s", displayName) } + if err != nil { return nil, fmt.Errorf("error iterating projects: %w", err) } @@ -231,10 +232,12 @@ func (c *GCPClient) GetBillingInfo(projectID string) (*cloudbilling.ProjectBilli } projectName := getProjectResourceName(projectID) + billingInfo, err := billingService.Projects.GetBillingInfo(projectName).Do() if err != nil { return nil, err } + return billingInfo, nil } @@ -250,6 +253,7 @@ func (c *GCPClient) EnableBilling(projectID, billingAccount string) error { BillingAccountName: fmt.Sprintf("billingAccounts/%s", billingAccount), } _, err = billingService.Projects.UpdateBillingInfo(projectName, billingInfo).Context(c.ctx).Do() + return err } @@ -262,13 +266,16 @@ func (c *GCPClient) EnableAPIs(projectID string, apis []string) error { defer util.IgnoreError(client.Close) // enable APIs in parallel wg := sync.WaitGroup{} + errCh := make(chan error, len(apis)) for _, api := range apis { serviceName := fmt.Sprintf("projects/%s/services/%s", projectID, api) + wg.Add(1) go func(serviceName, api string) { defer wg.Done() + c.st.Logf("Enabling API %s", api) op, err := client.EnableService(c.ctx, &serviceusagepb.EnableServiceRequest{Name: serviceName}) @@ -276,10 +283,12 @@ func (c *GCPClient) EnableAPIs(projectID string, apis []string) error { c.st.Logf("API %s already enabled", api) return } + if err != nil { errCh <- fmt.Errorf("failed to enable API %s: %w", api, err) return } + if _, err := op.Wait(c.ctx); err != nil { errCh <- fmt.Errorf("failed to enable API %s: %w", api, err) return @@ -291,13 +300,16 @@ func (c *GCPClient) EnableAPIs(projectID string, apis []string) error { wg.Wait() close(errCh) + errStr := "" for err := range errCh { errStr += err.Error() + "; " } + if len(errStr) > 0 { return fmt.Errorf("errors occurred while enabling APIs: %s", errStr) } + return nil } @@ -318,11 +330,14 @@ func (c *GCPClient) CreateArtifactRegistry(projectID, region, repoName string) ( Description: "Codesphere managed registry", }, } + op, err := client.CreateRepository(c.ctx, repoReq) if err != nil && !strings.Contains(err.Error(), "already exists") { return nil, err } + var repo *artifactpb.Repository + if err == nil { _, err = op.Wait(c.ctx) if err != nil { @@ -348,6 +363,7 @@ func (c *GCPClient) GetArtifactRegistry(projectID, region, repoName string) (*ar defer util.IgnoreError(client.Close) fullRepoName := fmt.Sprintf("projects/%s/locations/%s/repositories/%s", projectID, region, repoName) + repo, err := client.GetRepository(c.ctx, &artifactpb.GetRepositoryRequest{ Name: fullRepoName, }) @@ -363,6 +379,7 @@ func (c *GCPClient) GetArtifactRegistry(projectID, region, repoName string) (*ar // and an error if any occurred during the process. func (c *GCPClient) CreateServiceAccount(projectID, name, displayName string) (string, bool, error) { saMail := fmt.Sprintf("%s@%s.iam.gserviceaccount.com", name, projectID) + iamService, err := iam.NewService(c.ctx) if err != nil { return saMail, false, err @@ -374,10 +391,12 @@ func (c *GCPClient) CreateServiceAccount(projectID, name, displayName string) (s DisplayName: displayName, }, } + _, err = iamService.Projects.ServiceAccounts.Create(fmt.Sprintf("projects/%s", projectID), saReq).Context(c.ctx).Do() if err != nil && !strings.Contains(err.Error(), "already exists") { return saMail, false, err } + if err != nil && strings.Contains(err.Error(), "already exists") { return saMail, false, nil } @@ -395,6 +414,7 @@ func (c *GCPClient) CreateServiceAccountKey(projectID, saEmail string) (string, keyReq := &iam.CreateServiceAccountKeyRequest{} saName := fmt.Sprintf("projects/%s/serviceAccounts/%s", projectID, saEmail) + key, err := iamService.Projects.ServiceAccounts.Keys.Create(saName, keyReq).Context(c.ctx).Do() if err != nil { return "", err @@ -408,6 +428,7 @@ func (c *GCPClient) AssignIAMRole(projectID, saName string, saProjectID string, saEmail := fmt.Sprintf("%s@%s.iam.gserviceaccount.com", saName, saProjectID) member := fmt.Sprintf("serviceAccount:%s", saEmail) resource := fmt.Sprintf("projects/%s", projectID) + return c.addRoleBindingToProject(member, roles, resource) } @@ -429,18 +450,23 @@ func (c *GCPClient) addRoleBindingToProject(member string, roles []string, resou // Add role bindings to policy updated := false + for _, role := range roles { bindingExists := false + for _, binding := range policy.Bindings { if binding.Role == role { if !slices.Contains(binding.Members, member) { binding.Members = append(binding.Members, member) updated = true } + bindingExists = true + break } } + if bindingExists { continue } @@ -462,6 +488,7 @@ func (c *GCPClient) addRoleBindingToProject(member string, roles []string, resou Policy: policy, } _, err = client.SetIamPolicy(c.ctx, setReq) + return err } @@ -470,6 +497,7 @@ func (c *GCPClient) RemoveIAMRoleBinding(projectID, saName string, saProjectID s saEmail := fmt.Sprintf("%s@%s.iam.gserviceaccount.com", saName, saProjectID) member := fmt.Sprintf("serviceAccount:%s", saEmail) resource := fmt.Sprintf("projects/%s", projectID) + return c.removeRoleBindingFromProject(member, roles, resource) } @@ -486,18 +514,22 @@ func (c *GCPClient) removeRoleBindingFromProject(member string, roles []string, } updated := false + for _, role := range roles { for i, binding := range policy.Bindings { if binding.Role != role { continue } + before := len(binding.Members) + policy.Bindings[i].Members = slices.DeleteFunc(binding.Members, func(m string) bool { return m == member }) if len(policy.Bindings[i].Members) != before { updated = true } + break } } @@ -507,17 +539,20 @@ func (c *GCPClient) removeRoleBindingFromProject(member string, roles []string, } var validBindings []*iampb.Binding + for _, b := range policy.Bindings { if len(b.Members) > 0 { validBindings = append(validBindings, b) } } + policy.Bindings = validBindings _, err = client.SetIamPolicy(c.ctx, &iampb.SetIamPolicyRequest{ Resource: resource, Policy: policy, }) + return err } @@ -534,6 +569,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router Name: &networkName, AutoCreateSubnetworks: protoBool(false), } + op, err := networksClient.Insert(c.ctx, &computepb.InsertNetworkRequest{ Project: projectID, NetworkResource: network, @@ -541,6 +577,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router if err != nil && !strings.Contains(err.Error(), "already exists") { return err } + if err == nil { if err := op.Wait(c.ctx); err != nil { return err @@ -562,6 +599,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router Region: ®ion, Network: protoString(fmt.Sprintf("projects/%s/global/networks/%s", projectID, networkName)), } + op, err = subnetsClient.Insert(c.ctx, &computepb.InsertSubnetworkRequest{ Project: projectID, Region: region, @@ -570,6 +608,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router if err != nil && !strings.Contains(err.Error(), "already exists") { return err } + if err == nil { if err := op.Wait(c.ctx); err != nil { return err @@ -590,6 +629,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router Region: ®ion, Network: protoString(fmt.Sprintf("projects/%s/global/networks/%s", projectID, networkName)), } + op, err = routersClient.Insert(c.ctx, &computepb.InsertRouterRequest{ Project: projectID, Region: region, @@ -598,6 +638,7 @@ func (c *GCPClient) CreateVPC(projectID, region, networkName, subnetName, router if err != nil && !IsAlreadyExistsError(err) { return fmt.Errorf("failed to create router: %w", err) } + if err == nil { if err := op.Wait(c.ctx); err != nil { return fmt.Errorf("failed to wait for router creation: %w", err) @@ -731,6 +772,7 @@ func (c *GCPClient) CreateAddress(projectID, region string, address *computepb.A if err != nil { return "", err } + if err = op.Wait(c.ctx); err != nil { return "", err } @@ -783,6 +825,7 @@ func (c *GCPClient) EnsureDNSManagedZone(projectID, zoneName, dnsName, descripti DnsName: dnsName, Description: description, } + _, err = service.ManagedZones.Create(projectID, zone).Context(c.ctx).Do() if err != nil { return fmt.Errorf("failed to create DNS zone: %w", err) @@ -811,6 +854,7 @@ func (c *GCPClient) EnsureDNSRecordSets(projectID, zoneName string, records []*d delChange := &dns.Change{ Deletions: deletions, } + _, err = service.Changes.Create(projectID, zoneName, delChange).Context(c.ctx).Do() if err != nil { return fmt.Errorf("failed to delete existing DNS records: %w", err) @@ -820,6 +864,7 @@ func (c *GCPClient) EnsureDNSRecordSets(projectID, zoneName string, records []*d change := &dns.Change{ Additions: records, } + _, err = service.Changes.Create(projectID, zoneName, change).Context(c.ctx).Do() if err != nil { return fmt.Errorf("failed to create DNS records: %w", err) @@ -836,14 +881,17 @@ func (c *GCPClient) DeleteDNSRecordSets(projectID, zoneName, baseDomain string) } var deletions []*dns.ResourceRecordSet + for _, record := range GetDNSRecordNames(baseDomain) { existing, err := service.ResourceRecordSets.Get(projectID, zoneName, record.Name, record.Rtype).Context(c.ctx).Do() if IsNotFoundError(err) { continue } + if err != nil { return fmt.Errorf("failed to get DNS record %s: %w", record.Name, err) } + deletions = append(deletions, existing) } @@ -854,6 +902,7 @@ func (c *GCPClient) DeleteDNSRecordSets(projectID, zoneName, baseDomain string) if _, err = service.Changes.Create(projectID, zoneName, &dns.Change{Deletions: deletions}).Context(c.ctx).Do(); err != nil { return fmt.Errorf("failed to delete DNS records: %w", err) } + return nil } @@ -866,11 +915,14 @@ func (c *GCPClient) CreatePublicCAExternalAccountKey(projectID string) (string, if err != nil { return "", "", fmt.Errorf("failed to create publicca client: %w", err) } + parent := fmt.Sprintf("projects/%s/locations/global", projectID) + key, err := svc.Projects.Locations.ExternalAccountKeys.Create(parent, &publicca.ExternalAccountKey{}).Context(c.ctx).Do() if err != nil { return "", "", fmt.Errorf("failed to create public CA external account key: %w", err) } + return key.KeyId, key.B64MacKey, nil } diff --git a/internal/bootstrap/gcp/gcp_client_cleanup_test.go b/internal/bootstrap/gcp/gcp_client_cleanup_test.go index 10cf52bfe..5657751bf 100644 --- a/internal/bootstrap/gcp/gcp_client_cleanup_test.go +++ b/internal/bootstrap/gcp/gcp_client_cleanup_test.go @@ -123,6 +123,7 @@ var _ = Describe("GCP Client Cleanup Methods", func() { records := gcp.GetDNSRecordNames(baseDomain) Expect(records).To(HaveLen(5)) + for _, record := range records { Expect(record.Name).To(ContainSubstring("internal.codesphere.com")) Expect(record.Name).To(HaveSuffix(".")) @@ -149,5 +150,4 @@ var _ = Describe("GCP Client Cleanup Methods", func() { }) }) }) - }) diff --git a/internal/bootstrap/gcp/gcp_test.go b/internal/bootstrap/gcp/gcp_test.go index 41bacb596..ea7224163 100644 --- a/internal/bootstrap/gcp/gcp_test.go +++ b/internal/bootstrap/gcp/gcp_test.go @@ -50,6 +50,7 @@ var _ = Describe("GCP Bootstrapper", func() { JustBeforeEach(func() { var err error + bs, err = gcp.NewGCPBootstrapper( ctx, e, @@ -168,10 +169,11 @@ var _ = Describe("GCP Bootstrapper", func() { icg.EXPECT().GetInstallConfig().RunAndReturn(func() *files.RootConfig { realIcm := newPlainInstallConfigManager() _ = realIcm.ApplyProfile("minimal") + return realIcm.GetInstallConfig() }) - projectId := "test-project-12345" + projectID := "test-project-12345" // EnsureSecrets icg.EXPECT().LoadVaultFromUnecryptedFile("fake-secret").Return(nil) @@ -179,7 +181,7 @@ var _ = Describe("GCP Bootstrapper", func() { // EnsureProject gc.EXPECT().GetProjectByName(mock.Anything, "test-project").Return(nil, fmt.Errorf("project not found: test-project")) - gc.EXPECT().CreateProjectID("test-project").Return(projectId) + gc.EXPECT().CreateProjectID("test-project").Return(projectID) gc.EXPECT().CreateProject(mock.Anything, mock.Anything, "test-project", mock.Anything).Return(mock.Anything, nil) // WriteInfraFile @@ -187,48 +189,48 @@ var _ = Describe("GCP Bootstrapper", func() { fw.EXPECT().WriteFile(mock.Anything, mock.Anything, os.FileMode(0644)).Return(nil) // EnsureBilling - gc.EXPECT().GetBillingInfo(projectId).Return(&cloudbilling.ProjectBillingInfo{BillingEnabled: false}, nil) - gc.EXPECT().EnableBilling(projectId, "test-billing-account").Return(nil) + gc.EXPECT().GetBillingInfo(projectID).Return(&cloudbilling.ProjectBillingInfo{BillingEnabled: false}, nil) + gc.EXPECT().EnableBilling(projectID, "test-billing-account").Return(nil) // EnsureAPIsEnabled - gc.EXPECT().EnableAPIs(projectId, mock.Anything).Return(nil) + gc.EXPECT().EnableAPIs(projectID, mock.Anything).Return(nil) // EnsureArtifactRegistry - gc.EXPECT().GetArtifactRegistry(projectId, "us-central1", "codesphere-registry").Return(nil, fmt.Errorf("not found")) - gc.EXPECT().CreateArtifactRegistry(projectId, "us-central1", "codesphere-registry").Return(&artifactregistrypb.Repository{Name: "codesphere-registry"}, nil) + gc.EXPECT().GetArtifactRegistry(projectID, "us-central1", "codesphere-registry").Return(nil, fmt.Errorf("not found")) + gc.EXPECT().CreateArtifactRegistry(projectID, "us-central1", "codesphere-registry").Return(&artifactregistrypb.Repository{Name: "codesphere-registry"}, nil) // EnsureServiceAccounts - gc.EXPECT().CreateServiceAccount(projectId, "cloud-controller", "cloud-controller").Return("cloud-controller@p.iam.gserviceaccount.com", false, nil) - gc.EXPECT().CreateServiceAccount(projectId, "artifact-registry-writer", "artifact-registry-writer").Return("writer@p.iam.gserviceaccount.com", true, nil) - gc.EXPECT().CreateServiceAccountKey(projectId, "writer@p.iam.gserviceaccount.com").Return("fake-key", nil) + gc.EXPECT().CreateServiceAccount(projectID, "cloud-controller", "cloud-controller").Return("cloud-controller@p.iam.gserviceaccount.com", false, nil) + gc.EXPECT().CreateServiceAccount(projectID, "artifact-registry-writer", "artifact-registry-writer").Return("writer@p.iam.gserviceaccount.com", true, nil) + gc.EXPECT().CreateServiceAccountKey(projectID, "writer@p.iam.gserviceaccount.com").Return("fake-key", nil) // EnsureIAMRoles - gc.EXPECT().AssignIAMRole(projectId, "artifact-registry-writer", projectId, []string{"roles/artifactregistry.writer"}).Return(nil) - gc.EXPECT().AssignIAMRole(projectId, "cloud-controller", projectId, []string{"roles/compute.admin"}).Return(nil) - gc.EXPECT().AssignIAMRole(csEnv.DNSProjectID, "cloud-controller", projectId, []string{"roles/dns.admin"}).Return(nil) + gc.EXPECT().AssignIAMRole(projectID, "artifact-registry-writer", projectID, []string{"roles/artifactregistry.writer"}).Return(nil) + gc.EXPECT().AssignIAMRole(projectID, "cloud-controller", projectID, []string{"roles/compute.admin"}).Return(nil) + gc.EXPECT().AssignIAMRole(csEnv.DNSProjectID, "cloud-controller", projectID, []string{"roles/dns.admin"}).Return(nil) // EnsureVPC - gc.EXPECT().CreateVPC(projectId, "us-central1", projectId+"-vpc", projectId+"-us-central1-subnet", projectId+"-router", projectId+"-nat-gateway").Return(nil) + gc.EXPECT().CreateVPC(projectID, "us-central1", projectID+"-vpc", projectID+"-us-central1-subnet", projectID+"-router", projectID+"-nat-gateway").Return(nil) // EnsureFirewallRules (5 times) - gc.EXPECT().CreateFirewallRule(projectId, mock.Anything).Return(nil).Times(5) + gc.EXPECT().CreateFirewallRule(projectID, mock.Anything).Return(nil).Times(5) // EnsureComputeInstances ipResp := makeRunningInstance("10.0.0.1", "1.2.3.4") - mockGetInstanceNotFoundThenRunning(gc, projectId, "us-central1-a", ipResp, 8) + mockGetInstanceNotFoundThenRunning(gc, projectID, "us-central1-a", ipResp, 8) fw.EXPECT().ReadFile(mock.Anything).Return([]byte("fake-key"), nil).Times(1) - gc.EXPECT().CreateInstance(projectId, "us-central1-a", mock.Anything).Return(nil).Times(8) + gc.EXPECT().CreateInstance(projectID, "us-central1-a", mock.Anything).Return(nil).Times(8) // EnsureGatewayIPAddresses - gc.EXPECT().GetAddress(projectId, "us-central1", "gateway").Return(nil, fmt.Errorf("not found")) - gc.EXPECT().CreateAddress(projectId, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "gateway" })).Return("1.1.1.1", nil) - gc.EXPECT().GetAddress(projectId, "us-central1", "gateway").Return(nil, fmt.Errorf("not found")) - gc.EXPECT().GetAddress(projectId, "us-central1", "public-gateway").Return(nil, fmt.Errorf("not found")) - gc.EXPECT().CreateAddress(projectId, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "public-gateway" })).Return("2.2.2.2", nil) - gc.EXPECT().GetAddress(projectId, "us-central1", "public-gateway").Return(&computepb.Address{Address: protoString("2.2.2.2")}, nil) - gc.EXPECT().GetAddress(projectId, "us-central1", "ssh-proxy").Return(nil, fmt.Errorf("not found")) - gc.EXPECT().CreateAddress(projectId, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "ssh-proxy" })).Return("3.3.3.3", nil) - gc.EXPECT().GetAddress(projectId, "us-central1", "ssh-proxy").Return(&computepb.Address{Address: protoString("3.3.3.3")}, nil) + gc.EXPECT().GetAddress(projectID, "us-central1", "gateway").Return(nil, fmt.Errorf("not found")) + gc.EXPECT().CreateAddress(projectID, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "gateway" })).Return("1.1.1.1", nil) + gc.EXPECT().GetAddress(projectID, "us-central1", "gateway").Return(nil, fmt.Errorf("not found")) + gc.EXPECT().GetAddress(projectID, "us-central1", "public-gateway").Return(nil, fmt.Errorf("not found")) + gc.EXPECT().CreateAddress(projectID, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "public-gateway" })).Return("2.2.2.2", nil) + gc.EXPECT().GetAddress(projectID, "us-central1", "public-gateway").Return(&computepb.Address{Address: protoString("2.2.2.2")}, nil) + gc.EXPECT().GetAddress(projectID, "us-central1", "ssh-proxy").Return(nil, fmt.Errorf("not found")) + gc.EXPECT().CreateAddress(projectID, "us-central1", mock.MatchedBy(func(addr *computepb.Address) bool { return *addr.Name == "ssh-proxy" })).Return("3.3.3.3", nil) + gc.EXPECT().GetAddress(projectID, "us-central1", "ssh-proxy").Return(&computepb.Address{Address: protoString("3.3.3.3")}, nil) // UpdateInstallConfig icg.EXPECT().GenerateSecrets().Return(nil) @@ -257,11 +259,6 @@ var _ = Describe("GCP Bootstrapper", func() { return len(records) == 5 })).Return(nil) - // GenerateK0sConfigScript - fw.EXPECT().WriteFile("configure-k0s.sh", mock.Anything, os.FileMode(0755)).Return(nil) - nodeClient.EXPECT().CopyFile(mock.Anything, "configure-k0s.sh", "/root/configure-k0s.sh").Return(nil) - nodeClient.EXPECT().RunCommand(mock.Anything, "root", "chmod +x /root/configure-k0s.sh").Return(nil) - err := bs.Bootstrap() Expect(err).NotTo(HaveOccurred()) Expect(bs.Env).NotTo(BeNil()) @@ -298,6 +295,7 @@ var _ = Describe("GCP Bootstrapper", func() { Describe("ValidateInput", func() { var artifacts []portal.Artifact + Context("When GitHub team and org is set", func() { BeforeEach(func() { csEnv.GitHubTeamOrg = "codesphere-cloud" @@ -882,6 +880,7 @@ var _ = Describe("GCP Bootstrapper", func() { icg = installer.NewMockInstallConfigManager(GinkgoT()) icg.EXPECT().GetVault().Return(&files.InstallVault{}) + gc = gcp.NewMockGCPClientManager(GinkgoT()) fw = util.NewMockFileIO(GinkgoT()) }) @@ -1375,6 +1374,7 @@ var _ = Describe("GCP Bootstrapper", func() { BeforeEach(func() { csEnv.InstallVersion = "v1.2.3" csEnv.InstallHash = "abc1234567890" + icg.EXPECT().GetSecretFilePath().Return("/etc/codesphere/secrets/prod.vault.yaml").Maybe() }) Describe("Valid InstallCodesphere", func() { diff --git a/internal/bootstrap/gcp/iam_admin.go b/internal/bootstrap/gcp/iam_admin.go index 4e16e51e6..da2e6283d 100644 --- a/internal/bootstrap/gcp/iam_admin.go +++ b/internal/bootstrap/gcp/iam_admin.go @@ -145,6 +145,7 @@ func (b *GCPBootstrapper) EnsureBilling() error { if err != nil { return fmt.Errorf("failed to get billing info: %w", err) } + if bi.BillingEnabled && bi.BillingAccountName == b.Env.BillingAccount { return nil } @@ -195,6 +196,7 @@ func (b *GCPBootstrapper) EnsureServiceAccounts() error { if s := b.icg.GetVault().GetSecret(files.SecretRegistryPassword); s != nil && s.Fields != nil { existingRegPwd = s.Fields.Password } + if !newSa && existingRegPwd != "" { return nil } @@ -206,8 +208,10 @@ func (b *GCPBootstrapper) EnsureServiceAccounts() error { if retries > 3 { return fmt.Errorf("failed to create service account key: %w", err) } + b.stlog.LogRetry() b.Time.Sleep(5 * time.Second) + continue } diff --git a/internal/bootstrap/gcp/iam_admin_test.go b/internal/bootstrap/gcp/iam_admin_test.go index ee37a8463..681ae3beb 100644 --- a/internal/bootstrap/gcp/iam_admin_test.go +++ b/internal/bootstrap/gcp/iam_admin_test.go @@ -43,6 +43,7 @@ var _ = Describe("IAM & Admin", func() { JustBeforeEach(func() { var err error + bs, err = gcp.NewGCPBootstrapper( ctx, e, @@ -130,6 +131,7 @@ var _ = Describe("IAM & Admin", func() { Describe("Invalid cases", func() { It("returns error when GetProjectByName fails unexpectedly", func() { gc.EXPECT().GetProjectByName("", csEnv.ProjectName).Return(nil, fmt.Errorf("api error")) + err := bs.EnsureProject() Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("failed to get project")) @@ -166,6 +168,7 @@ var _ = Describe("IAM & Admin", func() { BillingAccountName: csEnv.BillingAccount, } gc.EXPECT().GetBillingInfo(csEnv.ProjectID).Return(bi, nil) + err := bs.EnsureBilling() Expect(err).NotTo(HaveOccurred()) }) @@ -260,6 +263,7 @@ var _ = Describe("IAM & Admin", func() { gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "cloud-controller", "cloud-controller").Return("email@sa", false, nil) gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "artifact-registry-writer", "artifact-registry-writer").Return("writer@sa", true, nil) gc.EXPECT().CreateServiceAccountKey(csEnv.ProjectID, "writer@sa").Return("key-content", nil) + err := bs.EnsureServiceAccounts() Expect(err).NotTo(HaveOccurred()) Expect(vault.GetSecret(files.SecretRegistryPassword).Fields.Password).To(Equal("key-content")) @@ -317,5 +321,4 @@ var _ = Describe("IAM & Admin", func() { }) }) }) - }) diff --git a/internal/bootstrap/gcp/iam_admin_unexported_test.go b/internal/bootstrap/gcp/iam_admin_unexported_test.go index 49f810d4c..b191a60c3 100644 --- a/internal/bootstrap/gcp/iam_admin_unexported_test.go +++ b/internal/bootstrap/gcp/iam_admin_unexported_test.go @@ -12,8 +12,10 @@ import ( var _ = Describe("IAM & Admin - Unexported", func() { Describe("calculateProjectExpiryLabel", func() { - const customDateFormat string = "2006-01-02_15-04-05_utc" - const customDateFormatRegex string = `^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}_utc$` + const ( + customDateFormat string = "2006-01-02_15-04-05_utc" + customDateFormatRegex string = `^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}_utc$` + ) type validTestCase struct { inputTTL string diff --git a/internal/bootstrap/gcp/infrafile.go b/internal/bootstrap/gcp/infrafile.go index 1c86eedf5..807a9c541 100644 --- a/internal/bootstrap/gcp/infrafile.go +++ b/internal/bootstrap/gcp/infrafile.go @@ -54,12 +54,14 @@ func (b *GCPBootstrapper) WriteInfraFile() error { } workdir := env.NewEnv().GetOmsWorkdir() + err = b.fw.MkdirAll(workdir, 0755) if err != nil { return fmt.Errorf("failed to create workdir: %w", err) } infraFilePath := GetInfraFilePath() + err = b.fw.WriteFile(infraFilePath, envBytes, 0644) if err != nil { return fmt.Errorf("failed to write gcp bootstrap env file: %w", err) diff --git a/internal/bootstrap/gcp/infrafile_test.go b/internal/bootstrap/gcp/infrafile_test.go index d633bb7fe..5ff905257 100644 --- a/internal/bootstrap/gcp/infrafile_test.go +++ b/internal/bootstrap/gcp/infrafile_test.go @@ -39,6 +39,7 @@ var _ = Describe("Infrafile", func() { JustBeforeEach(func() { var err error + bs, err = gcp.NewGCPBootstrapper( ctx, e, diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 76864504d..22212027b 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -54,6 +54,7 @@ func (b *GCPBootstrapper) loadVaultForConfigTemplating() error { if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { return fmt.Errorf("failed to load vault from file: %w", err) } + return nil } @@ -65,12 +66,14 @@ func (b *GCPBootstrapper) recoverConfig() error { if err != nil { return fmt.Errorf("failed to find gcp project for config recovery: %w", err) } + b.Env.ProjectID = existingProject.ProjectId jumpbox, err := b.GetNodeByName("jumpbox") if err != nil { return fmt.Errorf("failed to find jumpbox node for config recovery: %w", err) } + b.Env.Jumpbox = jumpbox err = b.Env.Jumpbox.NodeClient.DownloadFile(jumpbox, remoteInstallConfigPath, b.Env.InstallConfigPath) @@ -115,9 +118,11 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { if b.Env.DatacenterName == "" { b.Env.DatacenterName = "dev" } + b.Env.InstallConfig.Datacenter.Name = b.Env.DatacenterName b.Env.InstallConfig.Datacenter.City = "Karlsruhe" b.Env.InstallConfig.Datacenter.CountryCode = "DE" + b.Env.InstallConfig.Secrets.BaseDir = b.Env.SecretsDir if b.Env.RegistryType != RegistryTypeGitHub { b.Env.InstallConfig.Registry.ReplaceImagesInBom = true @@ -211,6 +216,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { if b.Env.DNSProjectID == "" { dnsProject = b.Env.ProjectID } + b.Env.InstallConfig.Cluster.Certificates.Override = map[string]interface{}{ "issuers": map[string]interface{}{ "letsEncryptHttp": map[string]interface{}{ @@ -227,10 +233,12 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { }, }, } + acmeServer := "https://acme-v02.api.letsencrypt.org/directory" if b.Env.ACMEStaging { acmeServer = "https://acme-staging-v02.api.letsencrypt.org/directory" } + acmeConfig := &files.ACMEConfig{ Enabled: true, Email: "oms-testing@" + b.Env.BaseDomain, @@ -241,10 +249,13 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { if err != nil { return fmt.Errorf("failed to obtain Google Public CA EAB credentials: %w", err) } + acmeConfig.Server = "https://dv.acme-v02.api.pki.goog/directory" acmeConfig.EABKeyID = keyID + b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretAcmeEabMacKey, Fields: &files.SecretFields{Password: b64MacKey}}) } + b.Env.InstallConfig.Codesphere.CertIssuer = &files.CertIssuerConfig{ Type: "acme", Acme: acmeConfig, @@ -280,6 +291,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretGithubAppsClientId, Fields: &files.SecretFields{Password: b.Env.GitHubAppClientID}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretGithubAppsClientSecret, Fields: &files.SecretFields{Password: b.Env.GitHubAppClientSecret}}) } + if b.Env.GitLabAppClientID != "" && b.Env.GitLabAppClientSecret != "" { b.Env.InstallConfig.Codesphere.GitProviders.GitLab = &files.GitProviderConfig{ Enabled: true, @@ -298,6 +310,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretGitlabAppClientId, Fields: &files.SecretFields{Password: b.Env.GitLabAppClientID}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretGitlabAppClientSecret, Fields: &files.SecretFields{Password: b.Env.GitLabAppClientSecret}}) } + if b.Env.BitbucketAppClientID != "" && b.Env.BitbucketAppClientSecret != "" { b.Env.InstallConfig.Codesphere.GitProviders.Bitbucket = &files.GitProviderConfig{ Enabled: true, @@ -316,6 +329,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretBitbucketAppsClientId, Fields: &files.SecretFields{Password: b.Env.BitbucketAppClientID}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretBitbucketAppsClientSecret, Fields: &files.SecretFields{Password: b.Env.BitbucketAppClientSecret}}) } + if b.Env.AzureDevOpsAppClientID != "" && b.Env.AzureDevOpsAppClientSecret != "" { b.Env.InstallConfig.Codesphere.GitProviders.AzureDevOps = &files.GitProviderConfig{ Enabled: true, @@ -335,11 +349,13 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretAzureDevOpsAppClientId, Fields: &files.SecretFields{Password: b.Env.AzureDevOpsAppClientID}}) b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretAzureDevOpsAppClientSecret, Fields: &files.SecretFields{Password: b.Env.AzureDevOpsAppClientSecret}}) } + if b.Env.OidcIssuerURL != "" && b.Env.OidcClientID != "" && b.Env.OidcClientSecret != "" { name := b.Env.OidcProviderName if name == "" { name = "OIDC" } + b.Env.InstallConfig.Codesphere.OAuth = &files.OAuthProvidersConfig{ Oidc: &files.OidcOAuthProvider{ Type: "oidc", @@ -370,6 +386,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { if b.Env.ClusterAdminEmail != "" { b.Env.InstallConfig.Codesphere.ClusterAdminEmail = b.Env.ClusterAdminEmail } + b.applyExternalLokiConfig() b.applyPrometheusRemoteWriteConfig() @@ -390,6 +407,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { if b.Env.InstallConfig.Cluster.Monitoring == nil { b.Env.InstallConfig.Cluster.Monitoring = &files.MonitoringConfig{} } + b.Env.InstallConfig.Cluster.Monitoring.CentralOtelExport = &files.CentralOtelConfig{ Enabled: true, Username: b.Env.CentralOtelUsername, @@ -495,6 +513,7 @@ func (b *GCPBootstrapper) applyExternalLokiConfig() { if b.Env.InstallConfig.Cluster.Monitoring == nil { b.Env.InstallConfig.Cluster.Monitoring = &files.MonitoringConfig{} } + if b.Env.InstallConfig.Cluster.Monitoring.GrafanaAlloy == nil { b.Env.InstallConfig.Cluster.Monitoring.GrafanaAlloy = &files.GrafanaAlloyConfig{} } @@ -518,9 +537,11 @@ func (b *GCPBootstrapper) applyPrometheusRemoteWriteConfig() { if b.Env.InstallConfig.Cluster.Monitoring == nil { b.Env.InstallConfig.Cluster.Monitoring = &files.MonitoringConfig{} } + if b.Env.InstallConfig.Cluster.Monitoring.Prometheus == nil { b.Env.InstallConfig.Cluster.Monitoring.Prometheus = &files.PrometheusConfig{} } + if b.Env.InstallConfig.Cluster.Monitoring.Prometheus.RemoteWrite == nil { b.Env.InstallConfig.Cluster.Monitoring.Prometheus.RemoteWrite = &files.RemoteWriteConfig{} } @@ -547,6 +568,7 @@ func (b *GCPBootstrapper) regeneratePostgresCerts(previousPrimaryIP, previousPri if caSecret == nil || caSecret.File == nil { return fmt.Errorf("postgres CA key not found in vault") } + primaryKeyPEM, primaryCertPEM, err := secrets.GenerateServerCertificate( caSecret.File.Content, b.Env.InstallConfig.Postgres.CACertPem, @@ -555,12 +577,16 @@ func (b *GCPBootstrapper) regeneratePostgresCerts(previousPrimaryIP, previousPri if err != nil { return fmt.Errorf("failed to generate primary server certificate: %w", err) } + if err := secrets.ValidateCertKeyPair(primaryCertPEM, primaryKeyPEM); err != nil { return fmt.Errorf("primary PostgreSQL cert/key validation failed: %w", err) } + vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresPrimaryServerKeyPem, File: &files.SecretFile{Name: "primary.key", Content: primaryKeyPEM}}) + b.Env.InstallConfig.Postgres.Primary.SSLConfig.ServerCertPem = primaryCertPEM } + if b.Env.InstallConfig.Postgres.Replica != nil { replicaKeySecret := vault.GetSecret(files.SecretPostgresReplicaServerKeyPem) if replicaKeySecret == nil || replicaKeySecret.File == nil { @@ -568,6 +594,7 @@ func (b *GCPBootstrapper) regeneratePostgresCerts(previousPrimaryIP, previousPri if caSecret == nil || caSecret.File == nil { return fmt.Errorf("postgres CA key not found in vault") } + replicaKeyPEM, replicaCertPEM, err := secrets.GenerateServerCertificate( caSecret.File.Content, b.Env.InstallConfig.Postgres.CACertPem, @@ -576,13 +603,17 @@ func (b *GCPBootstrapper) regeneratePostgresCerts(previousPrimaryIP, previousPri if err != nil { return fmt.Errorf("failed to generate replica server certificate: %w", err) } + if err := secrets.ValidateCertKeyPair(replicaCertPEM, replicaKeyPEM); err != nil { return fmt.Errorf("replica PostgreSQL cert/key validation failed: %w", err) } + vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresReplicaServerKeyPem, File: &files.SecretFile{Name: "replica.key", Content: replicaKeyPEM}}) + b.Env.InstallConfig.Postgres.Replica.SSLConfig.ServerCertPem = replicaCertPEM } } + return nil } @@ -604,7 +635,9 @@ func (b *GCPBootstrapper) EnsureSecrets() error { if err := b.icg.LoadVaultFromUnecryptedFile(b.Env.SecretsFilePath); err != nil { return fmt.Errorf("failed to load vault file: %w", err) } + b.Env.Secrets = b.icg.GetVault() + return nil } diff --git a/internal/bootstrap/gcp/install_config_test.go b/internal/bootstrap/gcp/install_config_test.go index 30bb50e62..55af1cad9 100644 --- a/internal/bootstrap/gcp/install_config_test.go +++ b/internal/bootstrap/gcp/install_config_test.go @@ -45,6 +45,7 @@ var _ = Describe("Installconfig & Secrets", func() { JustBeforeEach(func() { var err error + bs, err = gcp.NewGCPBootstrapper( ctx, e, @@ -310,9 +311,11 @@ var _ = Describe("Installconfig & Secrets", func() { Describe("UpdateInstallConfig", func() { var vault *files.InstallVault + BeforeEach(func() { vault = &files.InstallVault{} icg.EXPECT().GetVault().Return(vault).Maybe() + csEnv.GitHubAppName = "fake-app-name" }) Describe("Valid UpdateInstallConfig", func() { @@ -1090,6 +1093,7 @@ var _ = Describe("Installconfig & Secrets", func() { vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresCaKeyPem, File: &files.SecretFile{Name: "ca.key", Content: caKey}}) vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresPrimaryServerKeyPem, File: &files.SecretFile{Name: "primary.key", Content: key}}) + csEnv.InstallConfig.Postgres.CACertPem = caCert csEnv.InstallConfig.Postgres.Primary.IP = "10.0.0.1" csEnv.InstallConfig.Postgres.Primary.Hostname = "postgres" @@ -1122,6 +1126,7 @@ var _ = Describe("Installconfig & Secrets", func() { vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresCaKeyPem, File: &files.SecretFile{Name: "ca.key", Content: caKey}}) vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresPrimaryServerKeyPem, File: &files.SecretFile{Name: "primary.key", Content: key}}) + csEnv.InstallConfig.Postgres.CACertPem = caCert csEnv.InstallConfig.Postgres.Primary.IP = "10.0.0.99" csEnv.InstallConfig.Postgres.Primary.Hostname = "postgres" @@ -1159,6 +1164,7 @@ var _ = Describe("Installconfig & Secrets", func() { Expect(err).NotTo(HaveOccurred()) vault.SetSecret(files.SecretEntry{Name: files.SecretPostgresCaKeyPem, File: &files.SecretFile{Name: "ca.key", Content: caKey}}) + csEnv.InstallConfig.Postgres.CACertPem = caCert csEnv.InstallConfig.Postgres.Primary.IP = "10.0.0.1" csEnv.InstallConfig.Postgres.Primary.Hostname = "postgres" diff --git a/internal/bootstrap/gcp/k0s.go b/internal/bootstrap/gcp/k0s.go new file mode 100644 index 000000000..ef9604770 --- /dev/null +++ b/internal/bootstrap/gcp/k0s.go @@ -0,0 +1,182 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package gcp + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/codesphere-cloud/oms/internal/installer" +) + +// EnsureK0s executed all steps to ensure a k0s cluster in gcp. +// Only executing the config script needs to be done after installing codesphere, as crucial parts are still in the ts-installer. +// Returns an error if k0s could not be ensured. +func (b *GCPBootstrapper) EnsureK0s() error { + err := b.GenerateK0sConfigScript() + if err != nil { + return fmt.Errorf("failed to generate k0s config script: %w", err) + } + + err = b.InstallK0s() + if err != nil { + return fmt.Errorf("failed to install k0s: %w", err) + } + + err = b.WaitForK0sNodes() + if err != nil { + return fmt.Errorf("failed waiting for k0s nodes to get ready: %w", err) + } + + return nil +} + +// GenerateK0sConfigScript creates a script to confire k0s in a gcp VM that will be executed on the control plane +// Returns an error if the script can't be generated, written, copied. +func (b *GCPBootstrapper) GenerateK0sConfigScript() error { + var enableWorkerDaemonsCmds strings.Builder + + for i := 1; i < len(b.Env.ControlPlaneNodes); i++ { + internalIP := b.Env.ControlPlaneNodes[i].GetInternalIP() + fmt.Fprintf(&enableWorkerDaemonsCmds, "ssh -o StrictHostKeyChecking=no root@%s sed -i 's/k0sworker/k0sworker --enable-cloud-provider/g' /etc/systemd/system/k0sworker.service; systemctl daemon-reload; systemctl restart k0sworker", internalIP) + fmt.Fprint(&enableWorkerDaemonsCmds, "\n") + } + + script := fmt.Sprintf(`#!/bin/bash + +cat < cloud.conf +[Global] +project-id = "$PROJECT_ID" +EOF + +cat <> cc-deployment.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: cloud-controller-manager + namespace: kube-system + labels: + component: cloud-controller-manager +spec: + selector: + matchLabels: + component: cloud-controller-manager + template: + metadata: + labels: + component: cloud-controller-manager + spec: + serviceAccountName: cloud-controller-manager + containers: + - name: cloud-controller-manager + image: k8scloudprovidergcp/cloud-controller-manager:latest + command: + - /usr/local/bin/cloud-controller-manager + args: + - --v=5 + - --cloud-provider=gce + - --cloud-config=/etc/gce/cloud.conf + - --leader-elect-resource-name=k0s-gcp-ccm + - --use-service-account-credentials=true + - --controllers=cloud-node,cloud-node-lifecycle,service + - --allocate-node-cidrs=false + - --configure-cloud-routes=false + volumeMounts: + - name: cloud-config-volume + mountPath: /etc/gce + readOnly: true + volumes: + - name: cloud-config-volume + configMap: + name: cloud-config + tolerations: + - key: node.cloudprovider.kubernetes.io/uninitialized + value: "true" + effect: NoSchedule + - key: node-role.kubernetes.io/master + effect: NoSchedule + - key: node-role.kubernetes.io/control-plane + effect: NoSchedule +EOF + +KUBECTL="/etc/codesphere/deps/kubernetes/files/k0s kubectl" +$KUBECTL create configmap cloud-config --from-file=cloud.conf -n kube-system +echo alias kubectl=\"$KUBECTL\" >> /root/.bashrc +echo alias k=\"$KUBECTL\" >> /root/.bashrc + +$KUBECTL apply -f https://raw.githubusercontent.com/kubernetes/cloud-provider-gcp/refs/tags/providers/v0.28.2/deploy/packages/default/manifest.yaml + +$KUBECTL apply -f cc-deployment.yaml + +# set loadBalancerIP for public-gateway-controller and gateway-controller +$KUBECTL patch svc public-gateway-controller -n codesphere -p '{"spec": {"loadBalancerIP": "'%s'"}}' +$KUBECTL patch svc gateway-controller -n codesphere -p '{"spec": {"loadBalancerIP": "'%s'"}}' + +%s + +sed -i 's/k0scontroller/k0scontroller --enable-cloud-provider/g' /etc/systemd/system/k0scontroller.service +systemctl daemon-reload +systemctl restart k0scontroller +`, b.Env.PublicGatewayIP, b.Env.GatewayIP, enableWorkerDaemonsCmds.String()) + + // Probably we need to enable the cloud provider plugin in k0s configuration. + // --enable-cloud-provider on worker nodes systemd file /etc/systemd/system/k0sworker.service + // in addition on the first node: /etc/systemd/system/k0scontroller.service the flag --enable-cloud-provider + + err := b.fw.WriteFile("configure-k0s.sh", []byte(script), 0755) + if err != nil { + return fmt.Errorf("failed to write configure-k0s.sh: %w", err) + } + + err = b.Env.ControlPlaneNodes[0].NodeClient.CopyFile(b.Env.ControlPlaneNodes[0], "configure-k0s.sh", "/root/configure-k0s.sh") + if err != nil { + return fmt.Errorf("failed to copy configure-k0s.sh to control plane node: %w", err) + } + + err = b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "chmod +x /root/configure-k0s.sh") + if err != nil { + return fmt.Errorf("failed to make configure-k0s.sh executable on control plane node: %w", err) + } + + return nil +} + +// RunK0sConfigScript executed the configure script for k0s on the control-plane +// Return an error if executing the ssh command fails +func (b *GCPBootstrapper) RunK0sConfigScript() error { + err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "/root/configure-k0s.sh") + if err != nil { + return fmt.Errorf("failed to configure k0s on the control-plane: %w", err) + } + + return nil +} + +// InstallK0s deploys k0s with the native OMS installer and stores its +// kubeconfig in the encrypted install vault for the remaining installer steps. +func (b *GCPBootstrapper) InstallK0s() error { + // Reuse matching cached binaries and let k0sctl reconcile normally. Without + // --force, an unchanged cluster remains untouched on bootstrap retries. + installCmd := fmt.Sprintf("oms install k0s --version %s --install-config /etc/codesphere/config.yaml --vault %s --vault-priv-key %s/age_key.txt", + installer.DefaultK0sVersion, filepath.Join(b.Env.SecretsDir, "prod.vault.yaml"), b.Env.SecretsDir) + if err := b.Env.Jumpbox.RunSSHCommand("root", installCmd); err != nil { + return fmt.Errorf("failed to install k0s from jumpbox: %w", err) + } + + return nil +} + +// WaitForK0sNodes restores the readiness barrier from the TypeScript +// Kubernetes setup. k0sctl apply completing is not sufficient for the +// Codesphere charts: all schedulable nodes must be Ready before gateway +// controllers and their admission webhooks are installed. +func (b *GCPBootstrapper) WaitForK0sNodes() error { + const command = "k0s kubectl wait --for=condition=Ready nodes --all --timeout=30m" + if err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", command); err != nil { + return fmt.Errorf("k0s nodes did not become ready: %w", err) + } + + return nil +} diff --git a/internal/bootstrap/gcp/test_helpers_test.go b/internal/bootstrap/gcp/test_helpers_test.go index c09804361..77acc0fee 100644 --- a/internal/bootstrap/gcp/test_helpers_test.go +++ b/internal/bootstrap/gcp/test_helpers_test.go @@ -49,6 +49,7 @@ func makeInstance(status, internalIP, externalIP string) *computepb.Instance { {NatIP: protoString(externalIP)}, } } + return inst } @@ -67,14 +68,18 @@ func makeStoppedInstance(internalIP, externalIP string) *computepb.Instance { // Uses .Times(numVMs * 2) to expect exactly 2 calls per VM (initial check + poll after create). func mockGetInstanceNotFoundThenRunning(gc *gcp.MockGCPClientManager, projectID, zone string, runningResp *computepb.Instance, numVMs int) { instanceCalls := make(map[string]int) + var mu sync.Mutex + gc.EXPECT().GetInstance(projectID, zone, mock.Anything).RunAndReturn(func(projectID, zone, name string) (*computepb.Instance, error) { mu.Lock() defer mu.Unlock() + instanceCalls[name]++ if instanceCalls[name] == 1 { return nil, status.Errorf(codes.NotFound, "not found") } + return runningResp, nil }).Times(numVMs * 2) } @@ -110,5 +115,6 @@ func newTestBootstrapperAll(csEnv *gcp.CodesphereEnvironment, gc gcp.GCPClientMa if err != nil { panic("newTestBootstrapperAll: " + err.Error()) } + return bs } From 7d8badaecd6aecab8552b6ff5a4b4f662b93fd48 Mon Sep 17 00:00:00 2001 From: Jonas Kauke Date: Fri, 4 Sep 2026 10:35:07 +0200 Subject: [PATCH 099/132] chore: format gcp bootstrap cli files (#781) some formatting for the gcp bootstrapping files --- cli/cmd/bootstrap_gcp.go | 57 +++++++++++++++-------- cli/cmd/bootstrap_gcp_cleanup_test.go | 6 +++ cli/cmd/bootstrap_gcp_postconfig.go | 4 ++ cli/cmd/bootstrap_gcp_restart_vms.go | 5 ++ cli/cmd/bootstrap_gcp_restart_vms_test.go | 1 + 5 files changed, 54 insertions(+), 19 deletions(-) diff --git a/cli/cmd/bootstrap_gcp.go b/cli/cmd/bootstrap_gcp.go index 5e36f993b..334158061 100644 --- a/cli/cmd/bootstrap_gcp.go +++ b/cli/cmd/bootstrap_gcp.go @@ -22,6 +22,8 @@ import ( intutil "github.com/codesphere-cloud/oms/internal/util" ) +// BootstrapGcpCmd holds the bootstrap-gcp command parameters, which +// provisions the GCP infrastructure to install a Codesphere cluster on. type BootstrapGcpCmd struct { cmd *cobra.Command Opts *util.GlobalOptions @@ -29,11 +31,13 @@ type BootstrapGcpCmd struct { CodesphereEnv *gcp.CodesphereEnvironment InputRegistryType string SSHQuiet bool + // experiments backs the deprecated --experiments flag; its values // are folded into the internal bucket for backwards compatibility. experiments []string } +// RunE is the starting point for the bootstrap command that executes the bootstrap logic. func (c *BootstrapGcpCmd) RunE(_ *cobra.Command, args []string) error { err := c.BootstrapGcp() if err != nil { @@ -43,6 +47,7 @@ func (c *BootstrapGcpCmd) RunE(_ *cobra.Command, args []string) error { return nil } +// AddBootstrapGcpCmd registers the gcp bootstrap command in the parent command func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { bootstrapGcpCmd := BootstrapGcpCmd{ cmd: &cobra.Command{ @@ -65,10 +70,11 @@ func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.ProjectTTL, "project-ttl", "2h", "Time to live for the GCP project. Cleanup workflows will remove it afterwards. (default: 2 hours)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.BillingAccount, "billing-account", "", "GCP Billing Account ID (required)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.BaseDomain, "base-domain", "", "Base domain for Codesphere (required)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubAppClientID, "github-app-client-id", "", "GitHub App Client ID (required)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubAppClientSecret, "github-app-client-secret", "", "GitHub App Client Secret (required)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitLabAppClientID, "gitlab-app-client-id", "", "GitLab App Client ID (optional)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitLabAppClientSecret, "gitlab-app-client-secret", "", "GitLab App Client Secret (optional)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SecretsDir, "secrets-dir", "/etc/codesphere/secrets", "Directory for secrets (default: /etc/codesphere/secrets)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.FolderID, "folder-id", "", "GCP Folder ID (optional)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SSHPublicKeyPath, "ssh-public-key-path", "~/.ssh/id_rsa.pub", "SSH Public Key Path (default: ~/.ssh/id_rsa.pub)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SSHPrivateKeyPath, "ssh-private-key-path", "~/.ssh/id_rsa", "SSH Private Key Path (default: ~/.ssh/id_rsa)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.BitbucketAppClientID, "bitbucket-app-client-id", "", "Bitbucket App Client ID (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.BitbucketAppClientSecret, "bitbucket-app-client-secret", "", "Bitbucket App Client Secret (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.AzureDevOpsAppClientID, "azure-devops-app-client-id", "", "Azure DevOps App Client ID (optional)") @@ -77,23 +83,35 @@ func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.OidcIssuerURL, "oidc-issuer-url", "", "OIDC OAuth provider issuer URL (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.OidcClientID, "oidc-client-id", "", "OIDC OAuth provider Client ID (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.OidcClientSecret, "oidc-client-secret", "", "OIDC OAuth provider Client Secret (optional)") + + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubAppClientID, "github-app-client-id", "", "GitHub App Client ID (required)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubAppClientSecret, "github-app-client-secret", "", "GitHub App Client Secret (required)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitLabAppClientID, "gitlab-app-client-id", "", "GitLab App Client ID (optional)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitLabAppClientSecret, "gitlab-app-client-secret", "", "GitLab App Client Secret (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubPAT, "github-pat", "", "GitHub Personal Access Token used for direct image access and fetching team SSH keys. Required when using --github-team-org/--github-team-slug. Required scopes: read:packages, read:org.") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubAppName, "github-app-name", "", "GitHub App Name (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubTeamOrg, "github-team-org", "", "GitHub organization used to fetch team SSH keys (optional, used with --github-team-slug). Requires --github-pat with at least the read:org scope.") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.GitHubTeamSlug, "github-team-slug", "", "GitHub team slug used to fetch team SSH keys (optional, used with --github-team-org). Requires --github-pat with at least the read:org scope.") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SecretsDir, "secrets-dir", "/etc/codesphere/secrets", "Directory for secrets (default: /etc/codesphere/secrets)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.FolderID, "folder-id", "", "GCP Folder ID (optional)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SSHPublicKeyPath, "ssh-public-key-path", "~/.ssh/id_rsa.pub", "SSH Public Key Path (default: ~/.ssh/id_rsa.pub)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SSHPrivateKeyPath, "ssh-private-key-path", "~/.ssh/id_rsa", "SSH Private Key Path (default: ~/.ssh/id_rsa)") + + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.DNSProjectID, "dns-project-id", "", "GCP Project ID for Cloud DNS (optional)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.DNSZoneName, "dns-zone-name", "oms-testing", "Cloud DNS Zone Name (optional)") flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.Preemptible, "preemptible", false, "Use preemptible VMs for Codesphere infrastructure. Mutually exclusive with --spot-vms (default: false)") flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.SpotVMs, "spot-vms", false, "Use Spot VMs for Codesphere infrastructure. Falls back to standard VMs if spot capacity unavailable. Mutually exclusive with --preemptible (default: false)") + flags.Int64Var(&bootstrapGcpCmd.CodesphereEnv.RootDiskSize, "root-disk-size", 50, "Instance root disk size in GB (default: 50)") + + flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.WriteConfig, "write-config", true, "Write generated install config to file (default: true)") + flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.RecoverConfig, "recover-config", false, "Recover previously generated install config from the jumpbox. This will overwrite the local config! (default: false)") + flags.BoolVar(&bootstrapGcpCmd.SSHQuiet, "ssh-quiet", false, "Suppress SSH command output (default: false)") + flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.CreateTestUser, "create-test-user", false, "Create a test user with API token on the bootstrapped instance for smoke testing (default: false)") + + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.InstallConfigPath, "install-config", "config.yaml", "Path to install config file (optional)") + flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SecretsFilePath, "secrets-file", "prod.vault.yaml", "Path to secrets files (optional)") + flags.IntVar(&bootstrapGcpCmd.CodesphereEnv.DatacenterID, "datacenter-id", 1, "Datacenter ID (default: 1)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.DatacenterName, "datacenter-name", "dev", "Datacenter name (default: dev)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.CustomPgIP, "custom-pg-ip", "", "Custom PostgreSQL IP (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.Region, "region", "europe-west4", "GCP Region (default: europe-west4)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.Zone, "zone", "europe-west4-a", "GCP Zone (default: europe-west4-a)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.DNSProjectID, "dns-project-id", "", "GCP Project ID for Cloud DNS (optional)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.DNSZoneName, "dns-zone-name", "oms-testing", "Cloud DNS Zone Name (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.InstallLocal, "install-local", "", "Install Codesphere from local package (default: none)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.InstallVersion, "install-version", "", "Codesphere version to install (default: none)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.InstallHash, "install-hash", "", "Codesphere package hash to install (default: none)") @@ -114,14 +132,6 @@ func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.PrometheusRemoteWritePassword, "prometheus-remote-write-password", "", "Prometheus remote write password stored in the generated vault (optional)") flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.ClusterAdminEmail, "cluster-admin-email", "", "Email address of the initial cluster admin. Written to the install config and applied as the cluster-admin-email secret before the Codesphere platform is installed (optional)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.InstallConfigPath, "install-config", "config.yaml", "Path to install config file (optional)") - flags.StringVar(&bootstrapGcpCmd.CodesphereEnv.SecretsFilePath, "secrets-file", "prod.vault.yaml", "Path to secrets files (optional)") - flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.WriteConfig, "write-config", true, "Write generated install config to file (default: true)") - flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.RecoverConfig, "recover-config", false, "Recover previously generated install config from the jumpbox. This will overwrite the local config! (default: false)") - flags.BoolVar(&bootstrapGcpCmd.SSHQuiet, "ssh-quiet", false, "Suppress SSH command output (default: false)") - flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.CreateTestUser, "create-test-user", false, "Create a test user with API token on the bootstrapped instance for smoke testing (default: false)") - flags.Int64Var(&bootstrapGcpCmd.CodesphereEnv.RootDiskSize, "root-disk-size", 50, "Instance root disk size in GB (default: 50)") - flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.GoogleACMEIssuer, "google-acme-issuer", false, "Use Google Public CA as the ACME issuer instead of Let's Encrypt. External Account Binding credentials are obtained automatically via the publicca API (default: false)") flags.BoolVar(&bootstrapGcpCmd.CodesphereEnv.ACMEStaging, "acme-staging", false, "Use the Let's Encrypt staging ACME endpoint (certificates are not browser-trusted)") @@ -146,6 +156,8 @@ func AddBootstrapGcpCmd(parent *cobra.Command, opts *util.GlobalOptions) { AddBootstrapGcpRestartVMsCmd(bootstrapGcpCmd.cmd, opts) } +// BootstrapGcp initializes the bootstrapper, validates the input flags and starts bootstrapping. +// Returns an error if validation or github client connection fails func (c *BootstrapGcpCmd) BootstrapGcp() error { ctx := c.cmd.Context() stlog := bootstrap.NewStepLogger(false) @@ -154,9 +166,11 @@ func (c *BootstrapGcpCmd) BootstrapGcp() error { if err != nil { return fmt.Errorf("failed to initialize conig manager: %w", err) } + gcpClient := gcp.NewGCPClient(ctx, stlog, os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")) fw := intutil.NewFilesystemWriter() portalClient := portal.NewPortalClient() + githubClient, err := github.NewGitHubClient(ctx, c.CodesphereEnv.GitHubPAT) if err != nil { return fmt.Errorf("failed to create github client: %w", err) @@ -176,10 +190,11 @@ func (c *BootstrapGcpCmd) BootstrapGcp() error { githubClient, ) if err != nil { - return err + return fmt.Errorf("failed to create gcp bootstrapper: %w", err) } c.CodesphereEnv.RegistryType = gcp.RegistryType(c.InputRegistryType) + c.CodesphereEnv.OmsWorkdir = c.Env.GetOmsWorkdir() if c.CodesphereEnv.GitHubPAT != "" { c.CodesphereEnv.RegistryType = gcp.RegistryTypeGitHub @@ -207,6 +222,7 @@ func (c *BootstrapGcpCmd) BootstrapGcp() error { if bs.Env.Jumpbox != nil && bs.Env.Jumpbox.GetExternalIP() != "" { log.Printf("To debug on the jumpbox host:\nssh-add $SSH_KEY_PATH; ssh -o StrictHostKeyChecking=no -o ForwardAgent=yes -o SendEnv=OMS_PORTAL_API_KEY root@%s", bs.Env.Jumpbox.GetExternalIP()) } + return fmt.Errorf("failed to bootstrap GCP: %w", err) } @@ -221,11 +237,14 @@ func (c *BootstrapGcpCmd) BootstrapGcp() error { packageName := "-installer" installCmd := "oms install codesphere -c /etc/codesphere/config.yaml -k /etc/codesphere/secrets/age_key.txt --vault /etc/codesphere/secrets/prod.vault.yaml" + if gcp.RegistryType(bs.Env.RegistryType) == gcp.RegistryTypeGitHub { log.Printf("You set a GitHub PAT for direct image access. Make sure to use a lite package, as VM root disk sizes are reduced.") + installCmd += " -s load-container-images" packageName += "-lite" } + log.Printf("example install command (run from jumpbox):\n%s -p %s.tar.gz", installCmd, packageName) return nil diff --git a/cli/cmd/bootstrap_gcp_cleanup_test.go b/cli/cmd/bootstrap_gcp_cleanup_test.go index 3337fd4ca..dc4873ef9 100644 --- a/cli/cmd/bootstrap_gcp_cleanup_test.go +++ b/cli/cmd/bootstrap_gcp_cleanup_test.go @@ -73,6 +73,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { Expect(err).NotTo(HaveOccurred()) var decoded gcp.CodesphereEnvironment + err = json.Unmarshal(data, &decoded) Expect(err).NotTo(HaveOccurred()) @@ -93,6 +94,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { Expect(err).NotTo(HaveOccurred()) var decoded gcp.CodesphereEnvironment + err = json.Unmarshal(data, &decoded) Expect(err).NotTo(HaveOccurred()) @@ -240,6 +242,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { Context("when project ID is provided via flag", func() { It("should use the provided project ID", func() { cleanupCmd.Opts.ProjectID = "flag-project" + mockFileIO.EXPECT().Exists("/tmp/test-infra.json").Return(false) mockGCPClient.EXPECT().IsOMSManagedProject("flag-project").Return(false, nil) @@ -252,6 +255,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { Context("when OMS management check fails", func() { It("should return the verification error", func() { cleanupCmd.Opts.ProjectID = "test-project" + mockFileIO.EXPECT().Exists("/tmp/test-infra.json").Return(false) mockGCPClient.EXPECT().IsOMSManagedProject("test-project").Return(false, errors.New("API error")) @@ -265,6 +269,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { It("should skip OMS management check and proceed to confirmation", func() { cleanupCmd.Opts.ProjectID = "test-project" cleanupCmd.Opts.Force = true + mockFileIO.EXPECT().Exists("/tmp/test-infra.json").Return(false) mockGCPClient.EXPECT().DeleteProject("test-project").Return(nil) @@ -277,6 +282,7 @@ var _ = Describe("BootstrapGcpCleanupCmd", func() { It("should abort the cleanup", func() { cleanupCmd.Opts.ProjectID = "test-project" deps.ConfirmReader = bytes.NewBufferString("wrong-input\n") + mockFileIO.EXPECT().Exists("/tmp/test-infra.json").Return(false) mockGCPClient.EXPECT().IsOMSManagedProject("test-project").Return(true, nil) diff --git a/cli/cmd/bootstrap_gcp_postconfig.go b/cli/cmd/bootstrap_gcp_postconfig.go index 7f8941292..8df73d2ef 100644 --- a/cli/cmd/bootstrap_gcp_postconfig.go +++ b/cli/cmd/bootstrap_gcp_postconfig.go @@ -35,16 +35,20 @@ func (c *BootstrapGcpPostconfigCmd) RunE(_ *cobra.Command, args []string) error if err != nil { return fmt.Errorf("failed to initialize config manager: %w", err) } + fw := intutil.NewFilesystemWriter() infraFilePath := gcp.GetInfraFilePath() + codesphereEnv, exists, err := gcp.LoadInfraFile(fw, infraFilePath) if err != nil { return fmt.Errorf("failed to load gcp infra file: %w", err) } + if !exists { return fmt.Errorf("gcp infra file not found at %s", infraFilePath) } + c.CodesphereEnv = codesphereEnv err = icg.LoadInstallConfigFromFile(c.Opts.InstallConfigPath) diff --git a/cli/cmd/bootstrap_gcp_restart_vms.go b/cli/cmd/bootstrap_gcp_restart_vms.go index 1632d034b..d47e19a51 100644 --- a/cli/cmd/bootstrap_gcp_restart_vms.go +++ b/cli/cmd/bootstrap_gcp_restart_vms.go @@ -44,6 +44,7 @@ func (c *BootstrapGcpRestartVMsCmd) resolveEnvironment(fw intutil.FileIO) (*gcp. } infraFilePath := gcp.GetInfraFilePath() + infraEnv, exists, err := gcp.LoadInfraFile(fw, infraFilePath) if err != nil { if projectID == "" { @@ -97,15 +98,19 @@ func (c *BootstrapGcpRestartVMsCmd) RunE(_ *cobra.Command, _ []string) error { if c.Opts.Name != "" { log.Printf("Restarting VM %s in project %s (zone %s)...", c.Opts.Name, projectID, zone) + if err := bs.RestartVM(c.Opts.Name); err != nil { return fmt.Errorf("failed to restart VM: %w", err) } + log.Printf("VM %s restarted successfully.", c.Opts.Name) } else { log.Printf("Restarting all VMs in project %s (zone %s)...", projectID, zone) + if err := bs.RestartVMs(); err != nil { return fmt.Errorf("failed to restart VMs: %w", err) } + log.Printf("All VMs restarted successfully.") } diff --git a/cli/cmd/bootstrap_gcp_restart_vms_test.go b/cli/cmd/bootstrap_gcp_restart_vms_test.go index 7a9be24d2..3b4a93afd 100644 --- a/cli/cmd/bootstrap_gcp_restart_vms_test.go +++ b/cli/cmd/bootstrap_gcp_restart_vms_test.go @@ -28,6 +28,7 @@ var _ = Describe("BootstrapGcpRestartVMsCmd", func() { c, _, err := parentCmd.Find([]string{"restart-vms"}) Expect(err).NotTo(HaveOccurred()) Expect(c).NotTo(BeNil()) + return c } From ae1ac8bb07fdb23f7bb30ad34b4c648662548b5b Mon Sep 17 00:00:00 2001 From: Jonas Zipprick Date: Fri, 4 Sep 2026 13:07:06 +0200 Subject: [PATCH 100/132] fix(managed-services): Only enable url-shortener on codesphere versions that support it (#782) Otherwise, oms does not support installing any codesphere version below 1.106 at all. Also added a PR Checklist to prevent this kind of incompatibility in the future. --- internal/bootstrap/gcp/install_config.go | 9 ++++++-- internal/util/semver.go | 27 ++++++++++++++++++++++++ internal/util/semver_test.go | 26 +++++++++++++++++++++++ pull_request_template.md | 2 ++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 internal/util/semver.go create mode 100644 internal/util/semver_test.go create mode 100644 pull_request_template.md diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 22212027b..75132dc15 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -491,7 +491,7 @@ func (b *GCPBootstrapper) applyPcAppsDefaults() { func (b *GCPBootstrapper) applyManagedServiceDefaults() { if b.Env.InstallConfig.Codesphere.ManagedServices == nil { - b.Env.InstallConfig.Codesphere.ManagedServices = []files.ManagedServiceConfig{ + ms := []files.ManagedServiceConfig{ {Name: "postgres", Version: "v1"}, {Name: "babelfish", Version: "v1"}, {Name: "s3", Version: "v1"}, @@ -500,8 +500,13 @@ func (b *GCPBootstrapper) applyManagedServiceDefaults() { {Name: "opensearch", Version: "v0"}, {Name: "valkey", Version: "v0"}, {Name: "rabbitmq", Version: "v0"}, - {Name: "url-shortener", Version: "v0"}, } + + if util.InstallVersionAtLeast(b.Env.InstallVersion, "v1.106.0") { + ms = append(ms, files.ManagedServiceConfig{Name: "url-shortener", Version: "v0"}) + } + + b.Env.InstallConfig.Codesphere.ManagedServices = ms } } diff --git a/internal/util/semver.go b/internal/util/semver.go new file mode 100644 index 000000000..2f04ce1ad --- /dev/null +++ b/internal/util/semver.go @@ -0,0 +1,27 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package util + +import ( + "strings" + + "golang.org/x/mod/semver" +) + +// InstallVersionAtLeast returns true if the codesphere installVersion is higher or equal to minimum. +func InstallVersionAtLeast(installVersion, minimum string) bool { + var v string + for _, prefix := range []string{"codesphere-"} { + v = strings.TrimPrefix(installVersion, prefix) + } + + parsedVersion := semver.Canonical(v) + if parsedVersion == "" { + return false + } + + compare := semver.Compare(parsedVersion, minimum) >= 0 + + return compare +} diff --git a/internal/util/semver_test.go b/internal/util/semver_test.go new file mode 100644 index 000000000..dbf64880d --- /dev/null +++ b/internal/util/semver_test.go @@ -0,0 +1,26 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package util + +import "testing" + +func TestInstallVersionAtLeast(t *testing.T) { + t.Run("rejects lower versions", func(t *testing.T) { + if InstallVersionAtLeast("codesphere-v1.105.0", "v1.106.0") { + t.Fatal("expected codesphere-v1.105.0 to be below v1.106.0") + } + }) + + t.Run("accepts exact version matches", func(t *testing.T) { + if !InstallVersionAtLeast("codesphere-v1.106.0", "v1.106.0") { + t.Fatal("expected codesphere-v1.106.0 to satisfy v1.106.0") + } + }) + + t.Run("rejects invalid versions", func(t *testing.T) { + if InstallVersionAtLeast("not-a-version", "v1.106.0") { + t.Fatal("expected invalid versions to be rejected") + } + }) +} diff --git a/pull_request_template.md b/pull_request_template.md new file mode 100644 index 000000000..3b5c63cdb --- /dev/null +++ b/pull_request_template.md @@ -0,0 +1,2 @@ +### Important Context to the PR +- [ ] This change introduces a **breaking change** and for that I cleared it with relevant stakeholders upfront and added an **explanation** to the PR description. Breaking can e.g. mean that this new installer can not install older versions of Codesphere From c712e2afc362e71f291fd5c99efb70f4e31a93df Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:02:56 +0000 Subject: [PATCH 101/132] update(deps): update github.com/rook/rook/pkg/apis digest to 39803e2 (#785) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `d364b1e` → `39803e2` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index ae023753b..695ad7ef1 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260903170734-d364b1e8ad7f +Version: v0.0.0-20260908095802-39803e285e9e License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/d364b1e8ad7f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/39803e285e9e/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 968d9edba..d4a621484 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f + github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 682593807..4d9808b3b 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f h1:3OL9xwVtRSqNzJq6kmGEHBwd8/aN1ReyvRuraymIpv0= -github.com/rook/rook/pkg/apis v0.0.0-20260903170734-d364b1e8ad7f/go.mod h1:DFxhI2q5moWDKjNYYLyZDeZeAU0jDpjhNA10/1howrE= +github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e h1:A+7QvVtugMB0WrrBGK+XnFYEkLeu0j2zuihmavMyoQ8= +github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e/go.mod h1:rTlfUzKdvbpExxQ2sx0rX4ojjCpv5oESJi6FCTFm4FI= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index ae023753b..695ad7ef1 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260903170734-d364b1e8ad7f +Version: v0.0.0-20260908095802-39803e285e9e License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/d364b1e8ad7f/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/39803e285e9e/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From b7d25c1831edaf79a1befb29f5d670729ca61b58 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 14:04:51 +0000 Subject: [PATCH 102/132] update(deps): update module golang.org/x/mod to v0.41.0 (#786) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/mod](https://pkg.go.dev/golang.org/x/mod) | [`v0.40.0` → `v0.41.0`](https://cs.opensource.google/go/x/mod/+/refs/tags/v0.40.0...refs/tags/v0.41.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fmod/v0.41.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fmod/v0.40.0/v0.41.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 695ad7ef1..66fb48b48 100644 --- a/NOTICE +++ b/NOTICE @@ -1457,9 +1457,9 @@ License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver -Version: v0.40.0 +Version: v0.41.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE +License URL: https://cs.opensource.google/go/x/mod/+/v0.41.0:LICENSE ---------- Module: golang.org/x/net diff --git a/go.mod b/go.mod index d4a621484..08affb37c 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,7 @@ require ( github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 golang.org/x/crypto v0.56.0 - golang.org/x/mod v0.40.0 + golang.org/x/mod v0.41.0 golang.org/x/oauth2 v0.36.0 golang.org/x/term v0.45.0 google.golang.org/api v0.297.0 diff --git a/go.sum b/go.sum index 4d9808b3b..41bf0508a 100644 --- a/go.sum +++ b/go.sum @@ -5498,8 +5498,8 @@ golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= -golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= -golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 695ad7ef1..66fb48b48 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1457,9 +1457,9 @@ License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE ---------- Module: golang.org/x/mod/semver -Version: v0.40.0 +Version: v0.41.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/mod/+/v0.40.0:LICENSE +License URL: https://cs.opensource.google/go/x/mod/+/v0.41.0:LICENSE ---------- Module: golang.org/x/net From 371aa311f2af26ef9167e31086301c5c53612603 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 15:07:11 +0000 Subject: [PATCH 103/132] update(deps): update module golang.org/x/oauth2 to v0.37.0 (#787) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/oauth2](https://pkg.go.dev/golang.org/x/oauth2) | [`v0.36.0` → `v0.37.0`](https://cs.opensource.google/go/x/oauth2/+/refs/tags/v0.36.0...refs/tags/v0.37.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2foauth2/v0.37.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2foauth2/v0.36.0/v0.37.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 66fb48b48..30fcc054a 100644 --- a/NOTICE +++ b/NOTICE @@ -1469,9 +1469,9 @@ License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 -Version: v0.36.0 +Version: v0.37.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE +License URL: https://cs.opensource.google/go/x/oauth2/+/v0.37.0:LICENSE ---------- Module: golang.org/x/sync diff --git a/go.mod b/go.mod index 08affb37c..927458acd 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( go.yaml.in/yaml/v3 v3.0.5 golang.org/x/crypto v0.56.0 golang.org/x/mod v0.41.0 - golang.org/x/oauth2 v0.36.0 + golang.org/x/oauth2 v0.37.0 golang.org/x/term v0.45.0 google.golang.org/api v0.297.0 google.golang.org/grpc v1.83.2 diff --git a/go.sum b/go.sum index 41bf0508a..006bc7f54 100644 --- a/go.sum +++ b/go.sum @@ -5675,8 +5675,8 @@ golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= -golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/oauth2 v0.37.0 h1:JUlcxA8oAtauLfiH8FX2/FkAWHAdi0QtGCGc+hofE98= +golang.org/x/oauth2 v0.37.0/go.mod h1:IxwZNxUULJmpBFf9K/9NTMSIfZZuvuTy1gGxhigP/58= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 66fb48b48..30fcc054a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1469,9 +1469,9 @@ License URL: https://cs.opensource.google/go/x/net/+/v0.58.0:LICENSE ---------- Module: golang.org/x/oauth2 -Version: v0.36.0 +Version: v0.37.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/oauth2/+/v0.36.0:LICENSE +License URL: https://cs.opensource.google/go/x/oauth2/+/v0.37.0:LICENSE ---------- Module: golang.org/x/sync From eb4e7f1bb1a3beb487dccca67b492d8ea2acf8fe Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 17:02:21 +0000 Subject: [PATCH 104/132] update(deps): update github.com/rook/rook/pkg/apis digest to 0ea78f9 (#788) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `39803e2` → `0ea78f9` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/NOTICE b/NOTICE index 30fcc054a..c97fb52e2 100644 --- a/NOTICE +++ b/NOTICE @@ -929,9 +929,9 @@ License URL: https://github.com/kr/fs/blob/v0.1.0/LICENSE ---------- Module: github.com/kube-object-storage/lib-bucket-provisioner/pkg/apis/objectbucket.io -Version: v0.0.0-20221122204822-d1a8c34382f1 +Version: v0.0.0-20260420161730-5164e3746489 License: Apache-2.0 -License URL: https://github.com/kube-object-storage/lib-bucket-provisioner/blob/d1a8c34382f1/LICENSE +License URL: https://github.com/kube-object-storage/lib-bucket-provisioner/blob/5164e3746489/LICENSE ---------- Module: github.com/kubernetes-csi/external-snapshotter/client/v8/apis/volumesnapshot/v1 @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908095802-39803e285e9e +Version: v0.0.0-20260908154113-0ea78f9c1249 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/39803e285e9e/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0ea78f9c1249/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 927458acd..40b57be23 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e + github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 @@ -433,7 +433,7 @@ require ( github.com/knadh/koanf/providers/structs v1.0.0 // indirect github.com/knadh/koanf/v2 v2.3.5 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 // indirect + github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20260420161730-5164e3746489 // indirect github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 // indirect github.com/kulti/thelper v0.7.1 // indirect github.com/kunwardeep/paralleltest v1.0.15 // indirect diff --git a/go.sum b/go.sum index 006bc7f54..3dc4193aa 100644 --- a/go.sum +++ b/go.sum @@ -4244,8 +4244,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ktrysmt/go-bitbucket v0.10.0 h1:miXSfqFb+j0pPBB9h8kw9f/oeq045WOPI4hplr996+k= github.com/ktrysmt/go-bitbucket v0.10.0/go.mod h1:IUB8I+gC3UO00NjNTMS7STjsZYq+EAhPuHgynzRWxqY= -github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 h1:dQEHhTfi+bSIOSViQrKY9PqJvZenD6tFz+3lPzux58o= -github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1/go.mod h1:my+EVjOJLeQ9lUR9uVkxRvNNkhO2saSGIgzV8GZT9HY= +github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20260420161730-5164e3746489 h1:Tnm8Vr9GmtuWNmhp+HZI1I8pMXuhyVomTlvgFT2TQpE= +github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20260420161730-5164e3746489/go.mod h1:my+EVjOJLeQ9lUR9uVkxRvNNkhO2saSGIgzV8GZT9HY= github.com/kubernetes-csi/external-snapshotter/client/v4 v4.0.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys= github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0 h1:FtGewu2k6HWw6evLGXY8JqUZ9eHpti1kd3e4amj+ilA= github.com/kubernetes-csi/external-snapshotter/client/v8 v8.6.0/go.mod h1:Vxl89NySJ45J+ah3NTMan/KJXW+NpcGHE2Tw0GSw53k= @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e h1:A+7QvVtugMB0WrrBGK+XnFYEkLeu0j2zuihmavMyoQ8= -github.com/rook/rook/pkg/apis v0.0.0-20260908095802-39803e285e9e/go.mod h1:rTlfUzKdvbpExxQ2sx0rX4ojjCpv5oESJi6FCTFm4FI= +github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249 h1:BfVIwlIevmZb9A7VsaDvPWLwxJjvp0EOBjsGG6HNFo0= +github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 30fcc054a..c97fb52e2 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -929,9 +929,9 @@ License URL: https://github.com/kr/fs/blob/v0.1.0/LICENSE ---------- Module: github.com/kube-object-storage/lib-bucket-provisioner/pkg/apis/objectbucket.io -Version: v0.0.0-20221122204822-d1a8c34382f1 +Version: v0.0.0-20260420161730-5164e3746489 License: Apache-2.0 -License URL: https://github.com/kube-object-storage/lib-bucket-provisioner/blob/d1a8c34382f1/LICENSE +License URL: https://github.com/kube-object-storage/lib-bucket-provisioner/blob/5164e3746489/LICENSE ---------- Module: github.com/kubernetes-csi/external-snapshotter/client/v8/apis/volumesnapshot/v1 @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908095802-39803e285e9e +Version: v0.0.0-20260908154113-0ea78f9c1249 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/39803e285e9e/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0ea78f9c1249/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From bca2decf5cfb35fb3e905d412402db111ed64031 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:06:47 +0000 Subject: [PATCH 105/132] update(deps): update module golang.org/x/crypto to v0.57.0 (#790) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto) | [`v0.56.0` → `v0.57.0`](https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.56.0...refs/tags/v0.57.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fcrypto/v0.57.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fcrypto/v0.56.0/v0.57.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 20 ++++++++++---------- go.mod | 10 +++++----- go.sum | 17 ++++++++++------- internal/tmpl/NOTICE | 20 ++++++++++---------- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/NOTICE b/NOTICE index c97fb52e2..76a090526 100644 --- a/NOTICE +++ b/NOTICE @@ -1451,9 +1451,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.56.0 +Version: v0.57.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.57.0:LICENSE ---------- Module: golang.org/x/mod/semver @@ -1475,27 +1475,27 @@ License URL: https://cs.opensource.google/go/x/oauth2/+/v0.37.0:LICENSE ---------- Module: golang.org/x/sync -Version: v0.22.0 +Version: v0.23.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE +License URL: https://cs.opensource.google/go/x/sync/+/v0.23.0:LICENSE ---------- Module: golang.org/x/sys -Version: v0.47.0 +Version: v0.48.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE +License URL: https://cs.opensource.google/go/x/sys/+/v0.48.0:LICENSE ---------- Module: golang.org/x/term -Version: v0.45.0 +Version: v0.46.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE +License URL: https://cs.opensource.google/go/x/term/+/v0.46.0:LICENSE ---------- Module: golang.org/x/text -Version: v0.41.0 +Version: v0.42.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE +License URL: https://cs.opensource.google/go/x/text/+/v0.42.0:LICENSE ---------- Module: golang.org/x/time/rate diff --git a/go.mod b/go.mod index 40b57be23..1680a2065 100644 --- a/go.mod +++ b/go.mod @@ -50,10 +50,10 @@ require ( github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 - golang.org/x/crypto v0.56.0 + golang.org/x/crypto v0.57.0 golang.org/x/mod v0.41.0 golang.org/x/oauth2 v0.37.0 - golang.org/x/term v0.45.0 + golang.org/x/term v0.46.0 google.golang.org/api v0.297.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 @@ -634,9 +634,9 @@ require ( golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect golang.org/x/exp/typeparams v0.0.0-20260811152304-ee035b5b010f // indirect golang.org/x/net v0.58.0 // indirect - golang.org/x/sync v0.22.0 // indirect - golang.org/x/sys v0.47.0 // indirect - golang.org/x/text v0.41.0 // indirect + golang.org/x/sync v0.23.0 // indirect + golang.org/x/sys v0.48.0 // indirect + golang.org/x/text v0.42.0 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.49.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect diff --git a/go.sum b/go.sum index 3dc4193aa..9f5154779 100644 --- a/go.sum +++ b/go.sum @@ -5369,8 +5369,8 @@ golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+ golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= -golang.org/x/crypto v0.56.0 h1:GUh5Ii4J5jtcseSMiRqr1jXCNHoxjeV9Fmekc2oLy6Y= -golang.org/x/crypto v0.56.0/go.mod h1:OMW5y6CY9l38uPLmxU6l6pwcXp1obtLo3e6gT7gQR2I= +golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= +golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -5713,8 +5713,9 @@ golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -5865,8 +5866,9 @@ golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= @@ -5927,8 +5929,9 @@ golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= -golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= +golang.org/x/term v0.46.0 h1:3+OXuTbaKDgwk8jTi3aSLHRlmWqHEUDUtxnbFigO4YE= +golang.org/x/term v0.46.0/go.mod h1:+K02xbkittuwc0Am4abfA3Fc+XRGXkvBXNO88NCXPoc= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -5975,8 +5978,8 @@ golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= -golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= -golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index c97fb52e2..76a090526 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1451,9 +1451,9 @@ License URL: https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE ---------- Module: golang.org/x/crypto -Version: v0.56.0 +Version: v0.57.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/crypto/+/v0.56.0:LICENSE +License URL: https://cs.opensource.google/go/x/crypto/+/v0.57.0:LICENSE ---------- Module: golang.org/x/mod/semver @@ -1475,27 +1475,27 @@ License URL: https://cs.opensource.google/go/x/oauth2/+/v0.37.0:LICENSE ---------- Module: golang.org/x/sync -Version: v0.22.0 +Version: v0.23.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sync/+/v0.22.0:LICENSE +License URL: https://cs.opensource.google/go/x/sync/+/v0.23.0:LICENSE ---------- Module: golang.org/x/sys -Version: v0.47.0 +Version: v0.48.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/sys/+/v0.47.0:LICENSE +License URL: https://cs.opensource.google/go/x/sys/+/v0.48.0:LICENSE ---------- Module: golang.org/x/term -Version: v0.45.0 +Version: v0.46.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/term/+/v0.45.0:LICENSE +License URL: https://cs.opensource.google/go/x/term/+/v0.46.0:LICENSE ---------- Module: golang.org/x/text -Version: v0.41.0 +Version: v0.42.0 License: BSD-3-Clause -License URL: https://cs.opensource.google/go/x/text/+/v0.41.0:LICENSE +License URL: https://cs.opensource.google/go/x/text/+/v0.42.0:LICENSE ---------- Module: golang.org/x/time/rate From 30d94dfd05e9d62b7bcac277529a4213fd9a5f29 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 21:03:03 +0000 Subject: [PATCH 106/132] update(deps): update github.com/rook/rook/pkg/apis digest to bd54fc7 (#792) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `0ea78f9` → `bd54fc7` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 76a090526..0d40b7140 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908154113-0ea78f9c1249 +Version: v0.0.0-20260908181407-bd54fc7aee27 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0ea78f9c1249/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/bd54fc7aee27/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 1680a2065..b2314d329 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.1 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249 + github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 9f5154779..117348882 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249 h1:BfVIwlIevmZb9A7VsaDvPWLwxJjvp0EOBjsGG6HNFo0= -github.com/rook/rook/pkg/apis v0.0.0-20260908154113-0ea78f9c1249/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27 h1:RbjVhtRoqUWZwWdiAba0Pay4oqj0oY2XstHVLBvszZM= +github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 76a090526..0d40b7140 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908154113-0ea78f9c1249 +Version: v0.0.0-20260908181407-bd54fc7aee27 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0ea78f9c1249/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/bd54fc7aee27/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From d1e2cc9e6da01dd30ee7d22e344243fd92355d06 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:10:42 +0000 Subject: [PATCH 107/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.37.0 (#793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.36.0` → `v1.37.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.37.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.36.0/v1.37.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.37.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.37.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.36.0...v1.37.0) #### Changelog - [`8df61ea`](https://redirect.github.com/codesphere-cloud/cs-go/commit/8df61ea1dc56d467d8bf279083d529b48b4e4d23) update(deps): update module google.golang.org/grpc to v1.83.2 \[security] ([#​323](https://redirect.github.com/codesphere-cloud/cs-go/issues/323)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 0d40b7140..3ceb53814 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.36.0 +Version: v1.37.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.36.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.37.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index b2314d329..e1fb812b1 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.36.0 + github.com/codesphere-cloud/cs-go v1.37.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 117348882..5a2875e44 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.36.0 h1:r+ap6o4+KlJ8ns7xsQiJ94+Z622hROFq/bVGzwnfiC8= -github.com/codesphere-cloud/cs-go v1.36.0/go.mod h1:EutNQFD4M44L/kvK5JkexjoOfPY7v3843W9IAfm5iZU= +github.com/codesphere-cloud/cs-go v1.37.0 h1:2/DVnpjZ3oD1iSRfEGvrCq6PCxjl10ypBYoYvBqK04A= +github.com/codesphere-cloud/cs-go v1.37.0/go.mod h1:6XTEJngtGhw4Slg8HhWNP7nxhPuKdst19bk2NBtswEE= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 0d40b7140..3ceb53814 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.36.0 +Version: v1.37.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.36.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.37.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 50a825e2f75de2a5aeece2f4d11f8ba279d43219 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:54:45 +0000 Subject: [PATCH 108/132] update(deps): update module github.com/onsi/ginkgo/v2 to v2.32.2 (#794) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/onsi/ginkgo/v2](https://redirect.github.com/onsi/ginkgo) | `v2.32.1` → `v2.32.2` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fonsi%2fginkgo%2fv2/v2.32.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fonsi%2fginkgo%2fv2/v2.32.1/v2.32.2?slim=true) | --- ### Release Notes
onsi/ginkgo (github.com/onsi/ginkgo/v2) ### [`v2.32.2`](https://redirect.github.com/onsi/ginkgo/releases/tag/v2.32.2) [Compare Source](https://redirect.github.com/onsi/ginkgo/compare/v2.32.1...v2.32.2) #### 2.32.2 ##### Fixes - fix bug where ginkgo -race -p was taking extra long to exit \[[`c6792b0`](https://redirect.github.com/onsi/ginkgo/commit/c6792b0)]
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e1fb812b1..461e7a467 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/jedib0t/go-pretty/v6 v6.8.3 github.com/lib/pq v1.12.3 github.com/lithammer/shortuuid v3.0.0+incompatible - github.com/onsi/ginkgo/v2 v2.32.1 + github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27 diff --git a/go.sum b/go.sum index 5a2875e44..e07ad77a1 100644 --- a/go.sum +++ b/go.sum @@ -4485,8 +4485,8 @@ github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkA github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= -github.com/onsi/ginkgo/v2 v2.32.1 h1:6tlvcDm/3sE8lGJbZ4+d4mO3RLy24/tQWOFzVSQNIfw= -github.com/onsi/ginkgo/v2 v2.32.1/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/ginkgo/v2 v2.32.2 h1:2o6vyFvR6snrJWgRVztC+OwuqqPEMI1UzYl2s2iU7Cg= +github.com/onsi/ginkgo/v2 v2.32.2/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= From 22aa5347709189919f98e4ae803f2905e3482940 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 05:20:21 +0000 Subject: [PATCH 109/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.38.0 (#795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.37.0` → `v1.38.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.38.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.37.0/v1.38.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.38.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.38.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.37.0...v1.38.0) #### Changelog - [`b453e71`](https://redirect.github.com/codesphere-cloud/cs-go/commit/b453e71ddd5465abddafeac48d3431299b8dfdfc) update(deps): update module github.com/onsi/ginkgo/v2 to v2.32.2 ([#​324](https://redirect.github.com/codesphere-cloud/cs-go/issues/324)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 3ceb53814..b6bb1c94d 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.37.0 +Version: v1.38.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.37.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.38.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 461e7a467..2ca695e52 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.2 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.37.0 + github.com/codesphere-cloud/cs-go v1.38.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index e07ad77a1..85b1eb957 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.37.0 h1:2/DVnpjZ3oD1iSRfEGvrCq6PCxjl10ypBYoYvBqK04A= -github.com/codesphere-cloud/cs-go v1.37.0/go.mod h1:6XTEJngtGhw4Slg8HhWNP7nxhPuKdst19bk2NBtswEE= +github.com/codesphere-cloud/cs-go v1.38.0 h1:Gz4ZvrFEFaq1pgDtKlurrwS7sT+6YOvW6j/Qdb7WNkg= +github.com/codesphere-cloud/cs-go v1.38.0/go.mod h1:dMnWh66Zbqe35PHFNJpK4x39X9+/MggHvf3tv9nAZ74= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3ceb53814..b6bb1c94d 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.37.0 +Version: v1.38.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.37.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.38.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From e011db7090c5116ce1b96da590d1d8d75d0b29a0 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 22:03:22 +0000 Subject: [PATCH 110/132] update(deps): update github.com/rook/rook/pkg/apis digest to 2785aa1 (#796) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `bd54fc7` → `2785aa1` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index b6bb1c94d..1f6572599 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908181407-bd54fc7aee27 +Version: v0.0.0-20260909201307-2785aa192641 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/bd54fc7aee27/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/2785aa192641/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 2ca695e52..75c85d923 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27 + github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 85b1eb957..93f00133d 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27 h1:RbjVhtRoqUWZwWdiAba0Pay4oqj0oY2XstHVLBvszZM= -github.com/rook/rook/pkg/apis v0.0.0-20260908181407-bd54fc7aee27/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641 h1:Kx/n0olWFNh1RJNHlRrtBp19tkkE3JxPADiYsPgK72M= +github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index b6bb1c94d..1f6572599 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260908181407-bd54fc7aee27 +Version: v0.0.0-20260909201307-2785aa192641 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/bd54fc7aee27/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/2785aa192641/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From e0757c601bad4300db1ebc73e73fea0640d175f4 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 23:40:58 +0000 Subject: [PATCH 111/132] update(deps): update module helm.sh/helm/v4 to v4.3.0 (#797) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [helm.sh/helm/v4](https://redirect.github.com/helm/helm) | `v4.2.4` → `v4.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/helm.sh%2fhelm%2fv4/v4.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/helm.sh%2fhelm%2fv4/v4.2.4/v4.3.0?slim=true) | --- ### Release Notes
helm/helm (helm.sh/helm/v4) ### [`v4.3.0`](https://redirect.github.com/helm/helm/compare/v4.2.4...v4.3.0) [Compare Source](https://redirect.github.com/helm/helm/compare/v4.2.4...v4.3.0)
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 16 ++++++++-------- go.mod | 16 ++++++++-------- go.sum | 16 ++++++++-------- internal/tmpl/NOTICE | 16 ++++++++-------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/NOTICE b/NOTICE index 1f6572599..879da3383 100644 --- a/NOTICE +++ b/NOTICE @@ -329,15 +329,15 @@ License URL: https://github.com/creativeprojects/go-selfupdate/blob/v1.6.0/LICEN ---------- Module: github.com/cyphar/filepath-securejoin -Version: v0.6.1 +Version: v0.7.0 License: MPL-2.0 -License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.6.1/COPYING.md +License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.7.0/COPYING.md ---------- Module: github.com/cyphar/filepath-securejoin -Version: v0.6.1 +Version: v0.7.0 License: BSD-3-Clause -License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.6.1/COPYING.md +License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.7.0/COPYING.md ---------- Module: github.com/davecgh/go-spew/spew @@ -431,9 +431,9 @@ License URL: https://github.com/felixge/httpsnoop/blob/v1.1.0/LICENSE.txt ---------- Module: github.com/fluxcd/cli-utils/pkg -Version: v1.2.1 +Version: v1.2.2 License: Apache-2.0 -License URL: https://github.com/fluxcd/cli-utils/blob/v1.2.1/LICENSE +License URL: https://github.com/fluxcd/cli-utils/blob/v1.2.2/LICENSE ---------- Module: github.com/fsnotify/fsnotify @@ -1589,9 +1589,9 @@ License URL: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE ---------- Module: helm.sh/helm/v4 -Version: v4.2.4 +Version: v4.3.0 License: Apache-2.0 -License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE +License URL: https://github.com/helm/helm/blob/v4.3.0/LICENSE ---------- Module: k8s.io/api diff --git a/go.mod b/go.mod index 75c85d923..b77c71cf4 100644 --- a/go.mod +++ b/go.mod @@ -58,7 +58,7 @@ require ( google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v4 v4.2.4 + helm.sh/helm/v4 v4.3.0 k8s.io/api v0.37.0 k8s.io/apimachinery v0.37.0 k8s.io/client-go v12.0.0+incompatible @@ -84,7 +84,7 @@ require ( code.gitea.io/sdk/gitea v0.25.1 // indirect codeberg.org/chavacava/garif v0.2.1 // indirect codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect - cyphar.com/go-pathrs v0.2.2 // indirect + cyphar.com/go-pathrs v0.2.5 // indirect dario.cat/mergo v1.0.2 // indirect dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect @@ -232,7 +232,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect - github.com/cyphar/filepath-securejoin v0.6.1 // indirect + github.com/cyphar/filepath-securejoin v0.7.0 // indirect github.com/daixiang0/gci v0.14.0 // indirect github.com/dave/dst v0.27.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -267,7 +267,7 @@ require ( github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.1.0 // indirect github.com/firefart/nonamedreturns v1.0.8 // indirect - github.com/fluxcd/cli-utils v1.2.1 // indirect + github.com/fluxcd/cli-utils v1.2.2 // indirect github.com/fsnotify/fsnotify v1.10.1 // indirect github.com/fxamacker/cbor/v2 v2.9.2 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect @@ -652,16 +652,16 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.8.1 // indirect - k8s.io/apiextensions-apiserver v0.36.2 // indirect - k8s.io/apiserver v0.36.4 // indirect + k8s.io/apiextensions-apiserver v0.37.0 // indirect + k8s.io/apiserver v0.37.0 // indirect k8s.io/cli-runtime v0.37.0 // indirect - k8s.io/component-base v0.36.4 // indirect + k8s.io/component-base v0.37.0 // indirect k8s.io/component-helpers v0.36.4 // indirect k8s.io/controller-manager v0.36.1 // indirect k8s.io/klog/v2 v2.140.0 // indirect k8s.io/kube-aggregator v0.36.1 // indirect k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad // indirect - k8s.io/kubectl v0.36.1 // indirect + k8s.io/kubectl v0.37.0 // indirect k8s.io/kubernetes v1.36.1 // indirect k8s.io/streaming v0.36.4 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index 93f00133d..c004155cf 100644 --- a/go.sum +++ b/go.sum @@ -2653,8 +2653,8 @@ codeberg.org/go-pdf/fpdf v0.10.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoP codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI= codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= contrib.go.opencensus.io/exporter/stackdriver v0.13.15-0.20230702191903-2de6d2748484/go.mod h1:uxw+4/0SiKbbVSD/F2tk5pJTdVcfIBBcsQ8gwcu4X+E= -cyphar.com/go-pathrs v0.2.2 h1:y9w7hxbkr3zEL78Fjzeg4HEhs2xNy+fbwHiHGJJY2Xo= -cyphar.com/go-pathrs v0.2.2/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= +cyphar.com/go-pathrs v0.2.5 h1:SnX9FBvnoyn3lUs1dkMgZ52bAETpirNu3FTRh5HlRik= +cyphar.com/go-pathrs v0.2.5/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= @@ -3259,8 +3259,8 @@ github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+f github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= -github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= +github.com/cyphar/filepath-securejoin v0.7.0 h1:s0Y3ITPy6sQn5xt54DuYvTF8hu134ooYLUb58DX/HjE= +github.com/cyphar/filepath-securejoin v0.7.0/go.mod h1:ymLGms/u3BYaviIiuKFnUx8EkQEZeK6cInNoAPJA3o4= github.com/daixiang0/gci v0.14.0 h1:h6AcLqmjIOBgojhtzY2CvBnA6RawPTkBHgtMvYD5YZ8= github.com/daixiang0/gci v0.14.0/go.mod h1:w9E+SWQ4aPQ+xYPUdqitGDoXpT4mayqOfk7Szz2U6wQ= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= @@ -3417,8 +3417,8 @@ github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeO github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= github.com/firefart/nonamedreturns v1.0.8 h1:iB32Dl17zJl1zlVEj/WlUWgx0HiRyQ85OUw1WHa4/II= github.com/firefart/nonamedreturns v1.0.8/go.mod h1:vxFNvm5AfP/8rgAKFzYmnqx0yp1HjrYsErZ9pHPTznA= -github.com/fluxcd/cli-utils v1.2.1 h1:ug9CicKW7H9QXnvNDapTSKuryZvWcu4Nw7pRvQa6jDY= -github.com/fluxcd/cli-utils v1.2.1/go.mod h1:cky6M6eHvTQkoPtsuFYLIgAMYdpTCSLoor4IA6vueSw= +github.com/fluxcd/cli-utils v1.2.2 h1:adDOmwE+LSwTzmYUaoEFPblruOuaQEKAg1ZNTmPJObE= +github.com/fluxcd/cli-utils v1.2.2/go.mod h1:FsghNGY+3Sr70c0FOB7I5So0kzoYVdvQ8GTid3XXVWM= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0= @@ -6876,8 +6876,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -helm.sh/helm/v4 v4.2.4 h1:qIysMI0JpTC4WXf3AQ99V6rZGT0+gO0Ww8IOnnUnaZk= -helm.sh/helm/v4 v4.2.4/go.mod h1:ZP8nFdYe7jG1PTQelKzQXQ7m09/ruhMTrpDAf+OL5ms= +helm.sh/helm/v4 v4.3.0 h1:wLRTNXzy96ro7waurWMsymlUPaCQOj5nokpJZJNen/w= +helm.sh/helm/v4 v4.3.0/go.mod h1:p6SMo6BMyg+4H52fJXvRNg1To0a0KGfiPxjVEcHHSk0= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 1f6572599..879da3383 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -329,15 +329,15 @@ License URL: https://github.com/creativeprojects/go-selfupdate/blob/v1.6.0/LICEN ---------- Module: github.com/cyphar/filepath-securejoin -Version: v0.6.1 +Version: v0.7.0 License: MPL-2.0 -License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.6.1/COPYING.md +License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.7.0/COPYING.md ---------- Module: github.com/cyphar/filepath-securejoin -Version: v0.6.1 +Version: v0.7.0 License: BSD-3-Clause -License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.6.1/COPYING.md +License URL: https://github.com/cyphar/filepath-securejoin/blob/v0.7.0/COPYING.md ---------- Module: github.com/davecgh/go-spew/spew @@ -431,9 +431,9 @@ License URL: https://github.com/felixge/httpsnoop/blob/v1.1.0/LICENSE.txt ---------- Module: github.com/fluxcd/cli-utils/pkg -Version: v1.2.1 +Version: v1.2.2 License: Apache-2.0 -License URL: https://github.com/fluxcd/cli-utils/blob/v1.2.1/LICENSE +License URL: https://github.com/fluxcd/cli-utils/blob/v1.2.2/LICENSE ---------- Module: github.com/fsnotify/fsnotify @@ -1589,9 +1589,9 @@ License URL: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE ---------- Module: helm.sh/helm/v4 -Version: v4.2.4 +Version: v4.3.0 License: Apache-2.0 -License URL: https://github.com/helm/helm/blob/v4.2.4/LICENSE +License URL: https://github.com/helm/helm/blob/v4.3.0/LICENSE ---------- Module: k8s.io/api From f4ad29da647a6602b7ffe8db81cd4730c6b01e70 Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Thu, 10 Sep 2026 11:05:12 +0200 Subject: [PATCH 112/132] feat(gcp): configure hosts, gateways and installs per data center (#627) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates the infrastructure steps from the single implicit data center to the layout: root login and host configuration run over every data center's nodes, each data center reserves its own gateway, public gateway and SSH proxy IP under a suffixed name, and each gets its own k0s configuration script patching its own gateway services. `InstallCodesphere` and `RunK0sConfigScript` loop over the data centers in ascending order and log a step per data center. The order matters once there is more than one: the primary's install creates the database, roles and schema the others reuse, and a k0s script can only patch gateway services an install has already created. The install command moves into the exported `InstallCommand`, since the CLI prints it for the operator when the bootstrap does not install itself, and it now names the data center's own config, vault and age key. ## Review notes `EnsureHostsConfigured` also creates `/etc/codesphere/secrets` up front on every node: the installer uploads a data center's age key to that fixed path but only creates its own configured `secrets.baseDir`, so for a data center whose `baseDir` differs the upload target would not exist. Harmless, since nodes belong to exactly one data center. Behaviour for a single data center is unchanged — same VM names, same IP names, same script, same install command. --- Part of the `oms beta bootstrap-gcp --multi-dc` stack (10 PRs). Merge in order; each PR is based on its predecessor. --------- Signed-off-by: Jona Neef Co-authored-by: Claude Opus 5 (1M context) --- internal/bootstrap/gcp/gcp.go | 163 ++++++++++++++++++++++++----- internal/bootstrap/gcp/gcp_test.go | 71 +++++++++++++ internal/bootstrap/gcp/k0s.go | 120 ++++++++++++++++----- 3 files changed, 301 insertions(+), 53 deletions(-) diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index 9db6fedec..f0037ef18 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "log" - "path/filepath" "slices" "strings" "time" @@ -50,6 +49,24 @@ const ( RegistryTypeGitHub RegistryType = "github" ) +// remoteK0sConfigScriptPath is where each data center's k0s configuration script is placed on +// that data center's first control plane node. Data centers have separate nodes, so the path can +// be the same for all of them. +const remoteK0sConfigScriptPath = "/root/configure-k0s.sh" + +// installerNodeSecretsDir is where the Codesphere installer uploads a data center's age key on +// every one of that data center's nodes. The path is fixed even though the installer reads the key +// from the data center's own secrets.baseDir on the jumpbox, and the installer only creates +// baseDir on the node — so for a data center whose baseDir differs, the upload target would not +// exist. Creating it up front is harmless: data centers have separate nodes, so a node only ever +// holds its own data center's key. +const installerNodeSecretsDir = "/etc/codesphere/secrets" + +// vpcSubnetCIDR is the range of the project's single subnet, shared by all data centers. It is +// also each data center's ceph.nodesSubnet; their Ceph clusters stay separate because each has +// its own hosts, monitors and FSID. +const vpcSubnetCIDR = "10.10.0.0/20" + // CheckOMSManagedLabel checks if the given labels map indicates an OMS-managed project. // A project is considered OMS-managed if it has the 'oms-managed' label set to "true". func CheckOMSManagedLabel(labels map[string]string) bool { @@ -123,6 +140,25 @@ func (b *GCPBootstrapper) primaryDC() *datacenter.DataCenter { return b.Env.DataCenters[0] } +// allNodes returns every node of the project: the jumpbox, the shared postgres node and all +// data centers' Ceph and k0s nodes. +func (b *GCPBootstrapper) allNodes() []*node.Node { + nodes := []*node.Node{b.Env.Jumpbox, b.Env.PostgreSQLNode} + return append(nodes, b.clusterNodes()...) +} + +// clusterNodes returns every Ceph and k0s node of all data centers, i.e. all nodes except the +// jumpbox and the shared postgres node. +func (b *GCPBootstrapper) clusterNodes() []*node.Node { + nodes := []*node.Node{} + for _, dc := range b.Env.DataCenters { + nodes = append(nodes, dc.ControlPlaneNodes...) + nodes = append(nodes, dc.CephNodes...) + } + + return nodes +} + type CodesphereEnvironment struct { ProjectID string `json:"project_id"` ProjectTTL string `json:"project_ttl"` @@ -385,17 +421,19 @@ func (b *GCPBootstrapper) Bootstrap() error { } if b.Env.InstallVersion != "" || b.Env.InstallLocal != "" { - err = b.stlog.Step("Install K0s", b.EnsureK0s) + err = b.EnsureK0s() if err != nil { return fmt.Errorf("failed to install k0s: %w", err) } - err = b.stlog.Step("Install Codesphere", b.InstallCodesphere) + err = b.InstallCodesphere() if err != nil { return fmt.Errorf("failed to install Codesphere: %w", err) } - err = b.stlog.Step("Run k0s config script", b.RunK0sConfigScript) + // Every data center is installed before any k0s script runs, so a script never patches + // gateway services an install has yet to create. + err = b.RunK0sConfigScript() if err != nil { return fmt.Errorf("failed to run k0s config script: %w", err) } @@ -410,8 +448,13 @@ func (b *GCPBootstrapper) Bootstrap() error { return nil } -// createTestUser creates a test user in the PostgreSQL instance using the testuser package and logs the credentials. +// createTestUser creates a test user in the shared PostgreSQL instance using the testuser package +// and logs the credentials. The user's team is homed in the primary data center. func (b *GCPBootstrapper) createTestUser() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + if b.Env.PostgreSQLNode == nil { return fmt.Errorf("postgres node not found in bootstrap environment") } @@ -421,11 +464,12 @@ func (b *GCPBootstrapper) createTestUser() error { return fmt.Errorf("postgres node has no external IP") } - if b.Env.InstallConfig == nil { + primary := b.primaryDC() + if primary.InstallConfig == nil { return fmt.Errorf("install config not found in bootstrap environment") } - pgPasswordSecret := b.icg.GetVault().GetSecret(files.SecretPostgresPassword) + pgPasswordSecret := primary.ConfigManager.GetVault().GetSecret(files.SecretPostgresPassword) if pgPasswordSecret == nil || pgPasswordSecret.Fields == nil { return fmt.Errorf("postgres admin password not found in vault") } @@ -439,7 +483,7 @@ func (b *GCPBootstrapper) createTestUser() error { Password: pgPassword, DBName: testuser.DefaultDBName, SSLMode: "require", - DatacenterID: b.Env.DatacenterID, + DatacenterID: primary.ID, }) if err != nil { return err @@ -741,7 +785,7 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { Allowed: []*computepb.Allowed{ {IPProtocol: protoString("all")}, }, - SourceRanges: []string{"10.10.0.0/20"}, + SourceRanges: []string{vpcSubnetCIDR}, Description: protoString("Allow all internal traffic"), } @@ -808,22 +852,40 @@ func (b *GCPBootstrapper) EnsureFirewallRules() error { return nil } -// EnsureGatewayIPAddresses reserves the static external IP addresses for the ingress -// controllers of the cluster (gateway and public gateway) and the SSH workspace proxy. +// EnsureGatewayIPAddresses reserves the static external IP addresses of every data center: the +// ingress controllers of its cluster (gateway and public gateway) and its SSH workspace proxy. func (b *GCPBootstrapper) EnsureGatewayIPAddresses() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + + for _, dc := range b.Env.DataCenters { + if err := b.ensureGatewayIPAddresses(dc); err != nil { + return err + } + } + + b.mirrorPrimaryDataCenter() + + return nil +} + +// ensureGatewayIPAddresses reserves one data center's static external IP addresses. Their names +// carry the data-center suffix, so the primary data center keeps the unsuffixed names. +func (b *GCPBootstrapper) ensureGatewayIPAddresses(dc *datacenter.DataCenter) error { var err error - b.Env.GatewayIP, err = b.EnsureExternalIP("gateway") + dc.GatewayIP, err = b.EnsureExternalIP("gateway" + dc.Suffix) if err != nil { return fmt.Errorf("failed to ensure gateway IP: %w", err) } - b.Env.PublicGatewayIP, err = b.EnsureExternalIP("public-gateway") + dc.PublicGatewayIP, err = b.EnsureExternalIP("public-gateway" + dc.Suffix) if err != nil { return fmt.Errorf("failed to ensure public gateway IP: %w", err) } - b.Env.SshProxyIP, err = b.EnsureExternalIP("ssh-proxy") + dc.SSHProxyIP, err = b.EnsureExternalIP("ssh-proxy" + dc.Suffix) if err != nil { return fmt.Errorf("failed to ensure ssh proxy IP: %w", err) } @@ -864,14 +926,11 @@ func (b *GCPBootstrapper) EnsureExternalIP(name string) (string, error) { } func (b *GCPBootstrapper) EnsureRootLoginEnabled() error { - allNodes := []*node.Node{ - b.Env.Jumpbox, + if err := b.ensureDataCenters(); err != nil { + return err } - allNodes = append(allNodes, b.Env.ControlPlaneNodes...) - allNodes = append(allNodes, b.Env.PostgreSQLNode) - allNodes = append(allNodes, b.Env.CephNodes...) - for _, node := range allNodes { + for _, node := range b.allNodes() { err := b.stlog.Substep(fmt.Sprintf("Ensuring root login enabled on %s", node.GetName()), func() error { return b.ensureRootLoginEnabledInNode(node) }) @@ -960,8 +1019,11 @@ func (b *GCPBootstrapper) EnsureOmsInstalled() (err error) { } func (b *GCPBootstrapper) EnsureHostsConfigured() error { - allNodes := append(b.Env.ControlPlaneNodes, b.Env.PostgreSQLNode) - allNodes = append(allNodes, b.Env.CephNodes...) + if err := b.ensureDataCenters(); err != nil { + return err + } + + allNodes := append([]*node.Node{b.Env.PostgreSQLNode}, b.clusterNodes()...) for _, node := range allNodes { if !node.HasInotifyWatchesConfigured() { @@ -977,6 +1039,27 @@ func (b *GCPBootstrapper) EnsureHostsConfigured() error { return fmt.Errorf("failed to configure memory map on %s: %w", node.GetName(), err) } } + + err := node.RunSSHCommand("root", "mkdir -p "+installerNodeSecretsDir) + if err != nil { + return fmt.Errorf("failed to create secrets directory on %s: %w", node.GetName(), err) + } + } + + // A secondary data center's secrets directory differs from the fixed path above, so create that + // one too on its own nodes. Nodes belong to exactly one data center, so no node gets a foreign + // data center's directory. + for _, dc := range b.Env.DataCenters { + if dc.SecretsDir == installerNodeSecretsDir { + continue + } + + for _, n := range append(append([]*node.Node{}, dc.ControlPlaneNodes...), dc.CephNodes...) { + err := n.RunSSHCommand("root", "mkdir -p "+dc.SecretsDir) + if err != nil { + return fmt.Errorf("failed to create secrets directory on %s: %w", n.GetName(), err) + } + } } return nil @@ -1136,13 +1219,26 @@ func (b *GCPBootstrapper) EnsureDNSRecords() error { return nil } +// InstallCodesphere installs Codesphere into every data center from the shared jumpbox, in +// ascending data center order. The order matters: the primary data center's install creates the +// database, roles and schema that the secondary ones reuse. func (b *GCPBootstrapper) InstallCodesphere() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + if err := b.ensureCodespherePackageOnJumpbox(); err != nil { return fmt.Errorf("failed to ensure Codesphere package on jumpbox: %w", err) } - if err := b.runInstallCommand(b.codespherePackageFilename()); err != nil { - return fmt.Errorf("failed to install Codesphere from jumpbox: %w", err) + packageFilename := b.codespherePackageFilename() + for _, dc := range b.Env.DataCenters { + err := b.stlog.Step(dc.StepName("Install Codesphere"), func() error { + return b.runInstallCommand(dc, packageFilename) + }) + if err != nil { + return fmt.Errorf("failed to install Codesphere from jumpbox (data center %d): %w", dc.ID, err) + } } return nil @@ -1197,12 +1293,21 @@ func (b *GCPBootstrapper) ensureCodespherePackageOnJumpbox() error { return nil } -func (b *GCPBootstrapper) runInstallCommand(packageFilename string) error { - b.stlog.Logf("Installing Codesphere...") - installCmd := fmt.Sprintf("oms install codesphere -c /etc/codesphere/config.yaml -k %s/age_key.txt --vault %s -p %s%s", - b.Env.SecretsDir, filepath.Join(b.Env.SecretsDir, "prod.vault.yaml"), packageFilename, b.generateSkipStepsArg()) +func (b *GCPBootstrapper) runInstallCommand(dc *datacenter.DataCenter, packageFilename string) error { + b.stlog.Logf("Installing Codesphere in data center %d...", dc.ID) + + if err := b.Env.Jumpbox.RunSSHCommand("root", b.InstallCommand(dc, packageFilename)); err != nil { + return fmt.Errorf("failed to run install command: %w", err) + } + + return nil +} - return b.Env.Jumpbox.RunSSHCommand("root", installCmd) +// InstallCommand returns the command that installs Codesphere into the given data center from +// the jumpbox. It is also printed for the operator when the bootstrap does not install itself. +func (b *GCPBootstrapper) InstallCommand(dc *datacenter.DataCenter, packageFilename string) string { + return fmt.Sprintf("oms install codesphere -c %s -k %s --vault %s -p %s%s", + dc.RemoteConfigPath, dc.RemoteAgeKeyPath(), dc.RemoteVaultPath(), packageFilename, b.generateSkipStepsArg()) } func (b *GCPBootstrapper) generateSkipStepsArg() string { diff --git a/internal/bootstrap/gcp/gcp_test.go b/internal/bootstrap/gcp/gcp_test.go index ea7224163..79b66dd9c 100644 --- a/internal/bootstrap/gcp/gcp_test.go +++ b/internal/bootstrap/gcp/gcp_test.go @@ -12,6 +12,7 @@ import ( "cloud.google.com/go/artifactregistry/apiv1/artifactregistrypb" "cloud.google.com/go/compute/apiv1/computepb" "github.com/codesphere-cloud/oms/internal/bootstrap" + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" "github.com/codesphere-cloud/oms/internal/bootstrap/gcp" "github.com/codesphere-cloud/oms/internal/env" "github.com/codesphere-cloud/oms/internal/github" @@ -1229,9 +1230,79 @@ var _ = Describe("GCP Bootstrapper", func() { err := bs.EnsureHostsConfigured() Expect(err).NotTo(HaveOccurred()) }) + + It("creates the directory the installer uploads the age key to on every node", func() { + mkdirs := map[string]int{} + + nodeClient.EXPECT().RunCommand(mock.Anything, "root", mock.Anything). + RunAndReturn(func(n *node.Node, _ string, command string) error { + if command == "mkdir -p /etc/codesphere/secrets" { + mkdirs[n.GetName()]++ + } + + return nil + }) + + Expect(bs.EnsureHostsConfigured()).To(Succeed()) + // The postgres node plus every cluster node of every data center. + Expect(mkdirs).To(Equal(map[string]int{ + "postgres": 1, + "k0s-1": 1, "k0s-2": 1, "k0s-3": 1, + "ceph-1": 1, "ceph-2": 1, "ceph-3": 1, + })) + }) + + It("creates a secondary data center's own secrets directory on its nodes only", func() { + secondary := &datacenter.DataCenter{ID: 2, Suffix: "-dc2", SecretsDir: "/etc/codesphere/secrets-dc2"} + secondary.ControlPlaneNodes = []*node.Node{fakeNode("k0s-1-dc2", nodeClient)} + secondary.CephNodes = []*node.Node{fakeNode("ceph-1-dc2", nodeClient)} + + bs.Env.DataCenters = []*datacenter.DataCenter{ + { + ID: 1, + SecretsDir: "/etc/codesphere/secrets", + ControlPlaneNodes: bs.Env.ControlPlaneNodes, + CephNodes: bs.Env.CephNodes, + }, + secondary, + } + + mkdirs := map[string][]string{} + + nodeClient.EXPECT().RunCommand(mock.Anything, "root", mock.Anything). + RunAndReturn(func(n *node.Node, _ string, command string) error { + if dir, found := strings.CutPrefix(command, "mkdir -p "); found { + mkdirs[n.GetName()] = append(mkdirs[n.GetName()], dir) + } + + return nil + }) + + Expect(bs.EnsureHostsConfigured()).To(Succeed()) + // Both paths on the secondary's nodes, because the installer's fixed path is + // created everywhere; the secondary's path on nobody else's. + Expect(mkdirs["k0s-1-dc2"]).To(ConsistOf("/etc/codesphere/secrets", "/etc/codesphere/secrets-dc2")) + Expect(mkdirs["ceph-1-dc2"]).To(ConsistOf("/etc/codesphere/secrets", "/etc/codesphere/secrets-dc2")) + Expect(mkdirs["k0s-1"]).To(ConsistOf("/etc/codesphere/secrets")) + Expect(mkdirs["postgres"]).To(ConsistOf("/etc/codesphere/secrets")) + }) }) Describe("Invalid cases", func() { + It("fails when the secrets directory cannot be created", func() { + nodeClient.EXPECT().RunCommand(mock.Anything, "root", mock.Anything). + RunAndReturn(func(_ *node.Node, _ string, command string) error { + if command == "mkdir -p /etc/codesphere/secrets" { + return fmt.Errorf("ouch") + } + + return nil + }) + + err := bs.EnsureHostsConfigured() + Expect(err).To(MatchError(ContainSubstring("failed to create secrets directory on postgres"))) + }) + It("fails when ConfigureInotifyWatches fails", func() { nodeClient.EXPECT().RunCommand(mock.Anything, "root", mock.Anything).Return(fmt.Errorf("ouch")) diff --git a/internal/bootstrap/gcp/k0s.go b/internal/bootstrap/gcp/k0s.go index ef9604770..2f505ef6c 100644 --- a/internal/bootstrap/gcp/k0s.go +++ b/internal/bootstrap/gcp/k0s.go @@ -5,13 +5,13 @@ package gcp import ( "fmt" - "path/filepath" "strings" + "github.com/codesphere-cloud/oms/internal/bootstrap/datacenter" "github.com/codesphere-cloud/oms/internal/installer" ) -// EnsureK0s executed all steps to ensure a k0s cluster in gcp. +// EnsureK0s executed all steps to ensure a k0s cluster in gcp for every data center. // Only executing the config script needs to be done after installing codesphere, as crucial parts are still in the ts-installer. // Returns an error if k0s could not be ensured. func (b *GCPBootstrapper) EnsureK0s() error { @@ -33,13 +33,28 @@ func (b *GCPBootstrapper) EnsureK0s() error { return nil } -// GenerateK0sConfigScript creates a script to confire k0s in a gcp VM that will be executed on the control plane -// Returns an error if the script can't be generated, written, copied. +// GenerateK0sConfigScript writes and uploads the k0s cloud-provider configuration script of +// every data center to that data center's first control plane node. +// Returns an error if a script can't be generated, written, copied. func (b *GCPBootstrapper) GenerateK0sConfigScript() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + + for _, dc := range b.Env.DataCenters { + if err := b.generateK0sConfigScript(dc); err != nil { + return err + } + } + + return nil +} + +func (b *GCPBootstrapper) generateK0sConfigScript(dc *datacenter.DataCenter) error { var enableWorkerDaemonsCmds strings.Builder - for i := 1; i < len(b.Env.ControlPlaneNodes); i++ { - internalIP := b.Env.ControlPlaneNodes[i].GetInternalIP() + for i := 1; i < len(dc.ControlPlaneNodes); i++ { + internalIP := dc.ControlPlaneNodes[i].GetInternalIP() fmt.Fprintf(&enableWorkerDaemonsCmds, "ssh -o StrictHostKeyChecking=no root@%s sed -i 's/k0sworker/k0sworker --enable-cloud-provider/g' /etc/systemd/system/k0sworker.service; systemctl daemon-reload; systemctl restart k0sworker", internalIP) fmt.Fprint(&enableWorkerDaemonsCmds, "\n") } @@ -119,50 +134,90 @@ $KUBECTL patch svc gateway-controller -n codesphere -p '{"spec": {"loadBalancerI sed -i 's/k0scontroller/k0scontroller --enable-cloud-provider/g' /etc/systemd/system/k0scontroller.service systemctl daemon-reload systemctl restart k0scontroller -`, b.Env.PublicGatewayIP, b.Env.GatewayIP, enableWorkerDaemonsCmds.String()) +`, dc.PublicGatewayIP, dc.GatewayIP, enableWorkerDaemonsCmds.String()) // Probably we need to enable the cloud provider plugin in k0s configuration. // --enable-cloud-provider on worker nodes systemd file /etc/systemd/system/k0sworker.service // in addition on the first node: /etc/systemd/system/k0scontroller.service the flag --enable-cloud-provider - err := b.fw.WriteFile("configure-k0s.sh", []byte(script), 0755) + localScript := dc.K0sConfigScriptPath() + + err := b.fw.WriteFile(localScript, []byte(script), 0755) if err != nil { - return fmt.Errorf("failed to write configure-k0s.sh: %w", err) + return fmt.Errorf("failed to write %s: %w", localScript, err) } - err = b.Env.ControlPlaneNodes[0].NodeClient.CopyFile(b.Env.ControlPlaneNodes[0], "configure-k0s.sh", "/root/configure-k0s.sh") + controller := dc.ControlPlaneNodes[0] + + err = controller.NodeClient.CopyFile(controller, localScript, remoteK0sConfigScriptPath) if err != nil { - return fmt.Errorf("failed to copy configure-k0s.sh to control plane node: %w", err) + return fmt.Errorf("failed to copy %s to control plane node: %w", localScript, err) } - err = b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "chmod +x /root/configure-k0s.sh") + err = controller.RunSSHCommand("root", "chmod +x "+remoteK0sConfigScriptPath) if err != nil { - return fmt.Errorf("failed to make configure-k0s.sh executable on control plane node: %w", err) + return fmt.Errorf("failed to make %s executable: %w", localScript, err) } return nil } -// RunK0sConfigScript executed the configure script for k0s on the control-plane -// Return an error if executing the ssh command fails +// RunK0sConfigScript runs every data center's k0s configuration script on its first control +// plane node. It requires that data center's Codesphere install to have completed, since the +// script patches the gateway services the install creates. func (b *GCPBootstrapper) RunK0sConfigScript() error { - err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", "/root/configure-k0s.sh") + if err := b.ensureDataCenters(); err != nil { + return err + } + + for _, dc := range b.Env.DataCenters { + err := b.stlog.Step(dc.StepName("Run k0s config script"), func() error { + return b.runK0sConfigScript(dc) + }) + if err != nil { + return fmt.Errorf("failed to run k0s config script (data center %d): %w", dc.ID, err) + } + } + + return nil +} + +func (b *GCPBootstrapper) runK0sConfigScript(dc *datacenter.DataCenter) error { + err := dc.ControlPlaneNodes[0].RunSSHCommand("root", remoteK0sConfigScriptPath) if err != nil { - return fmt.Errorf("failed to configure k0s on the control-plane: %w", err) + return fmt.Errorf("failed to configure k0s in data center %d: %w", dc.ID, err) } return nil } -// InstallK0s deploys k0s with the native OMS installer and stores its -// kubeconfig in the encrypted install vault for the remaining installer steps. +// InstallK0s deploys k0s into every data center with the native OMS installer. Each data center +// gets its own cluster, so every run stores its kubeconfig in that data center's encrypted +// install vault for the remaining installer steps. func (b *GCPBootstrapper) InstallK0s() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + + for _, dc := range b.Env.DataCenters { + err := b.stlog.Step(dc.StepName("Install k0s"), func() error { + return b.installK0s(dc) + }) + if err != nil { + return fmt.Errorf("failed to install k0s (data center %d): %w", dc.ID, err) + } + } + + return nil +} + +func (b *GCPBootstrapper) installK0s(dc *datacenter.DataCenter) error { // Reuse matching cached binaries and let k0sctl reconcile normally. Without // --force, an unchanged cluster remains untouched on bootstrap retries. - installCmd := fmt.Sprintf("oms install k0s --version %s --install-config /etc/codesphere/config.yaml --vault %s --vault-priv-key %s/age_key.txt", - installer.DefaultK0sVersion, filepath.Join(b.Env.SecretsDir, "prod.vault.yaml"), b.Env.SecretsDir) + installCmd := fmt.Sprintf("oms install k0s --version %s --install-config %s --vault %s --vault-priv-key %s", + installer.DefaultK0sVersion, dc.RemoteConfigPath, dc.RemoteVaultPath(), dc.RemoteAgeKeyPath()) if err := b.Env.Jumpbox.RunSSHCommand("root", installCmd); err != nil { - return fmt.Errorf("failed to install k0s from jumpbox: %w", err) + return fmt.Errorf("failed to install k0s from jumpbox (data center %d): %w", dc.ID, err) } return nil @@ -173,9 +228,26 @@ func (b *GCPBootstrapper) InstallK0s() error { // Codesphere charts: all schedulable nodes must be Ready before gateway // controllers and their admission webhooks are installed. func (b *GCPBootstrapper) WaitForK0sNodes() error { + if err := b.ensureDataCenters(); err != nil { + return err + } + + for _, dc := range b.Env.DataCenters { + err := b.stlog.Step(dc.StepName("Wait for k0s nodes"), func() error { + return b.waitForK0sNodes(dc) + }) + if err != nil { + return fmt.Errorf("failed waiting for k0s nodes (data center %d): %w", dc.ID, err) + } + } + + return nil +} + +func (b *GCPBootstrapper) waitForK0sNodes(dc *datacenter.DataCenter) error { const command = "k0s kubectl wait --for=condition=Ready nodes --all --timeout=30m" - if err := b.Env.ControlPlaneNodes[0].RunSSHCommand("root", command); err != nil { - return fmt.Errorf("k0s nodes did not become ready: %w", err) + if err := dc.ControlPlaneNodes[0].RunSSHCommand("root", command); err != nil { + return fmt.Errorf("k0s nodes did not become ready (data center %d): %w", dc.ID, err) } return nil From 4e5722e626beee55c615588b15616d764da23f58 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 18:03:25 +0000 Subject: [PATCH 113/132] update(deps): update github.com/rook/rook/pkg/apis digest to 8611f1b (#799) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `2785aa1` → `8611f1b` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 879da3383..6dd4078f8 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260909201307-2785aa192641 +Version: v0.0.0-20260910164746-8611f1b500bd License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/2785aa192641/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/8611f1b500bd/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b77c71cf4..be9657961 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641 + github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index c004155cf..0906dcccf 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641 h1:Kx/n0olWFNh1RJNHlRrtBp19tkkE3JxPADiYsPgK72M= -github.com/rook/rook/pkg/apis v0.0.0-20260909201307-2785aa192641/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd h1:e53NL18Vbl26Kqyg+mUbcx6NL2WQykXoIpKXlyG+bfU= +github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 879da3383..6dd4078f8 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260909201307-2785aa192641 +Version: v0.0.0-20260910164746-8611f1b500bd License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/2785aa192641/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/8611f1b500bd/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From c6abda17348dafa6548068f6c6cf3644bcad592e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 19:45:14 +0000 Subject: [PATCH 114/132] update(deps): update module cloud.google.com/go/compute to v1.68.0 (#800) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cloud.google.com/go/compute](https://redirect.github.com/googleapis/google-cloud-go) | `v1.67.0` → `v1.68.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/cloud.google.com%2fgo%2fcompute/v1.68.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/cloud.google.com%2fgo%2fcompute/v1.67.0/v1.68.0?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 6dd4078f8..ddead1e68 100644 --- a/NOTICE +++ b/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/auth/oauth2adapt ---------- Module: cloud.google.com/go/compute -Version: v1.67.0 +Version: v1.68.0 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.67.0/compute/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.68.0/compute/LICENSE ---------- Module: cloud.google.com/go/compute/metadata diff --git a/go.mod b/go.mod index be9657961..85c08dfb7 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ replace ( require ( cloud.google.com/go/artifactregistry v1.26.0 - cloud.google.com/go/compute v1.67.0 + cloud.google.com/go/compute v1.68.0 cloud.google.com/go/iam v1.13.0 cloud.google.com/go/resourcemanager v1.16.0 cloud.google.com/go/serviceusage v1.15.0 diff --git a/go.sum b/go.sum index 0906dcccf..3e575cfdb 100644 --- a/go.sum +++ b/go.sum @@ -692,8 +692,8 @@ cloud.google.com/go/compute v1.29.0/go.mod h1:HFlsDurE5DpQZClAGf/cYh+gxssMhBxBov cloud.google.com/go/compute v1.31.0/go.mod h1:4SCUCDAvOQvMGu4ze3YIJapnY0UQa5+WvJJeYFsQRoo= cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8= cloud.google.com/go/compute v1.34.0/go.mod h1:zWZwtLwZQyonEvIQBuIa0WvraMYK69J5eDCOw9VZU4g= -cloud.google.com/go/compute v1.67.0 h1:CdAcTBCWUCoymOxOCU5sAwsGekn3KWaHI6mBkAGLQOA= -cloud.google.com/go/compute v1.67.0/go.mod h1:h1O3BCv0Zd0/8rZ6PGx8aRBhKBtDC0AuvURtWg1hLLE= +cloud.google.com/go/compute v1.68.0 h1:+8u41+P7i4Cdzbsna+mxfHl/cTm1HYDS+XmLdf0KcPw= +cloud.google.com/go/compute v1.68.0/go.mod h1:h1O3BCv0Zd0/8rZ6PGx8aRBhKBtDC0AuvURtWg1hLLE= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 6dd4078f8..ddead1e68 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -23,9 +23,9 @@ License URL: https://github.com/googleapis/google-cloud-go/blob/auth/oauth2adapt ---------- Module: cloud.google.com/go/compute -Version: v1.67.0 +Version: v1.68.0 License: Apache-2.0 -License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.67.0/compute/LICENSE +License URL: https://github.com/googleapis/google-cloud-go/blob/compute/v1.68.0/compute/LICENSE ---------- Module: cloud.google.com/go/compute/metadata From 482a4b5ef06dd0cf7ac8144bc2d7a728116540d7 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:50:20 +0000 Subject: [PATCH 115/132] update(deps): update github.com/rook/rook/pkg/apis digest to ed913a8 (#801) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `8611f1b` → `ed913a8` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index ddead1e68..c2d82d347 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260910164746-8611f1b500bd +Version: v0.0.0-20260910220229-ed913a842168 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/8611f1b500bd/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/ed913a842168/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 85c08dfb7..6efe0d1c9 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd + github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 3e575cfdb..a3c87df88 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd h1:e53NL18Vbl26Kqyg+mUbcx6NL2WQykXoIpKXlyG+bfU= -github.com/rook/rook/pkg/apis v0.0.0-20260910164746-8611f1b500bd/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168 h1:T+A6213qHduEYc/FRRQcTvfFphF7pQlRNaZ52RYNCcw= +github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index ddead1e68..c2d82d347 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260910164746-8611f1b500bd +Version: v0.0.0-20260910220229-ed913a842168 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/8611f1b500bd/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/ed913a842168/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From ec1f4fa22ea3672b3f75ce724a2a379d30004d11 Mon Sep 17 00:00:00 2001 From: Jona Neef Date: Fri, 11 Sep 2026 15:12:22 +0200 Subject: [PATCH 116/132] feat(fga): add openfga backup to bootstrap (#595) Stacked PR, only merge after #594. Adds openfga backup to the bootstrap, so the backup configuration is tested with each PC Installation. Creates a new bucket in gcp in the same project and configures that as backup storage for openfga. On cleanup the bucket is deleted together with the whole project deletion. --------- Signed-off-by: Jona Neef Signed-off-by: NJona <25478046+NJona@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 --- internal/bootstrap/gcp/gcp.go | 12 ++ internal/bootstrap/gcp/gcp_client.go | 49 +++++++ internal/bootstrap/gcp/gcp_test.go | 6 + internal/bootstrap/gcp/iam_admin.go | 12 ++ internal/bootstrap/gcp/iam_admin_test.go | 5 + internal/bootstrap/gcp/install_config.go | 61 ++++++++ internal/bootstrap/gcp/install_config_test.go | 71 +++++++++ internal/bootstrap/gcp/mocks.go | 135 ++++++++++++++++++ 8 files changed, 351 insertions(+) diff --git a/internal/bootstrap/gcp/gcp.go b/internal/bootstrap/gcp/gcp.go index f0037ef18..750c27f69 100644 --- a/internal/bootstrap/gcp/gcp.go +++ b/internal/bootstrap/gcp/gcp.go @@ -267,6 +267,13 @@ type CodesphereEnvironment struct { RootDiskSize int64 `json:"root_disk_size"` // Local OMS binary copied to the jumpbox instead of installing a release. RemoteOmsBinaryPath string `json:"-"` + + // OpenFGA database backups. The bucket lives in the project and is removed + // together with the project on cleanup. Access key/secret are populated only + // when a new HMAC key is created. + OpenfgaBackupBucket string `json:"openfga_backup_bucket"` + OpenfgaBackupAccessKeyID string `json:"-"` + OpenfgaBackupSecret string `json:"-"` } func NewGCPBootstrapper( @@ -349,6 +356,11 @@ func (b *GCPBootstrapper) Bootstrap() error { return fmt.Errorf("failed to ensure IAM roles: %w", err) } + err = b.stlog.Step("Ensure openfga backup bucket", b.EnsureOpenfgaBackupBucket) + if err != nil { + return fmt.Errorf("failed to ensure openfga backup bucket: %w", err) + } + err = b.stlog.Step("Ensure VPC", b.EnsureVPC) if err != nil { return fmt.Errorf("failed to ensure VPC: %w", err) diff --git a/internal/bootstrap/gcp/gcp_client.go b/internal/bootstrap/gcp/gcp_client.go index 1d1799242..4e41c6ebc 100644 --- a/internal/bootstrap/gcp/gcp_client.go +++ b/internal/bootstrap/gcp/gcp_client.go @@ -25,9 +25,11 @@ import ( "github.com/lithammer/shortuuid" "google.golang.org/api/cloudbilling/v1" "google.golang.org/api/dns/v1" + "google.golang.org/api/googleapi" "google.golang.org/api/iam/v1" "google.golang.org/api/iterator" publicca "google.golang.org/api/publicca/v1" + storage "google.golang.org/api/storage/v1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/fieldmaskpb" @@ -63,6 +65,8 @@ type GCPClientManager interface { EnsureDNSRecordSets(projectID, zoneName string, records []*dns.ResourceRecordSet) error DeleteDNSRecordSets(projectID, zoneName, baseDomain string) error CreatePublicCAExternalAccountKey(projectID string) (keyID, b64MacKey string, err error) + EnsureStorageBucket(projectID, bucketName, location string) error + CreateHMACKey(projectID, serviceAccountEmail string) (accessID, secret string, err error) } // Concrete implementation @@ -926,6 +930,51 @@ func (c *GCPClient) CreatePublicCAExternalAccountKey(projectID string) (string, return key.KeyId, key.B64MacKey, nil } +// EnsureStorageBucket creates a Cloud Storage bucket in the given project and +// location. It is idempotent: an already-existing bucket owned by the project is +// treated as success. The bucket lives in the project so it is removed together +// with the project on cleanup. +func (c *GCPClient) EnsureStorageBucket(projectID, bucketName, location string) error { + svc, err := storage.NewService(c.ctx) + if err != nil { + return fmt.Errorf("failed to create storage client: %w", err) + } + + bucket := &storage.Bucket{ + Name: bucketName, + Location: location, + } + _, err = svc.Buckets.Insert(projectID, bucket).Context(c.ctx).Do() + if err != nil { + if apiErr, ok := err.(*googleapi.Error); ok && apiErr.Code == 409 { + // Bucket already exists (owned by this project on re-runs). + return nil + } + return fmt.Errorf("failed to create storage bucket %s: %w", bucketName, err) + } + return nil +} + +// CreateHMACKey creates an HMAC key for the given service account, used for +// S3-compatible access to Cloud Storage. The secret is only returned at creation +// time, so callers must persist it. HMAC keys are removed together with the +// project on cleanup. +func (c *GCPClient) CreateHMACKey(projectID, serviceAccountEmail string) (string, string, error) { + svc, err := storage.NewService(c.ctx) + if err != nil { + return "", "", fmt.Errorf("failed to create storage client: %w", err) + } + + key, err := svc.Projects.HmacKeys.Create(projectID, serviceAccountEmail).Context(c.ctx).Do() + if err != nil { + return "", "", fmt.Errorf("failed to create HMAC key: %w", err) + } + if key.Metadata == nil { + return "", "", fmt.Errorf("HMAC key response missing metadata") + } + return key.Metadata.AccessId, key.Secret, nil +} + // Helper functions func protoString(s string) *string { return &s } func protoBool(b bool) *bool { return &b } diff --git a/internal/bootstrap/gcp/gcp_test.go b/internal/bootstrap/gcp/gcp_test.go index 79b66dd9c..dae799909 100644 --- a/internal/bootstrap/gcp/gcp_test.go +++ b/internal/bootstrap/gcp/gcp_test.go @@ -202,6 +202,7 @@ var _ = Describe("GCP Bootstrapper", func() { // EnsureServiceAccounts gc.EXPECT().CreateServiceAccount(projectID, "cloud-controller", "cloud-controller").Return("cloud-controller@p.iam.gserviceaccount.com", false, nil) + gc.EXPECT().CreateServiceAccount(projectID, "openfga-backup", "openfga-backup").Return("openfga-backup@"+projectID+".iam.gserviceaccount.com", true, nil) gc.EXPECT().CreateServiceAccount(projectID, "artifact-registry-writer", "artifact-registry-writer").Return("writer@p.iam.gserviceaccount.com", true, nil) gc.EXPECT().CreateServiceAccountKey(projectID, "writer@p.iam.gserviceaccount.com").Return("fake-key", nil) @@ -209,6 +210,11 @@ var _ = Describe("GCP Bootstrapper", func() { gc.EXPECT().AssignIAMRole(projectID, "artifact-registry-writer", projectID, []string{"roles/artifactregistry.writer"}).Return(nil) gc.EXPECT().AssignIAMRole(projectID, "cloud-controller", projectID, []string{"roles/compute.admin"}).Return(nil) gc.EXPECT().AssignIAMRole(csEnv.DNSProjectID, "cloud-controller", projectID, []string{"roles/dns.admin"}).Return(nil) + gc.EXPECT().AssignIAMRole(projectID, "openfga-backup", projectID, []string{"roles/storage.objectAdmin"}).Return(nil) + + // EnsureOpenfgaBackupBucket + gc.EXPECT().EnsureStorageBucket(projectID, projectID+"-openfga-backup", "us-central1").Return(nil) + gc.EXPECT().CreateHMACKey(projectID, "openfga-backup@"+projectID+".iam.gserviceaccount.com").Return("fake-access-id", "fake-secret", nil) // EnsureVPC gc.EXPECT().CreateVPC(projectID, "us-central1", projectID+"-vpc", projectID+"-us-central1-subnet", projectID+"-router", projectID+"-nat-gateway").Return(nil) diff --git a/internal/bootstrap/gcp/iam_admin.go b/internal/bootstrap/gcp/iam_admin.go index da2e6283d..1e1a7306f 100644 --- a/internal/bootstrap/gcp/iam_admin.go +++ b/internal/bootstrap/gcp/iam_admin.go @@ -166,6 +166,7 @@ func (b *GCPBootstrapper) EnsureAPIsEnabled() error { "serviceusage.googleapis.com", "artifactregistry.googleapis.com", "dns.googleapis.com", + "storage.googleapis.com", } if b.Env.GoogleACMEIssuer { apis = append(apis, "publicca.googleapis.com") @@ -186,6 +187,12 @@ func (b *GCPBootstrapper) EnsureServiceAccounts() error { return err } + // Dedicated service account for OpenFGA database backups. Its storage role is + // assigned in EnsureIAMRoles and its HMAC key created in EnsureOpenfgaBackupBucket. + if _, _, err := b.GCPClient.CreateServiceAccount(b.Env.ProjectID, openfgaBackupSAName, openfgaBackupSAName); err != nil { + return fmt.Errorf("failed to ensure openfga backup service account: %w", err) + } + if b.Env.RegistryType == RegistryTypeArtifactRegistry { sa, newSa, err := b.GCPClient.CreateServiceAccount(b.Env.ProjectID, "artifact-registry-writer", "artifact-registry-writer") if err != nil { @@ -237,6 +244,11 @@ func (b *GCPBootstrapper) EnsureIAMRoles() error { return fmt.Errorf("failed to ensure DNS permissions: %w", err) } + err = b.ensureIAMRoleWithRetry(b.Env.ProjectID, openfgaBackupSAName, b.Env.ProjectID, []string{"roles/storage.objectAdmin"}) + if err != nil { + return fmt.Errorf("failed to ensure openfga backup role bindings: %w", err) + } + if b.Env.RegistryType != RegistryTypeArtifactRegistry { return nil } diff --git a/internal/bootstrap/gcp/iam_admin_test.go b/internal/bootstrap/gcp/iam_admin_test.go index 681ae3beb..44c3fc706 100644 --- a/internal/bootstrap/gcp/iam_admin_test.go +++ b/internal/bootstrap/gcp/iam_admin_test.go @@ -218,6 +218,7 @@ var _ = Describe("IAM & Admin", func() { "serviceusage.googleapis.com", "artifactregistry.googleapis.com", "dns.googleapis.com", + "storage.googleapis.com", }).Return(nil) err := bs.EnsureAPIsEnabled() @@ -245,6 +246,7 @@ var _ = Describe("IAM & Admin", func() { }) It("creates cloud-controller and skips writer", func() { gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "cloud-controller", "cloud-controller").Return("email@sa", false, nil) + gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "openfga-backup", "openfga-backup").Return("openfga-backup@sa", true, nil) err := bs.EnsureServiceAccounts() Expect(err).NotTo(HaveOccurred()) @@ -261,6 +263,7 @@ var _ = Describe("IAM & Admin", func() { icg.EXPECT().GetVault().Return(vault) gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "cloud-controller", "cloud-controller").Return("email@sa", false, nil) + gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "openfga-backup", "openfga-backup").Return("openfga-backup@sa", true, nil) gc.EXPECT().CreateServiceAccount(csEnv.ProjectID, "artifact-registry-writer", "artifact-registry-writer").Return("writer@sa", true, nil) gc.EXPECT().CreateServiceAccountKey(csEnv.ProjectID, "writer@sa").Return("key-content", nil) @@ -290,6 +293,7 @@ var _ = Describe("IAM & Admin", func() { It("assigns roles correctly", func() { gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "cloud-controller", csEnv.ProjectID, []string{"roles/compute.admin"}).Return(nil) gc.EXPECT().AssignIAMRole(csEnv.DNSProjectID, "cloud-controller", csEnv.ProjectID, []string{"roles/dns.admin"}).Return(nil) + gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "openfga-backup", csEnv.ProjectID, []string{"roles/storage.objectAdmin"}).Return(nil) gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "artifact-registry-writer", csEnv.ProjectID, []string{"roles/artifactregistry.writer"}).Return(nil) err := bs.EnsureIAMRoles() @@ -303,6 +307,7 @@ var _ = Describe("IAM & Admin", func() { It("assigns DNS role to cloud-controller in main project", func() { gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "cloud-controller", csEnv.ProjectID, []string{"roles/compute.admin"}).Return(nil) gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "cloud-controller", csEnv.ProjectID, []string{"roles/dns.admin"}).Return(nil) + gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "openfga-backup", csEnv.ProjectID, []string{"roles/storage.objectAdmin"}).Return(nil) gc.EXPECT().AssignIAMRole(csEnv.ProjectID, "artifact-registry-writer", csEnv.ProjectID, []string{"roles/artifactregistry.writer"}).Return(nil) err := bs.EnsureIAMRoles() diff --git a/internal/bootstrap/gcp/install_config.go b/internal/bootstrap/gcp/install_config.go index 75132dc15..a3aee315f 100644 --- a/internal/bootstrap/gcp/install_config.go +++ b/internal/bootstrap/gcp/install_config.go @@ -389,6 +389,7 @@ func (b *GCPBootstrapper) UpdateInstallConfig() error { b.applyExternalLokiConfig() b.applyPrometheusRemoteWriteConfig() + b.applyOpenfgaBackupConfig() // Secret generation is idempotent and also backfills secrets introduced // after an existing vault was created (for example the auth keys required by @@ -510,6 +511,66 @@ func (b *GCPBootstrapper) applyManagedServiceDefaults() { } } +// openfgaBackupSAName is the service account whose HMAC key authenticates OpenFGA +// database backups against the S3-compatible Cloud Storage endpoint. +const openfgaBackupSAName = "openfga-backup" + +// EnsureOpenfgaBackupBucket creates the Cloud Storage bucket and HMAC key used for +// OpenFGA database backups. The bucket and HMAC key live in the project so they are +// removed together with the project on cleanup. The dedicated service account and +// its storage role are provisioned by EnsureServiceAccounts / EnsureIAMRoles. +// +// The HMAC secret is only returned at creation time, so it is persisted to the +// vault by applyOpenfgaBackupConfig. Creation is skipped when a real secret is +// already present in the vault (e.g. on re-runs or recovered configs). +func (b *GCPBootstrapper) EnsureOpenfgaBackupBucket() error { + bucketName := fmt.Sprintf("%s-openfga-backup", b.Env.ProjectID) + + if err := b.GCPClient.EnsureStorageBucket(b.Env.ProjectID, bucketName, b.Env.Region); err != nil { + return fmt.Errorf("failed to ensure openfga backup bucket: %w", err) + } + b.Env.OpenfgaBackupBucket = bucketName + + // The HMAC secret cannot be retrieved after creation, so only create a new key + // when we don't already have a real one persisted in the vault. + if existing := b.icg.GetVault().GetSecret(files.SecretOpenfgaDbBackupSecretAccessKey); existing != nil && + existing.Fields != nil && existing.Fields.Password != "" && existing.Fields.Password != "dummy" { + return nil + } + + saEmail := fmt.Sprintf("%s@%s.iam.gserviceaccount.com", openfgaBackupSAName, b.Env.ProjectID) + accessID, secret, err := b.GCPClient.CreateHMACKey(b.Env.ProjectID, saEmail) + if err != nil { + return fmt.Errorf("failed to create openfga backup HMAC key: %w", err) + } + b.Env.OpenfgaBackupAccessKeyID = accessID + b.Env.OpenfgaBackupSecret = secret + + return nil +} + +// applyOpenfgaBackupConfig wires the bucket created by EnsureOpenfgaBackupBucket +// into the install config and persists the HMAC credentials to the vault. It is a +// no-op when no bucket was provisioned. +func (b *GCPBootstrapper) applyOpenfgaBackupConfig() { + if b.Env.OpenfgaBackupBucket == "" { + return + } + + b.Env.InstallConfig.Codesphere.OpenfgaBackups = &files.OpenfgaBackupsConfig{ + Enabled: true, + DestinationPath: "s3://" + b.Env.OpenfgaBackupBucket, + EndpointURL: "https://storage.googleapis.com", + } + + // Only overwrite when a new HMAC key was created this run; otherwise the + // existing secret loaded from the vault is kept. + if b.Env.OpenfgaBackupAccessKeyID != "" { + b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretOpenfgaDbBackupAccessKeyId, Fields: &files.SecretFields{Password: b.Env.OpenfgaBackupAccessKeyID}}) + b.icg.GetVault().SetSecret(files.SecretEntry{Name: files.SecretOpenfgaDbBackupSecretAccessKey, Fields: &files.SecretFields{Password: b.Env.OpenfgaBackupSecret}}) + } +} + func (b *GCPBootstrapper) applyExternalLokiConfig() { if b.Env.ExternalLokiEndpoint == "" { return diff --git a/internal/bootstrap/gcp/install_config_test.go b/internal/bootstrap/gcp/install_config_test.go index 55af1cad9..4663793ba 100644 --- a/internal/bootstrap/gcp/install_config_test.go +++ b/internal/bootstrap/gcp/install_config_test.go @@ -309,6 +309,47 @@ var _ = Describe("Installconfig & Secrets", func() { }) }) + Describe("EnsureOpenfgaBackupBucket", func() { + It("creates the bucket and HMAC key", func() { + vault := &files.InstallVault{} + icg.EXPECT().GetVault().Return(vault) + + gc.EXPECT().EnsureStorageBucket("pid", "pid-openfga-backup", "us-central1").Return(nil) + gc.EXPECT().CreateHMACKey("pid", "openfga-backup@pid.iam.gserviceaccount.com").Return("access-id", "secret-key", nil) + + err := bs.EnsureOpenfgaBackupBucket() + Expect(err).NotTo(HaveOccurred()) + Expect(bs.Env.OpenfgaBackupBucket).To(Equal("pid-openfga-backup")) + Expect(bs.Env.OpenfgaBackupAccessKeyID).To(Equal("access-id")) + Expect(bs.Env.OpenfgaBackupSecret).To(Equal("secret-key")) + }) + + It("does not create a new HMAC key when a real secret already exists", func() { + vault := &files.InstallVault{ + Secrets: []files.SecretEntry{ + {Name: files.SecretOpenfgaDbBackupSecretAccessKey, Fields: &files.SecretFields{Password: "existing-secret"}}, + }, + } + icg.EXPECT().GetVault().Return(vault) + + gc.EXPECT().EnsureStorageBucket("pid", "pid-openfga-backup", "us-central1").Return(nil) + // CreateHMACKey must not be called. + + err := bs.EnsureOpenfgaBackupBucket() + Expect(err).NotTo(HaveOccurred()) + Expect(bs.Env.OpenfgaBackupBucket).To(Equal("pid-openfga-backup")) + Expect(bs.Env.OpenfgaBackupAccessKeyID).To(BeEmpty()) + }) + + It("returns an error when bucket creation fails", func() { + gc.EXPECT().EnsureStorageBucket("pid", "pid-openfga-backup", "us-central1").Return(fmt.Errorf("bucket error")) + + err := bs.EnsureOpenfgaBackupBucket() + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("failed to ensure openfga backup bucket")) + }) + }) + Describe("UpdateInstallConfig", func() { var vault *files.InstallVault @@ -331,6 +372,9 @@ var _ = Describe("Installconfig & Secrets", func() { err := bs.UpdateInstallConfig() Expect(err).NotTo(HaveOccurred()) + // No openfga backup bucket provisioned → config stays unset. + Expect(bs.Env.InstallConfig.Codesphere.OpenfgaBackups).To(BeNil()) + applications := bs.Env.InstallConfig.PcApps["applications"].(map[string]interface{}) sshProxy := applications["ssh-workspace-proxy"].(map[string]interface{}) Expect(sshProxy["enabled"]).To(Equal(true)) @@ -386,6 +430,33 @@ var _ = Describe("Installconfig & Secrets", func() { Expect(bs.Env.InstallConfig.Datacenter.Name).To(Equal("staging")) }) + It("wires the openfga backup config and secrets when a bucket was provisioned", func() { + csEnv.OpenfgaBackupBucket = "pid-openfga-backup" + csEnv.OpenfgaBackupAccessKeyID = "access-id" + csEnv.OpenfgaBackupSecret = "secret-key" + + icg.EXPECT().GenerateSecrets().Return(nil) + icg.EXPECT().WriteInstallConfig("fake-config-file", true).Return(nil) + icg.EXPECT().WriteVault("fake-secret", true).Return(nil) + + nodeClient.EXPECT().CopyFile(mock.Anything, mock.Anything, mock.Anything).Return(nil).Twice() + + err := bs.UpdateInstallConfig() + Expect(err).NotTo(HaveOccurred()) + + ob := bs.Env.InstallConfig.Codesphere.OpenfgaBackups + Expect(ob).NotTo(BeNil()) + Expect(ob.Enabled).To(BeTrue()) + Expect(ob.DestinationPath).To(Equal("s3://pid-openfga-backup")) + Expect(ob.EndpointURL).To(Equal("https://storage.googleapis.com")) + + accessKey := vault.GetSecret(files.SecretOpenfgaDbBackupAccessKeyId) + Expect(accessKey).NotTo(BeNil()) + Expect(accessKey.Fields.Password).To(Equal("access-id")) + secretKey := vault.GetSecret(files.SecretOpenfgaDbBackupSecretAccessKey) + Expect(secretKey).NotTo(BeNil()) + Expect(secretKey.Fields.Password).To(Equal("secret-key")) + }) Context("When internal flags are set in CodesphereEnvironment", func() { BeforeEach(func() { csEnv.InternalFlags = []string{"fake-exp1", "fake-exp2"} diff --git a/internal/bootstrap/gcp/mocks.go b/internal/bootstrap/gcp/mocks.go index 5b3713253..7fff6c97f 100644 --- a/internal/bootstrap/gcp/mocks.go +++ b/internal/bootstrap/gcp/mocks.go @@ -312,6 +312,78 @@ func (_c *MockGCPClientManager_CreateFirewallRule_Call) RunAndReturn(run func(pr return _c } +// CreateHMACKey provides a mock function for the type MockGCPClientManager +func (_mock *MockGCPClientManager) CreateHMACKey(projectID string, serviceAccountEmail string) (string, string, error) { + ret := _mock.Called(projectID, serviceAccountEmail) + + if len(ret) == 0 { + panic("no return value specified for CreateHMACKey") + } + + var r0 string + var r1 string + var r2 error + if returnFunc, ok := ret.Get(0).(func(string, string) (string, string, error)); ok { + return returnFunc(projectID, serviceAccountEmail) + } + if returnFunc, ok := ret.Get(0).(func(string, string) string); ok { + r0 = returnFunc(projectID, serviceAccountEmail) + } else { + r0 = ret.Get(0).(string) + } + if returnFunc, ok := ret.Get(1).(func(string, string) string); ok { + r1 = returnFunc(projectID, serviceAccountEmail) + } else { + r1 = ret.Get(1).(string) + } + if returnFunc, ok := ret.Get(2).(func(string, string) error); ok { + r2 = returnFunc(projectID, serviceAccountEmail) + } else { + r2 = ret.Error(2) + } + return r0, r1, r2 +} + +// MockGCPClientManager_CreateHMACKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateHMACKey' +type MockGCPClientManager_CreateHMACKey_Call struct { + *mock.Call +} + +// CreateHMACKey is a helper method to define mock.On call +// - projectID string +// - serviceAccountEmail string +func (_e *MockGCPClientManager_Expecter) CreateHMACKey(projectID any, serviceAccountEmail any) *MockGCPClientManager_CreateHMACKey_Call { + return &MockGCPClientManager_CreateHMACKey_Call{Call: _e.mock.On("CreateHMACKey", projectID, serviceAccountEmail)} +} + +func (_c *MockGCPClientManager_CreateHMACKey_Call) Run(run func(projectID string, serviceAccountEmail string)) *MockGCPClientManager_CreateHMACKey_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockGCPClientManager_CreateHMACKey_Call) Return(accessID string, secret string, err error) *MockGCPClientManager_CreateHMACKey_Call { + _c.Call.Return(accessID, secret, err) + return _c +} + +func (_c *MockGCPClientManager_CreateHMACKey_Call) RunAndReturn(run func(projectID string, serviceAccountEmail string) (string, string, error)) *MockGCPClientManager_CreateHMACKey_Call { + _c.Call.Return(run) + return _c +} + // CreateInstance provides a mock function for the type MockGCPClientManager func (_mock *MockGCPClientManager) CreateInstance(projectID string, zone string, instance *computepb.Instance) error { ret := _mock.Called(projectID, zone, instance) @@ -1155,6 +1227,69 @@ func (_c *MockGCPClientManager_EnsureDNSRecordSets_Call) RunAndReturn(run func(p return _c } +// EnsureStorageBucket provides a mock function for the type MockGCPClientManager +func (_mock *MockGCPClientManager) EnsureStorageBucket(projectID string, bucketName string, location string) error { + ret := _mock.Called(projectID, bucketName, location) + + if len(ret) == 0 { + panic("no return value specified for EnsureStorageBucket") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(string, string, string) error); ok { + r0 = returnFunc(projectID, bucketName, location) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// MockGCPClientManager_EnsureStorageBucket_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnsureStorageBucket' +type MockGCPClientManager_EnsureStorageBucket_Call struct { + *mock.Call +} + +// EnsureStorageBucket is a helper method to define mock.On call +// - projectID string +// - bucketName string +// - location string +func (_e *MockGCPClientManager_Expecter) EnsureStorageBucket(projectID any, bucketName any, location any) *MockGCPClientManager_EnsureStorageBucket_Call { + return &MockGCPClientManager_EnsureStorageBucket_Call{Call: _e.mock.On("EnsureStorageBucket", projectID, bucketName, location)} +} + +func (_c *MockGCPClientManager_EnsureStorageBucket_Call) Run(run func(projectID string, bucketName string, location string)) *MockGCPClientManager_EnsureStorageBucket_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 string + if args[0] != nil { + arg0 = args[0].(string) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + run( + arg0, + arg1, + arg2, + ) + }) + return _c +} + +func (_c *MockGCPClientManager_EnsureStorageBucket_Call) Return(err error) *MockGCPClientManager_EnsureStorageBucket_Call { + _c.Call.Return(err) + return _c +} + +func (_c *MockGCPClientManager_EnsureStorageBucket_Call) RunAndReturn(run func(projectID string, bucketName string, location string) error) *MockGCPClientManager_EnsureStorageBucket_Call { + _c.Call.Return(run) + return _c +} + // GetAddress provides a mock function for the type MockGCPClientManager func (_mock *MockGCPClientManager) GetAddress(projectID string, region string, addressName string) (*computepb.Address, error) { ret := _mock.Called(projectID, region, addressName) From 4a97a608d1610a0d9976ed8cb96be72656e41cc0 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 11 Sep 2026 15:02:39 +0000 Subject: [PATCH 117/132] update(deps): update github.com/rook/rook/pkg/apis digest to 0d8ce7f (#802) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `ed913a8` → `0d8ce7f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index c2d82d347..0478035b4 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260910220229-ed913a842168 +Version: v0.0.0-20260911131139-0d8ce7f71e86 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/ed913a842168/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0d8ce7f71e86/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 6efe0d1c9..af242a92a 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168 + github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index a3c87df88..1d94b3f89 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168 h1:T+A6213qHduEYc/FRRQcTvfFphF7pQlRNaZ52RYNCcw= -github.com/rook/rook/pkg/apis v0.0.0-20260910220229-ed913a842168/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86 h1:J/pyOaZfDVJjPvQgdwu3TAF6VkmVXE+XPx9TgoPIkGU= +github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index c2d82d347..0478035b4 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260910220229-ed913a842168 +Version: v0.0.0-20260911131139-0d8ce7f71e86 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/ed913a842168/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/0d8ce7f71e86/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From a2525004630417354906edcb890b2c4f5004cfce Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Fri, 11 Sep 2026 21:04:17 +0000 Subject: [PATCH 118/132] update(deps): update github.com/rook/rook/pkg/apis digest to 389aab9 (#803) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `0d8ce7f` → `389aab9` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 0478035b4..ce6e24ce6 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260911131139-0d8ce7f71e86 +Version: v0.0.0-20260911192543-389aab9ba407 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0d8ce7f71e86/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/389aab9ba407/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index af242a92a..ca62ab2c5 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86 + github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 1d94b3f89..089acadaa 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86 h1:J/pyOaZfDVJjPvQgdwu3TAF6VkmVXE+XPx9TgoPIkGU= -github.com/rook/rook/pkg/apis v0.0.0-20260911131139-0d8ce7f71e86/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407 h1:FuteUM/DmT3phO2K55uuL0SABMGHkYIe4yHtf9Jh7bg= +github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 0478035b4..ce6e24ce6 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260911131139-0d8ce7f71e86 +Version: v0.0.0-20260911192543-389aab9ba407 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/0d8ce7f71e86/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/389aab9ba407/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From bc057619a2fb73ce047e4c97573af50e30c41505 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 09:04:42 +0000 Subject: [PATCH 119/132] update(deps): update module github.com/argoproj/argo-cd/v3 to v3.5.3 (#804) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/argoproj/argo-cd/v3](https://redirect.github.com/argoproj/argo-cd) | `v3.5.2` → `v3.5.3` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fargoproj%2fargo-cd%2fv3/v3.5.2/v3.5.3?slim=true) | --- ### Release Notes
argoproj/argo-cd (github.com/argoproj/argo-cd/v3) ### [`v3.5.3`](https://redirect.github.com/argoproj/argo-cd/releases/tag/v3.5.3) [Compare Source](https://redirect.github.com/argoproj/argo-cd/compare/v3.5.2...v3.5.3) #### Quick Start ##### Non-HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.3/manifests/install.yaml ``` ##### HA: ```shell kubectl create namespace argocd kubectl apply -n argocd --server-side --force-conflicts -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.3/manifests/ha/install.yaml ``` #### Release Signatures and Provenance All Argo CD container images are signed by cosign. A Provenance is generated for container images and CLI binaries which meet the SLSA Level 3 specifications. See the [documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/signed-release-assets) on how to verify. #### Release Notes Blog Post For a detailed breakdown of the key changes and improvements in this release, check out the [official blog post](https://blog.argoproj.io/argo-cd-v3-0-release-candidate-a0b933f4e58f) #### Upgrading If upgrading from a different minor version, be sure to read the [upgrading](https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/overview/) documentation. #### Changelog ##### Bug fixes - [`c198be7`](https://redirect.github.com/argoproj/argo-cd/commit/c198be7e7a00f6e643180c0f9b762f768fefcbb1): fix(health): a KubeVirt VirtualMachine declared stopped is Healthy (cherry-pick [#​29664](https://redirect.github.com/argoproj/argo-cd/issues/29664) for 3.5) ([#​29665](https://redirect.github.com/argoproj/argo-cd/issues/29665)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`4b3f69d`](https://redirect.github.com/argoproj/argo-cd/commit/4b3f69d204d25aeaf9056bc37c3e4d44f198570c): fix(health): report suspended FlinkDeployment as healthy ([#​26818](https://redirect.github.com/argoproj/argo-cd/issues/26818)) (cherry-pick [#​28995](https://redirect.github.com/argoproj/argo-cd/issues/28995) for 3.5) ([#​29525](https://redirect.github.com/argoproj/argo-cd/issues/29525)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`dd2cb1a`](https://redirect.github.com/argoproj/argo-cd/commit/dd2cb1aaf12ef19a2bab816fbaecced6422cad7c): fix(repository): clean repository on revision change (cherry-pick [#​28771](https://redirect.github.com/argoproj/argo-cd/issues/28771) for 3.5) ([#​29486](https://redirect.github.com/argoproj/argo-cd/issues/29486)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`70b399c`](https://redirect.github.com/argoproj/argo-cd/commit/70b399c5a8335cd3abb0bf132d63129733a5e3a0): fix(resource\_customizations): Crossplane MRs should report Progressing (not Healthy) whilst provisioning \[ISSUE: [#​29381](https://redirect.github.com/argoproj/argo-cd/issues/29381)] (cherry-pick [#​29382](https://redirect.github.com/argoproj/argo-cd/issues/29382) for 3.5) ([#​29520](https://redirect.github.com/argoproj/argo-cd/issues/29520)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`be8b387`](https://redirect.github.com/argoproj/argo-cd/commit/be8b3873521671e3f9418c6e3019f12a472ac3c1): fix(sync): correctly set operationState values on retry ([#​26530](https://redirect.github.com/argoproj/argo-cd/issues/26530)) (cherry-pick [#​28778](https://redirect.github.com/argoproj/argo-cd/issues/28778) for 3.5) ([#​29431](https://redirect.github.com/argoproj/argo-cd/issues/29431)) ([@​omkar619-dev](https://redirect.github.com/omkar619-dev)) - [`a5e5992`](https://redirect.github.com/argoproj/argo-cd/commit/a5e5992f62561d112a6d6a715e6631e3b6817671): fix(ui): guard SSO redirect to stop 401 retry loop (cherry-pick [#​28807](https://redirect.github.com/argoproj/argo-cd/issues/28807) for 3.5) ([#​29631](https://redirect.github.com/argoproj/argo-cd/issues/29631)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`0b0890e`](https://redirect.github.com/argoproj/argo-cd/commit/0b0890e0c79d2e2c7f8bf33736cde2772024e2b3): fix(ui): use hydrateTo branch name when set (cherry-pick [#​29562](https://redirect.github.com/argoproj/argo-cd/issues/29562) for 3.5) ([#​29564](https://redirect.github.com/argoproj/argo-cd/issues/29564)) ([@​crenshaw-dev](https://redirect.github.com/crenshaw-dev)) - [`18f0566`](https://redirect.github.com/argoproj/argo-cd/commit/18f0566fb550b1d10d9fb55a72fa887a530eca42): fix: GRPCRoute health check ignores stale observedGeneration conditions ([#​28086](https://redirect.github.com/argoproj/argo-cd/issues/28086)) (cherry-pick [#​28087](https://redirect.github.com/argoproj/argo-cd/issues/28087) for 3.5) ([#​29517](https://redirect.github.com/argoproj/argo-cd/issues/29517)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`4d653a6`](https://redirect.github.com/argoproj/argo-cd/commit/4d653a67174ecacd3a7d17ef5f1c923a48304bd6): fix: handle GrafanaFolder negative-polarity condition ([#​29395](https://redirect.github.com/argoproj/argo-cd/issues/29395)) (cherry-pick [#​29397](https://redirect.github.com/argoproj/argo-cd/issues/29397) for 3.5) ([#​29524](https://redirect.github.com/argoproj/argo-cd/issues/29524)) ([@​argo-cd-cherry-pick-bot](https://redirect.github.com/argo-cd-cherry-pick-bot)\[bot]) - [`ec58520`](https://redirect.github.com/argoproj/argo-cd/commit/ec585202b451045155203736eaa6bca145b19935): fix: recover AuthReconcile visitor panics (cherry-pick [#​29440](https://redirect.github.com/argoproj/argo-cd/issues/29440) for 3.5) ([#​29531](https://redirect.github.com/argoproj/argo-cd/issues/29531)) ([@​Karthik-Chowdary](https://redirect.github.com/Karthik-Chowdary)) **Full Changelog**:
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index ce6e24ce6..312081e46 100644 --- a/NOTICE +++ b/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.2 +Version: v3.5.3 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.2/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.3/LICENSE ---------- Module: github.com/argoproj/pkg/v2 diff --git a/go.mod b/go.mod index ca62ab2c5..731cc0762 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( filippo.io/age v1.3.2 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Masterminds/semver/v3 v3.5.0 - github.com/argoproj/argo-cd/v3 v3.5.2 + github.com/argoproj/argo-cd/v3 v3.5.3 github.com/cloudnative-pg/cloudnative-pg v1.30.0 github.com/codesphere-cloud/cs-go v1.38.0 github.com/creativeprojects/go-selfupdate v1.6.0 diff --git a/go.sum b/go.sum index 089acadaa..1ac38786a 100644 --- a/go.sum +++ b/go.sum @@ -2922,8 +2922,8 @@ github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d h1:/rO/uVUBn8ywSeYGDCXIIpKiCgxZ23+xshH+5UeuLUo= github.com/argoproj/argo-cd/gitops-engine v0.0.0-20260728075051-7660efb23b2d/go.mod h1:RsOM4gdM/lsvAfIuzAhYrnHDTLA1AGooZRzVyxbVT3A= -github.com/argoproj/argo-cd/v3 v3.5.2 h1:vYtfW2pEBSL+smt8XdpVZHUg31uERINYH6eXzdiLCY4= -github.com/argoproj/argo-cd/v3 v3.5.2/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= +github.com/argoproj/argo-cd/v3 v3.5.3 h1:klbUb5LOK+oJSBkR0OYGlLkG9IpsPVtSR2idOdaQb2I= +github.com/argoproj/argo-cd/v3 v3.5.3/go.mod h1:/248vUTcQHNW3fYkaSUc0PkCFA/+mnILl5b6rv+xG6Y= github.com/argoproj/pkg/v2 v2.0.1 h1:O/gCETzB/3+/hyFL/7d/VM/6pSOIRWIiBOTb2xqAHvc= github.com/argoproj/pkg/v2 v2.0.1/go.mod h1:sdifF6sUTx9ifs38ZaiNMRJuMpSCBB9GulHfbPgQeRE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index ce6e24ce6..312081e46 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -167,9 +167,9 @@ License URL: https://github.com/argoproj/argo-cd/blob/7660efb23b2d/gitops-engine ---------- Module: github.com/argoproj/argo-cd/v3 -Version: v3.5.2 +Version: v3.5.3 License: Apache-2.0 -License URL: https://github.com/argoproj/argo-cd/blob/v3.5.2/LICENSE +License URL: https://github.com/argoproj/argo-cd/blob/v3.5.3/LICENSE ---------- Module: github.com/argoproj/pkg/v2 From 85988eb147f9775f3d36582e4b7b6896bc24a103 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:04:26 +0000 Subject: [PATCH 120/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.39.0 (#805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.38.0` → `v1.39.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.39.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.38.0/v1.39.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.39.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.39.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.38.0...v1.39.0) #### Changelog - [`4ef0cfd`](https://redirect.github.com/codesphere-cloud/cs-go/commit/4ef0cfdce64bc39fbdff4d72803e401965a10fde) update(deps): update module github.com/modelcontextprotocol/go-sdk to v1.8.0 ([#​325](https://redirect.github.com/codesphere-cloud/cs-go/issues/325)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 312081e46..5ae31c3fd 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.38.0 +Version: v1.39.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.38.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.39.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 731cc0762..4d0c6cb03 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.3 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.38.0 + github.com/codesphere-cloud/cs-go v1.39.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 1ac38786a..e807fc297 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.38.0 h1:Gz4ZvrFEFaq1pgDtKlurrwS7sT+6YOvW6j/Qdb7WNkg= -github.com/codesphere-cloud/cs-go v1.38.0/go.mod h1:dMnWh66Zbqe35PHFNJpK4x39X9+/MggHvf3tv9nAZ74= +github.com/codesphere-cloud/cs-go v1.39.0 h1:7cBnxKQ85amvIPnSZjli8Y53P5cQQ5DCnMca1nCwWlA= +github.com/codesphere-cloud/cs-go v1.39.0/go.mod h1:VECPTmsBfJkRIihwJaw3KFc9GbdaQkUWCXpnMMpl42U= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 312081e46..5ae31c3fd 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.38.0 +Version: v1.39.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.38.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.39.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 2b69246b55182662ccff49e45742aa9ad8053a2b Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:05:50 +0200 Subject: [PATCH 121/132] feat: implement email validation and enhance API key registration error handling (#798) This pull request introduces stricter validation for API key registration by requiring the `owner` field to be a valid email address. It adds a reusable email validation utility, improves error reporting for OMS-Portal HTTP responses, and updates related tests to ensure correct behavior. [Clickup](https://app.clickup.com/t/24560134/869e927k7) --------- Signed-off-by: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> --- Makefile | 2 +- cli/cmd/apikey/api_key_integration_test.go | 4 +-- cli/cmd/apikey/apikey_suite_test.go | 16 ++++++++++++ cli/cmd/apikey/register.go | 6 ++++- cli/cmd/apikey/register_test.go | 11 +++++++- docs/oms_register.md | 2 +- internal/portal/portal.go | 25 +++++++++--------- internal/portal/portal_test.go | 12 ++++++--- internal/util/email.go | 18 +++++++++++++ internal/util/email_test.go | 30 ++++++++++++++++++++++ 10 files changed, 103 insertions(+), 23 deletions(-) create mode 100644 cli/cmd/apikey/apikey_suite_test.go create mode 100644 internal/util/email.go create mode 100644 internal/util/email_test.go diff --git a/Makefile b/Makefile index c74ed3210..f0a1c2c5a 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ test: # -count=1 to disable caching test results go test -count=1 -v ./... -test-integration: +test-integration: build-cli # Run integration tests with build tag go test -count=1 -v -tags=integration ./cli/... diff --git a/cli/cmd/apikey/api_key_integration_test.go b/cli/cmd/apikey/api_key_integration_test.go index d8a0671fd..dca24ed57 100644 --- a/cli/cmd/apikey/api_key_integration_test.go +++ b/cli/cmd/apikey/api_key_integration_test.go @@ -239,7 +239,7 @@ var _ = Describe("API Key Integration Tests", func() { Describe("Old API Key Detection and Warning", func() { var ( - cliPath = "../../oms" + cliPath = "../../../oms" ) Context("when using a 25-character old API key format", func() { @@ -318,7 +318,7 @@ var _ = Describe("API Key Integration Tests", func() { Describe("PreRun Hook Execution", func() { var ( - cliPath = "../../oms" + cliPath = "../../../oms" ) Context("when running any OMS command", func() { diff --git a/cli/cmd/apikey/apikey_suite_test.go b/cli/cmd/apikey/apikey_suite_test.go new file mode 100644 index 000000000..b8ee534f4 --- /dev/null +++ b/cli/cmd/apikey/apikey_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package apikey_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestApiKey(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "ApiKey Suite") +} diff --git a/cli/cmd/apikey/register.go b/cli/cmd/apikey/register.go index d79633fb6..2edcac3e7 100644 --- a/cli/cmd/apikey/register.go +++ b/cli/cmd/apikey/register.go @@ -57,7 +57,7 @@ func AddRegisterCmd(list *cobra.Command, opts *util.GlobalOptions) { }, Opts: RegisterOpts{GlobalOptions: opts}, } - c.cmd.Flags().StringVarP(&c.Opts.Owner, "owner", "o", "", "Owner of the new API key") + c.cmd.Flags().StringVarP(&c.Opts.Owner, "owner", "o", "", "Owner of the new API key (must be a valid email address)") c.cmd.Flags().StringVarP(&c.Opts.Organization, "organization", "g", "", "Organization of the new API key") c.cmd.Flags().StringVarP(&c.Opts.Role, "role", "r", "Ext", "Role of the new API key. Available roles: Admin, Dev, Ext") c.cmd.Flags().StringVar(&c.Opts.ValidFor, "valid-for", "", "Validity duration of the new API key in days (e.g., 10d)") @@ -72,6 +72,10 @@ func (c *RegisterCmd) Register(p portal.Portal) (*portal.ApiKey, error) { return nil, fmt.Errorf("invalid role: %s. Available roles are: Admin, Dev, Ext", c.Opts.Role) } + if err := intutil.ValidateEmail(c.Opts.Owner); err != nil { + return nil, fmt.Errorf("invalid owner: %w", err) + } + var expiresAt time.Time if c.Opts.ValidFor != "" { validForDuration, err := intutil.GetDurationFromString(c.Opts.ValidFor) diff --git a/cli/cmd/apikey/register_test.go b/cli/cmd/apikey/register_test.go index 60effb6d7..122693934 100644 --- a/cli/cmd/apikey/register_test.go +++ b/cli/cmd/apikey/register_test.go @@ -30,7 +30,7 @@ var _ = Describe("RegisterCmd", func() { BeforeEach(func() { mockPortal = portal.NewMockPortal(GinkgoT()) validFor = "10d" - owner = "test-owner" + owner = "test-owner@example.com" organization = "test-org" role = apikey.API_KEY_ROLE_ADMIN c = apikey.RegisterCmd{ @@ -126,6 +126,15 @@ var _ = Describe("RegisterCmd", func() { Expect(err).To(MatchError(ContainSubstring("invalid role: InvalidRole"))) }) }) + + Context("when owner is not a valid email address", func() { + It("returns error for invalid owner", func() { + c.Opts.Owner = "not-an-email" + ak, err := c.Register(mockPortal) + Expect(ak).To(BeNil()) + Expect(err).To(MatchError(ContainSubstring("invalid owner"))) + }) + }) }) var _ = Describe("AddRegisterCmd", func() { diff --git a/docs/oms_register.md b/docs/oms_register.md index cee9489be..cd5c7cb0d 100644 --- a/docs/oms_register.md +++ b/docs/oms_register.md @@ -15,7 +15,7 @@ oms register [flags] ``` -h, --help help for register -g, --organization string Organization of the new API key - -o, --owner string Owner of the new API key + -o, --owner string Owner of the new API key (must be a valid email address) -r, --role string Role of the new API key. Available roles: Admin, Dev, Ext (default "Ext") --valid-for string Validity duration of the new API key in days (e.g., 10d) ``` diff --git a/internal/portal/portal.go b/internal/portal/portal.go index 7b337e7d6..0947e024b 100644 --- a/internal/portal/portal.go +++ b/internal/portal/portal.go @@ -95,25 +95,24 @@ func (c *PortalClient) isOKResponseStatus(resp *http.Response) error { } if resp.StatusCode >= 300 { - log.Printf("Non-2xx response received from OMS-Portal (%s) - Status: %d", c.Env.GetOmsPortalApi(), resp.StatusCode) + var respBody string + if resp.Body != nil { + body, _ := io.ReadAll(resp.Body) + respBody = strings.TrimSpace(string(body)) + } - healthErr := c.GetHealth() - if healthErr != nil { - healthErr = fmt.Errorf("OMS-Portal healthcheck failed: %w", healthErr) - log.Println(healthErr.Error()) - log.Println("Please check if the OMS-Portal URL is correct and instance is healthy and reachable at:", c.Env.GetOmsPortalApi()) + log.Printf("Non-2xx response received from OMS-Portal (%s) - Status: %d, Body: %s", c.Env.GetOmsPortalApi(), resp.StatusCode, respBody) - return healthErr + if healthErr := c.GetHealth(); healthErr != nil { + log.Printf("OMS-Portal healthcheck also failed: %s", healthErr) + log.Println("Please check if the OMS-Portal URL is correct and instance is healthy and reachable at:", c.Env.GetOmsPortalApi()) } - healthyPortalLog := fmt.Sprintf("OMS-Portal is healthy and reachable, but returned an error response - Status: %d", resp.StatusCode) - if resp.Body != nil { - respBody, _ := io.ReadAll(resp.Body) - healthyPortalLog = fmt.Sprintf("%s, Body: %s", healthyPortalLog, string(respBody)) + if respBody == "" { + return fmt.Errorf("OMS-Portal returned status %d with an empty response body", resp.StatusCode) } - log.Println(healthyPortalLog) - return fmt.Errorf("%s", healthyPortalLog) + return fmt.Errorf("OMS-Portal returned status %d: %s", resp.StatusCode, respBody) } return nil diff --git a/internal/portal/portal_test.go b/internal/portal/portal_test.go index 8797da67a..ef51e5e6d 100644 --- a/internal/portal/portal_test.go +++ b/internal/portal/portal_test.go @@ -121,7 +121,7 @@ var _ = Describe("PortalClient", func() { }) Context("OMS-Portal Health Check is OK", func() { - It("returns no response and an error showing portal is healthy", func() { + It("returns no response and an error containing the response body", func() { mockHttpClient.EXPECT().Do(mock.Anything).RunAndReturn( func(req *http.Request) (*http.Response, error) { if strings.Contains(req.URL.Path, "health") { @@ -135,6 +135,7 @@ var _ = Describe("PortalClient", func() { return &http.Response{ StatusCode: http.StatusNotFound, + Body: io.NopCloser(strings.NewReader("owner must be a valid email address")), }, nil }) @@ -143,17 +144,19 @@ var _ = Describe("PortalClient", func() { resp, err := client.AuthorizedHttpRequest(testRequest) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("OMS-Portal is healthy and reachable, but returned an error response")) + Expect(err.Error()).To(ContainSubstring("OMS-Portal returned status 404")) + Expect(err.Error()).To(ContainSubstring("owner must be a valid email address")) Expect(resp).To(BeNil()) }) }) Context("OMS-Portal Health Check is not OK", func() { - It("returns no response and an error showing portal is unhealthy", func() { + It("still returns the response body from the original request", func() { mockHttpClient.EXPECT().Do(mock.Anything).RunAndReturn( func(req *http.Request) (*http.Response, error) { return &http.Response{ StatusCode: http.StatusNotFound, + Body: io.NopCloser(strings.NewReader("owner must be a valid email address")), }, nil }) @@ -162,7 +165,8 @@ var _ = Describe("PortalClient", func() { resp, err := client.AuthorizedHttpRequest(testRequest) Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("OMS-Portal healthcheck failed")) + Expect(err.Error()).To(ContainSubstring("OMS-Portal returned status 404")) + Expect(err.Error()).To(ContainSubstring("owner must be a valid email address")) Expect(resp).To(BeNil()) }) }) diff --git a/internal/util/email.go b/internal/util/email.go new file mode 100644 index 000000000..3ec34317d --- /dev/null +++ b/internal/util/email.go @@ -0,0 +1,18 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package util + +import ( + "fmt" + "net/mail" +) + +// ValidateEmail checks that the given string is a syntactically valid email address. +func ValidateEmail(email string) error { + if _, err := mail.ParseAddress(email); err != nil { + return fmt.Errorf("expected a valid email address, got %q", email) + } + + return nil +} diff --git a/internal/util/email_test.go b/internal/util/email_test.go new file mode 100644 index 000000000..a95693b95 --- /dev/null +++ b/internal/util/email_test.go @@ -0,0 +1,30 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package util_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/util" +) + +var _ = Describe("ValidateEmail", func() { + It("accepts a valid email address", func() { + err := util.ValidateEmail("jane.doe@example.com") + Expect(err).NotTo(HaveOccurred()) + }) + + It("returns error for a plain string", func() { + err := util.ValidateEmail("test") + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("expected a valid email address")) + }) + + It("returns error for an empty string", func() { + err := util.ValidateEmail("") + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("expected a valid email address")) + }) +}) From 9eba02f788e8915c91324b109f30e17949199c4e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:03:12 +0000 Subject: [PATCH 122/132] update(deps): update github.com/rook/rook/pkg/apis digest to 7399b15 (#806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `389aab9` → `7399b15` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 5ae31c3fd..ebf8ae497 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260911192543-389aab9ba407 +Version: v0.0.0-20260914134705-7399b159a5a7 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/389aab9ba407/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7399b159a5a7/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 4d0c6cb03..7dd8e98d9 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407 + github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index e807fc297..66cba95d1 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407 h1:FuteUM/DmT3phO2K55uuL0SABMGHkYIe4yHtf9Jh7bg= -github.com/rook/rook/pkg/apis v0.0.0-20260911192543-389aab9ba407/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7 h1:3pC2bc95e4dq9sP6IacHqEQLYag7F+NP0v8pk7lxSwg= +github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 5ae31c3fd..ebf8ae497 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260911192543-389aab9ba407 +Version: v0.0.0-20260914134705-7399b159a5a7 License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/389aab9ba407/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7399b159a5a7/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 5833c743e2d4cf89a21896be7ab54bc1f9854a97 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:03:35 +0000 Subject: [PATCH 123/132] update(deps): update module google.golang.org/api to v0.298.0 (#807) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [google.golang.org/api](https://redirect.github.com/googleapis/google-api-go-client) | `v0.297.0` → `v0.298.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/google.golang.org%2fapi/v0.298.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/google.golang.org%2fapi/v0.297.0/v0.298.0?slim=true) | --- ### Release Notes
googleapis/google-api-go-client (google.golang.org/api) ### [`v0.298.0`](https://redirect.github.com/googleapis/google-api-go-client/releases/tag/v0.298.0) [Compare Source](https://redirect.github.com/googleapis/google-api-go-client/compare/v0.297.0...v0.298.0) ##### Features - **all:** Auto-regenerate discovery clients ([#​3723](https://redirect.github.com/googleapis/google-api-go-client/issues/3723)) ([3dd4e89](https://redirect.github.com/googleapis/google-api-go-client/commit/3dd4e89964c8f8cce511d42e25f92ef1e2ecd266)) - **all:** Auto-regenerate discovery clients ([#​3730](https://redirect.github.com/googleapis/google-api-go-client/issues/3730)) ([df333cb](https://redirect.github.com/googleapis/google-api-go-client/commit/df333cb10bdde82e777dc7505d404dc9c9877175)) - **all:** Auto-regenerate discovery clients ([#​3731](https://redirect.github.com/googleapis/google-api-go-client/issues/3731)) ([1f133b3](https://redirect.github.com/googleapis/google-api-go-client/commit/1f133b3f364a47ae1f39a24e60a810710612a251)) - **all:** Auto-regenerate discovery clients ([#​3732](https://redirect.github.com/googleapis/google-api-go-client/issues/3732)) ([1e76b30](https://redirect.github.com/googleapis/google-api-go-client/commit/1e76b3027124a34f1fd530134e6b3535e9de6319))
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 8 ++++---- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/NOTICE b/NOTICE index ebf8ae497..524c49c73 100644 --- a/NOTICE +++ b/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.297.0 +Version: v0.298.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.298.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.297.0 +Version: v0.298.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.298.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis diff --git a/go.mod b/go.mod index 7dd8e98d9..23ae46d0d 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/mod v0.41.0 golang.org/x/oauth2 v0.37.0 golang.org/x/term v0.46.0 - google.golang.org/api v0.297.0 + google.golang.org/api v0.298.0 google.golang.org/grpc v1.83.2 google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 66cba95d1..ffecf43ec 100644 --- a/go.sum +++ b/go.sum @@ -6261,8 +6261,8 @@ google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1Gk google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/api v0.297.0 h1:WktxTsnnx0yZNnsR6j0q6hR21RnnK81FHTOPy/ux4OE= -google.golang.org/api v0.297.0/go.mod h1:S4m8x0M6OkQpkOzGk1y9JG2sm4fFQrMh6dxzjCTszhE= +google.golang.org/api v0.298.0 h1:YW18RkHBMZBA1ergX0m4biagzgbiPTb2uTsRsDPWNRY= +google.golang.org/api v0.298.0/go.mod h1:02qB8+Ox1ZFzcaKFMguy1nQLJmSIyvV6Ff4txJEXtl4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index ebf8ae497..524c49c73 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1511,15 +1511,15 @@ License URL: https://github.com/gomodules/jsonpatch/blob/v2.5.0/v2/LICENSE ---------- Module: google.golang.org/api -Version: v0.297.0 +Version: v0.298.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.298.0/LICENSE ---------- Module: google.golang.org/api/internal/third_party/uritemplates -Version: v0.297.0 +Version: v0.298.0 License: BSD-3-Clause -License URL: https://github.com/googleapis/google-api-go-client/blob/v0.297.0/internal/third_party/uritemplates/LICENSE +License URL: https://github.com/googleapis/google-api-go-client/blob/v0.298.0/internal/third_party/uritemplates/LICENSE ---------- Module: google.golang.org/genproto/googleapis From 0c2bef8472b803c75a721a61b11a7f7d74a7b57c Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:02:16 +0000 Subject: [PATCH 124/132] update(deps): update github.com/rook/rook/pkg/apis digest to 219691f (#808) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `7399b15` → `219691f` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 524c49c73..3664dbbcd 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914134705-7399b159a5a7 +Version: v0.0.0-20260914172910-219691f2143a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7399b159a5a7/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/219691f2143a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 23ae46d0d..0f7c364f0 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7 + github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index ffecf43ec..6ea82df00 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7 h1:3pC2bc95e4dq9sP6IacHqEQLYag7F+NP0v8pk7lxSwg= -github.com/rook/rook/pkg/apis v0.0.0-20260914134705-7399b159a5a7/go.mod h1:MKiDH001AeC4cKSQImFGZHIcY0NHXKc1Q26OAp1gS1A= +github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a h1:QvOnPL5IaYZd2utfWMPvcm4H98ucvFbQsppYRBfL3p4= +github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 524c49c73..3664dbbcd 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914134705-7399b159a5a7 +Version: v0.0.0-20260914172910-219691f2143a License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7399b159a5a7/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/219691f2143a/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 2564f8f4662e64b08c7c272f36b4b2725097809a Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 21:03:30 +0000 Subject: [PATCH 125/132] update(deps): update github.com/rook/rook/pkg/apis digest to 7e420ff (#809) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `219691f` → `7e420ff` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 3664dbbcd..f580d3252 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914172910-219691f2143a +Version: v0.0.0-20260914184747-7e420ff151df License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/219691f2143a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7e420ff151df/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 0f7c364f0..b9396323b 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a + github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 6ea82df00..cc4652c7d 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a h1:QvOnPL5IaYZd2utfWMPvcm4H98ucvFbQsppYRBfL3p4= -github.com/rook/rook/pkg/apis v0.0.0-20260914172910-219691f2143a/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= +github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df h1:Uycv3RqcluFEA06MBEhWWEcCY3SgTyEqHcAxGoDfeqM= +github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 3664dbbcd..f580d3252 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914172910-219691f2143a +Version: v0.0.0-20260914184747-7e420ff151df License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/219691f2143a/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/7e420ff151df/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From d9dd119f80a40091262c10317f3b865e489c7d8b Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 00:38:42 +0000 Subject: [PATCH 126/132] update(deps): update github.com/rook/rook/pkg/apis digest to 601689c (#810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `7e420ff` → `601689c` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index f580d3252..1087b1f4c 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914184747-7e420ff151df +Version: v0.0.0-20260914230839-601689c3ceed License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7e420ff151df/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/601689c3ceed/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index b9396323b..24598120f 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df + github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index cc4652c7d..66551bb38 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df h1:Uycv3RqcluFEA06MBEhWWEcCY3SgTyEqHcAxGoDfeqM= -github.com/rook/rook/pkg/apis v0.0.0-20260914184747-7e420ff151df/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= +github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed h1:IHx+Kd5VGllcVKTn6dcUyr0zUBD6gXXCg+IV4AzW7bk= +github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index f580d3252..1087b1f4c 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914184747-7e420ff151df +Version: v0.0.0-20260914230839-601689c3ceed License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/7e420ff151df/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/601689c3ceed/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From ea912dba9dee0c8d30cddc4583319c8287fb119e Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 11:02:49 +0000 Subject: [PATCH 127/132] update(deps): update github.com/rook/rook/pkg/apis digest to fb2d518 (#812) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/rook/rook/pkg/apis](https://redirect.github.com/rook/rook) | require | digest | `601689c` → `fb2d518` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index 1087b1f4c..e96a39d3a 100644 --- a/NOTICE +++ b/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914230839-601689c3ceed +Version: v0.0.0-20260915091545-fb2d518f653f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/601689c3ceed/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/fb2d518f653f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate diff --git a/go.mod b/go.mod index 24598120f..385d4eaf8 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/onsi/ginkgo/v2 v2.32.2 github.com/onsi/gomega v1.43.0 github.com/pkg/sftp v1.13.11 - github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed + github.com/rook/rook/pkg/apis v0.0.0-20260915091545-fb2d518f653f github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 go.yaml.in/yaml/v3 v3.0.5 diff --git a/go.sum b/go.sum index 66551bb38..381c59f6c 100644 --- a/go.sum +++ b/go.sum @@ -4711,8 +4711,8 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= -github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed h1:IHx+Kd5VGllcVKTn6dcUyr0zUBD6gXXCg+IV4AzW7bk= -github.com/rook/rook/pkg/apis v0.0.0-20260914230839-601689c3ceed/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= +github.com/rook/rook/pkg/apis v0.0.0-20260915091545-fb2d518f653f h1:Qanv8Sx7u0ffw1Bpo4db9C662W0cgF1wcYnK4rPRu1Q= +github.com/rook/rook/pkg/apis v0.0.0-20260915091545-fb2d518f653f/go.mod h1:bXat1y3sXuW1IuIWfRrCL5HQqEPgVfUtzIVtEDpxcEo= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937 h1:1TpdIqF9mtQfhNfwOpXdpJTMhx66PonVCCvYcGWvu/I= github.com/rook/secrets v0.0.0-20240315053144-3195f6906937/go.mod h1:jOxzr6jXuSz9UztMhEpcBi1/vPygUA4z9kFuFj+6zd8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index 1087b1f4c..e96a39d3a 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -1181,9 +1181,9 @@ License URL: https://github.com/robfig/cron/blob/bc59245fe10e/LICENSE ---------- Module: github.com/rook/rook/pkg/apis/ceph.rook.io -Version: v0.0.0-20260914230839-601689c3ceed +Version: v0.0.0-20260915091545-fb2d518f653f License: Apache-2.0 -License URL: https://github.com/rook/rook/blob/601689c3ceed/pkg/apis/LICENSE +License URL: https://github.com/rook/rook/blob/fb2d518f653f/pkg/apis/LICENSE ---------- Module: github.com/rubenv/sql-migrate From 42361ccde0b70ae4516f7e5790e7a7bda7979093 Mon Sep 17 00:00:00 2001 From: "codesphere-renovate[bot]" <315425581+codesphere-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 15:03:30 +0000 Subject: [PATCH 128/132] update(deps): update module github.com/codesphere-cloud/cs-go to v1.40.0 (#813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/codesphere-cloud/cs-go](https://redirect.github.com/codesphere-cloud/cs-go) | `v1.39.0` → `v1.40.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fcodesphere-cloud%2fcs-go/v1.40.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fcodesphere-cloud%2fcs-go/v1.39.0/v1.40.0?slim=true) | --- ### Release Notes
codesphere-cloud/cs-go (github.com/codesphere-cloud/cs-go) ### [`v1.40.0`](https://redirect.github.com/codesphere-cloud/cs-go/releases/tag/v1.40.0) [Compare Source](https://redirect.github.com/codesphere-cloud/cs-go/compare/v1.39.0...v1.40.0) #### Changelog - [`7d0be6f`](https://redirect.github.com/codesphere-cloud/cs-go/commit/7d0be6fe95abe9a80a6ca7e072352429e9be4966) feat: first draft codesphere skills ([#​322](https://redirect.github.com/codesphere-cloud/cs-go/issues/322)) *** Released by [GoReleaser](https://redirect.github.com/goreleaser/goreleaser).
--- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://redirect.github.com/renovatebot/renovate). Co-authored-by: codesphere-renovate[bot] <315425581+codesphere-renovate[bot]@users.noreply.github.com> --- NOTICE | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- internal/tmpl/NOTICE | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NOTICE b/NOTICE index e96a39d3a..963b1e832 100644 --- a/NOTICE +++ b/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.39.0 +Version: v1.40.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.39.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.40.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl diff --git a/go.mod b/go.mod index 385d4eaf8..afbcdf3eb 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/Masterminds/semver/v3 v3.5.0 github.com/argoproj/argo-cd/v3 v3.5.3 github.com/cloudnative-pg/cloudnative-pg v1.30.0 - github.com/codesphere-cloud/cs-go v1.39.0 + github.com/codesphere-cloud/cs-go v1.40.0 github.com/creativeprojects/go-selfupdate v1.6.0 github.com/distribution/reference v0.6.0 github.com/getsops/sops/v3 v3.13.3 diff --git a/go.sum b/go.sum index 381c59f6c..754502eaa 100644 --- a/go.sum +++ b/go.sum @@ -3221,8 +3221,8 @@ github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSU github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/codesphere-cloud/cs-go v1.39.0 h1:7cBnxKQ85amvIPnSZjli8Y53P5cQQ5DCnMca1nCwWlA= -github.com/codesphere-cloud/cs-go v1.39.0/go.mod h1:VECPTmsBfJkRIihwJaw3KFc9GbdaQkUWCXpnMMpl42U= +github.com/codesphere-cloud/cs-go v1.40.0 h1:rhEUmUaqgKDTs96pb5vuH6dLHU2I2SQ/ylhNg2i5Few= +github.com/codesphere-cloud/cs-go v1.40.0/go.mod h1:BGqDouinpKU/26ZFo0cH6n5W3MG5YNrOcu+Kstm/j5o= github.com/containerd/continuity v0.5.0 h1:7a85HZpCSs+1Zps0Ee3DPSuAWY+0SJM1JNM51nlEVDg= github.com/containerd/continuity v0.5.0/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= diff --git a/internal/tmpl/NOTICE b/internal/tmpl/NOTICE index e96a39d3a..963b1e832 100644 --- a/internal/tmpl/NOTICE +++ b/internal/tmpl/NOTICE @@ -299,9 +299,9 @@ License URL: https://github.com/cloudnative-pg/machinery/blob/v0.5.0/LICENSE ---------- Module: github.com/codesphere-cloud/cs-go -Version: v1.39.0 +Version: v1.40.0 License: Apache-2.0 -License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.39.0/LICENSE +License URL: https://github.com/codesphere-cloud/cs-go/blob/v1.40.0/LICENSE ---------- Module: github.com/codesphere-cloud/oms/internal/tmpl From 182f1d4e94a6c075796f1512e8c9e068d03268ad Mon Sep 17 00:00:00 2001 From: DerBurri Date: Wed, 12 Aug 2026 14:22:57 +0200 Subject: [PATCH 129/132] first draft --- cli/cmd/codesphere/smoketest_codesphere.go | 12 +- .../codesphere/smoketest_codesphere_test.go | 36 +- cli/cmd/codesphere/status_codesphere.go | 87 +++++ cli/cmd/codesphere/status_report.go | 155 ++++++++ cli/cmd/codesphere/test_codesphere.go | 249 +++++++++++++ cli/cmd/codesphere/test_codesphere_test.go | 144 ++++++++ cli/cmd/root.go | 4 + cli/cmd/status.go | 30 ++ cli/cmd/test.go | 63 ++++ docs/README.md | 2 + internal/codesphere/testplan/testplan.go | 347 ++++++++++++++++++ .../testplan/testplan_suite_test.go | 16 + internal/codesphere/testplan/testplan_test.go | 235 ++++++++++++ 13 files changed, 1359 insertions(+), 21 deletions(-) create mode 100644 cli/cmd/codesphere/status_codesphere.go create mode 100644 cli/cmd/codesphere/status_report.go create mode 100644 cli/cmd/codesphere/test_codesphere.go create mode 100644 cli/cmd/codesphere/test_codesphere_test.go create mode 100644 cli/cmd/status.go create mode 100644 cli/cmd/test.go create mode 100644 internal/codesphere/testplan/testplan.go create mode 100644 internal/codesphere/testplan/testplan_suite_test.go create mode 100644 internal/codesphere/testplan/testplan_test.go diff --git a/cli/cmd/codesphere/smoketest_codesphere.go b/cli/cmd/codesphere/smoketest_codesphere.go index 54425365b..a93b78bbb 100644 --- a/cli/cmd/codesphere/smoketest_codesphere.go +++ b/cli/cmd/codesphere/smoketest_codesphere.go @@ -40,14 +40,15 @@ type SmoketestCodesphereCmd struct { Opts *teststeps.SmoketestCodesphereOpts } -func (c *SmoketestCodesphereCmd) RunE(_ *cobra.Command, args []string) error { +// RunE runs the smoke test against the configured Codesphere installation. +func (c *SmoketestCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) if err != nil { return fmt.Errorf("failed to create Codesphere client: %w", err) } c.Opts.Client = client - return c.RunSmoketest() + return c.RunSmoketest(cmd.Context()) } func AddSmoketestCmd(parent *cobra.Command, opts *util.GlobalOptions) { @@ -113,8 +114,11 @@ func AddSmoketestCmd(parent *cobra.Command, opts *util.GlobalOptions) { util.AddCmd(parent, c.cmd) } -func (c *SmoketestCodesphereCmd) RunSmoketest() (err error) { - ctx, cancel := context.WithTimeout(context.Background(), c.Opts.Timeout) +// RunSmoketest runs the selected smoke test steps. The passed context bounds +// the run in addition to the configured timeout, so callers that orchestrate +// several tests (see the test command) can cancel it. +func (c *SmoketestCodesphereCmd) RunSmoketest(ctx context.Context) (err error) { + ctx, cancel := context.WithTimeout(ctx, c.Opts.Timeout) defer cancel() availableStepsMap := make(map[string]teststeps.SmokeTestStep) diff --git a/cli/cmd/codesphere/smoketest_codesphere_test.go b/cli/cmd/codesphere/smoketest_codesphere_test.go index e740356e2..70bb7a7ab 100644 --- a/cli/cmd/codesphere/smoketest_codesphere_test.go +++ b/cli/cmd/codesphere/smoketest_codesphere_test.go @@ -4,6 +4,7 @@ package codesphere_test import ( + "context" "fmt" "strconv" "strings" @@ -124,7 +125,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { It("returns an error indicating no teams are available", func() { mockClient.EXPECT().ListTeams("").Return([]api.Team{}, nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("no teams available"))) }) }) @@ -138,7 +139,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, 99, 456, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) @@ -152,7 +153,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, 21, 456, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) @@ -164,7 +165,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { It("returns an error indicating no workspace plans are available", func() { mockClient.EXPECT().ListWorkspacePlans().Return([]api.WorkspacePlan{}, nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("no workspace plans available"))) }) }) @@ -176,13 +177,14 @@ var _ = Describe("SmoketestCodesphereCmd", func() { mockFullTestRun(mockClient, teamIdInt, 42, 789) - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) It("completes successfully with all steps", func() { mockFullTestRun(mockClient, teamIdInt, planIdInt, 789) - err := c.RunSmoketest() + + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) @@ -194,7 +196,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { (*string)(nil), // empty workspace ).Return(0, fmt.Errorf("create failed")).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to create workspace"))) }) @@ -218,7 +220,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceID, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to set environment variable"))) }) @@ -248,7 +250,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to create ci.yml"))) }) @@ -291,7 +293,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to sync landscape"))) }) @@ -340,7 +342,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to start pipeline"))) }) @@ -394,7 +396,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("unexpected state"))) }) @@ -448,7 +450,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("unexpected state"))) }) @@ -501,7 +503,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { ).Return(nil).Once() opts.Timeout = 100 * time.Millisecond - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("timed out"))) Expect(err).To(MatchError(ContainSubstring("connection refused"))) }) @@ -558,7 +560,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { ).Return(nil).Once() opts.Timeout = 100 * time.Millisecond - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("timed out"))) }) @@ -614,7 +616,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { workspaceId, ).Return(fmt.Errorf("delete failed")).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(MatchError(ContainSubstring("failed to delete workspace"))) }) @@ -634,7 +636,7 @@ var _ = Describe("SmoketestCodesphereCmd", func() { "smoketest", ).Return(nil).Once() - err := c.RunSmoketest() + err := c.RunSmoketest(context.Background()) Expect(err).To(BeNil()) }) }) diff --git a/cli/cmd/codesphere/status_codesphere.go b/cli/cmd/codesphere/status_codesphere.go new file mode 100644 index 000000000..23e32d9bf --- /dev/null +++ b/cli/cmd/codesphere/status_codesphere.go @@ -0,0 +1,87 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "fmt" + "time" + + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/spf13/cobra" +) + +const ( + defaultStatusTimeout = 5 * time.Minute + statusPollInterval = 5 * time.Second +) + +// StatusCodesphereOpts configures the status report of a Codesphere installation. +type StatusCodesphereOpts struct { + BaseURL string + Token string + Wait bool + Timeout time.Duration + Client codesphere.Client +} + +// StatusCodesphereCmd represents the status codesphere command. +type StatusCodesphereCmd struct { + cmd *cobra.Command + Opts *StatusCodesphereOpts +} + +// RunE prints the status report and fails the command if the installation is not ready. +func (c *StatusCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { + client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) + if err != nil { + return fmt.Errorf("failed to create Codesphere client: %w", err) + } + + c.Opts.Client = client + + report := fetchStatus(cmd.Context(), c.Opts) + printStatus(cmd.OutOrStdout(), c.Opts.BaseURL, report) + + if !report.Ready { + return fmt.Errorf("codesphere installation is not ready") + } + + return nil +} + +// AddStatusCmd adds the status codesphere command to the given parent command. +func AddStatusCmd(parent *cobra.Command, _ *util.GlobalOptions) { + c := StatusCodesphereCmd{ + cmd: &cobra.Command{ + Use: "codesphere", + Short: "Check the status of a Codesphere installation", + Long: csio.Long(`Check whether a Codesphere installation is reachable and ready to use, + by querying the Codesphere API.`), + Example: util.FormatExamples("status codesphere", []csio.Example{ + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN", + Desc: "Check the status of a Codesphere installation", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait", + Desc: "Block and retry until the Codesphere installation is ready", + }, + }), + }, + Opts: &StatusCodesphereOpts{}, + } + c.cmd.Flags().StringVar(&c.Opts.BaseURL, "baseurl", "", "Base URL of the Codesphere API") + c.cmd.Flags().StringVar(&c.Opts.Token, "token", "", "API token for authentication") + c.cmd.Flags().BoolVar(&c.Opts.Wait, "wait", false, "Block and retry until the installation is ready") + c.cmd.Flags().DurationVar(&c.Opts.Timeout, "timeout", defaultStatusTimeout, "Timeout when waiting for the installation to become ready") + + util.MarkFlagRequired(c.cmd, "baseurl") + util.MarkFlagRequired(c.cmd, "token") + + c.cmd.RunE = c.RunE + + util.AddCmd(parent, c.cmd) +} diff --git a/cli/cmd/codesphere/status_report.go b/cli/cmd/codesphere/status_report.go new file mode 100644 index 000000000..5ad8eb580 --- /dev/null +++ b/cli/cmd/codesphere/status_report.go @@ -0,0 +1,155 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "context" + "fmt" + "io" + "net/url" + "strings" + "time" +) + +const ( + ansiReset = "\x1b[0m" + ansiBold = "\x1b[1m" + ansiCyan = "\x1b[36m" + ansiGreen = "\x1b[32m" + ansiRed = "\x1b[31m" +) + +// logo is a small ASCII mark printed next to the status report, neofetch-style. +var logo = []string{ + " ▄▄▄▄▄▄▄▄▄▄▄▄ ", + " ▄█████████████████▄ ", + " ▄███▀▀▀ ▀▀▀███▄ ", + "███ ████", + "██ ▄▄▄▄▄▄▄▄▄ ███", + "██ ███████████ ███", + "██ ███████████ ███", + "██ ▀▀▀▀▀▀▀▀▀ ███", + "████ ████", + " ▀███▄▄▄ ▄▄▄███▀ ", + " ▀██████████████████▀ ", + " ▀▀▀▀▀▀▀▀▀▀▀▀ ", +} + +type statusReport struct { + Ready bool + Latency time.Duration + Teams int + Plans int + Attempts int + Err error +} + +// fetchStatus pings the Codesphere API with a cheap, side-effect-free call +// (ListWorkspacePlans) to determine readiness. With Wait set, it retries on +// failure until the installation becomes ready or opts.Timeout elapses. +func fetchStatus(ctx context.Context, opts *StatusCodesphereOpts) *statusReport { + ctx, cancel := context.WithTimeout(ctx, opts.Timeout) + defer cancel() + + report := &statusReport{} + for { + report.Attempts++ + + start := time.Now() + plans, err := opts.Client.ListWorkspacePlans() + report.Latency = time.Since(start) + + if err == nil { + report.Ready = true + + report.Plans = len(plans) + if teams, terr := opts.Client.ListTeams(""); terr == nil { + report.Teams = len(teams) + } + + return report + } + + report.Err = err + + if !opts.Wait { + return report + } + + select { + case <-ctx.Done(): + return report + case <-time.After(statusPollInterval): + } + } +} + +// printStatus renders a neofetch-style report: a small ASCII logo alongside +// key/value status lines. +func printStatus(w io.Writer, baseURL string, r *statusReport) { + host := baseURL + if u, err := url.Parse(baseURL); err == nil && u.Host != "" { + host = u.Host + } + + statusColor, statusText := ansiGreen, "Ready" + if !r.Ready { + statusColor, statusText = ansiRed, "Not Ready" + } + + header := fmt.Sprintf("%s%scodesphere%s@%s", ansiBold, ansiCyan, ansiReset, host) + rule := strings.Repeat("-", len("codesphere@")+len(host)) + + lines := []string{ + header, + rule, + fmt.Sprintf("%sStatus%s: %s%s%s", ansiBold, ansiReset, statusColor, statusText, ansiReset), + fmt.Sprintf("%sLatency%s: %s", ansiBold, ansiReset, r.Latency.Round(time.Millisecond)), + } + if r.Ready { + lines = append(lines, + fmt.Sprintf("%sTeams%s: %d", ansiBold, ansiReset, r.Teams), + fmt.Sprintf("%sPlans%s: %d", ansiBold, ansiReset, r.Plans), + ) + } else { + lines = append(lines, fmt.Sprintf("%sError%s: %s", ansiBold, ansiReset, r.Err)) + } + + if r.Attempts > 1 { + lines = append(lines, fmt.Sprintf("%sAttempts%s: %d", ansiBold, ansiReset, r.Attempts)) + } + + rows := len(logo) + if len(lines) > rows { + rows = len(lines) + } + + // Pad the logo to a fixed width so the status lines form a straight column. + logoWidth := 0 + for _, l := range logo { + if n := len([]rune(l)); n > logoWidth { + logoWidth = n + } + } + + _, _ = fmt.Fprintln(w) + + for i := 0; i < rows; i++ { + logoLine := "" + if i < len(logo) { + logoLine = logo[i] + } + + logoLine += strings.Repeat(" ", logoWidth-len([]rune(logoLine))) + + statLine := "" + if i < len(lines) { + statLine = lines[i] + } + + _, _ = fmt.Fprintf(w, " %s%s%s %s\n", ansiCyan, logoLine, ansiReset, statLine) + } + + _, _ = fmt.Fprintln(w) +} diff --git a/cli/cmd/codesphere/test_codesphere.go b/cli/cmd/codesphere/test_codesphere.go new file mode 100644 index 000000000..d4394ac59 --- /dev/null +++ b/cli/cmd/codesphere/test_codesphere.go @@ -0,0 +1,249 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere + +import ( + "context" + "fmt" + "io" + "strings" + "time" + + csio "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" + "github.com/codesphere-cloud/oms/internal/codesphere/teststeps" + "github.com/spf13/cobra" +) + +const ( + // defaultTestTimeout bounds the whole playlist, not a single test. + defaultTestTimeout = 20 * time.Minute + // DefaultPlaylist is run when neither --playlist nor --tests is given. + DefaultPlaylist = "default" +) + +// Names of the tests that can be part of a playlist. +const ( + StatusTestName = "status" + SmoketestTestName = "smoketest" +) + +// TestCodesphereOpts configures a test run against a Codesphere installation. +type TestCodesphereOpts struct { + BaseURL string + Token string + TeamID string + PlanID string + Profile string + Playlist string + Tests []string + Wait bool + WaitTimeout time.Duration + Timeout time.Duration + FailFast bool + Quiet bool + Client codesphere.Client +} + +// TestCodesphereCmd represents the test codesphere command. +type TestCodesphereCmd struct { + cmd *cobra.Command + Opts *TestCodesphereOpts +} + +// Registry returns the tests that can run against a Codesphere installation, +// together with the playlists that group them. The tests close over opts, so +// the registry has to be built after the flags are parsed and the client is +// set. Building it with zero options is safe as long as no test is run, which +// is what the test list command does. +func Registry(opts *TestCodesphereOpts) *testplan.Registry { + statusTest := &testplan.Func{ + TestName: StatusTestName, + Desc: "Report the state of the installation and verify the API answers", + Fn: func(ctx context.Context, out io.Writer) error { + waitTimeout := opts.WaitTimeout + if waitTimeout <= 0 { + waitTimeout = defaultStatusTimeout + } + + statusOpts := &StatusCodesphereOpts{ + BaseURL: opts.BaseURL, + Token: opts.Token, + Wait: opts.Wait, + Timeout: waitTimeout, + Client: opts.Client, + } + + report := fetchStatus(ctx, statusOpts) + printStatus(out, opts.BaseURL, report) + + if !report.Ready { + if report.Err != nil { + return fmt.Errorf("codesphere installation is not ready: %w", report.Err) + } + + return fmt.Errorf("codesphere installation is not ready") + } + + return nil + }, + } + + smoketest := &testplan.Func{ + TestName: SmoketestTestName, + Desc: "Create a workspace, deploy a sample app in it and clean up afterwards", + Fn: func(ctx context.Context, _ io.Writer) error { + c := SmoketestCodesphereCmd{ + Opts: &teststeps.SmoketestCodesphereOpts{ + BaseURL: opts.BaseURL, + Token: opts.Token, + TeamID: opts.TeamID, + PlanID: opts.PlanID, + Profile: opts.Profile, + Quiet: opts.Quiet, + Timeout: opts.Timeout, + Client: opts.Client, + }, + } + + return c.RunSmoketest(ctx) + }, + } + + registry := testplan.NewRegistry(statusTest, smoketest) + registry.AddPlaylist(testplan.Playlist{ + Name: DefaultPlaylist, + Description: "Verify the installation is up and can run a workspace", + Tests: []string{StatusTestName, SmoketestTestName}, + }) + registry.AddPlaylist(testplan.Playlist{ + Name: "readiness", + Description: "Only check that the installation is reachable and ready", + Tests: []string{StatusTestName}, + }) + + return registry +} + +// selectTests resolves the requested tests. An explicit --tests selection wins +// over --playlist, so a playlist default doesn't have to be unset first. +func (c *TestCodesphereCmd) selectTests() ([]testplan.Test, error) { + registry := Registry(c.Opts) + + if len(c.Opts.Tests) > 0 { + tests, err := registry.Select(c.Opts.Tests) + if err != nil { + return nil, fmt.Errorf("failed to select tests: %w", err) + } + + return tests, nil + } + + tests, err := registry.SelectPlaylist(c.Opts.Playlist) + if err != nil { + return nil, fmt.Errorf("failed to select playlist: %w", err) + } + + return tests, nil +} + +// RunE runs the selected tests and fails the command if any of them failed. +func (c *TestCodesphereCmd) RunE(cmd *cobra.Command, _ []string) error { + tests, err := c.selectTests() + if err != nil { + return err + } + + client, err := codesphere.NewClient(c.Opts.BaseURL, c.Opts.Token) + if err != nil { + return fmt.Errorf("failed to create Codesphere client: %w", err) + } + + c.Opts.Client = client + + ctx, cancel := context.WithTimeout(cmd.Context(), c.Opts.Timeout) + defer cancel() + + out := cmd.OutOrStdout() + runner := &testplan.Runner{ + Out: out, + FailFast: c.Opts.FailFast, + Quiet: c.Opts.Quiet, + } + + results := runner.Run(ctx, tests) + testplan.Summarize(out, results) + + if err := testplan.Err(results); err != nil { + return fmt.Errorf("test run failed: %w", err) + } + + return nil +} + +// AddTestCmd adds the test codesphere command to the given parent command. +func AddTestCmd(parent *cobra.Command, _ *util.GlobalOptions) { + registry := Registry(&TestCodesphereOpts{}) + + c := TestCodesphereCmd{ + cmd: &cobra.Command{ + Use: "codesphere", + Short: "Run a playlist of tests against a Codesphere installation", + Long: csio.Long(`Run a playlist of tests against a Codesphere installation. + + A playlist is an ordered selection of tests, for example a status report + followed by a smoke test. Every test is run even if an earlier one failed, + unless --fail-fast is set, and the results are summarized at the end. + + Run 'oms test list' to see the available tests and playlists.`), + Example: util.FormatExamples("test codesphere", []csio.Example{ + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN", + Desc: fmt.Sprintf("Run the %q playlist against a Codesphere installation", DefaultPlaylist), + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --playlist readiness", + Desc: "Run a specific playlist", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --tests status,smoketest", + Desc: "Run a specific list of tests, in the given order", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait", + Desc: "Wait for the installation to become ready before running the remaining tests", + }, + { + Cmd: "--baseurl https://codesphere.example.com/api --token YOUR_TOKEN --fail-fast", + Desc: "Stop at the first failing test instead of running the whole playlist", + }, + }), + }, + Opts: &TestCodesphereOpts{}, + } + + c.cmd.Flags().StringVar(&c.Opts.BaseURL, "baseurl", "", "Base URL of the Codesphere API") + c.cmd.Flags().StringVar(&c.Opts.Token, "token", "", "API token for authentication") + c.cmd.Flags().StringVar(&c.Opts.TeamID, "team-id", "", "Team ID to run tests in") + c.cmd.Flags().StringVar(&c.Opts.PlanID, "plan-id", "", "Plan ID to use for workspaces created by tests") + c.cmd.Flags().StringVar(&c.Opts.Profile, "profile", defaultProfile, "CI profile to use for landscape and pipeline") + c.cmd.Flags().StringVar(&c.Opts.Playlist, "playlist", DefaultPlaylist, + fmt.Sprintf("Playlist of tests to run (%s)", strings.Join(registry.PlaylistNames(), ","))) + c.cmd.Flags().StringSliceVar(&c.Opts.Tests, "tests", []string{}, + fmt.Sprintf("Comma-separated list of tests to run, in the given order (%s). Takes precedence over --playlist.", strings.Join(registry.TestNames(), ","))) + c.cmd.Flags().BoolVar(&c.Opts.Wait, "wait", false, "Wait for the installation to become ready during the status test") + c.cmd.Flags().DurationVar(&c.Opts.WaitTimeout, "wait-timeout", defaultStatusTimeout, "Timeout when waiting for the installation to become ready") + c.cmd.Flags().DurationVar(&c.Opts.Timeout, "timeout", defaultTestTimeout, "Timeout for the entire test run") + c.cmd.Flags().BoolVar(&c.Opts.FailFast, "fail-fast", false, "Skip the remaining tests after the first failure") + c.cmd.Flags().BoolVarP(&c.Opts.Quiet, "quiet", "q", false, "Suppress progress logging") + + util.MarkFlagRequired(c.cmd, "baseurl") + util.MarkFlagRequired(c.cmd, "token") + + c.cmd.RunE = c.RunE + + util.AddCmd(parent, c.cmd) +} diff --git a/cli/cmd/codesphere/test_codesphere_test.go b/cli/cmd/codesphere/test_codesphere_test.go new file mode 100644 index 000000000..0c88515aa --- /dev/null +++ b/cli/cmd/codesphere/test_codesphere_test.go @@ -0,0 +1,144 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package codesphere_test + +import ( + "bytes" + "context" + "fmt" + "time" + + "github.com/codesphere-cloud/cs-go/api" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + intcs "github.com/codesphere-cloud/oms/internal/codesphere" + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" +) + +var _ = Describe("TestCodesphereCmd", func() { + var ( + mockClient *intcs.MockClient + opts *codesphere.TestCodesphereOpts + out *bytes.Buffer + runner *testplan.Runner + ) + + BeforeEach(func() { + mockClient = intcs.NewMockClient(GinkgoT()) + out = &bytes.Buffer{} + opts = &codesphere.TestCodesphereOpts{ + BaseURL: "https://test.codesphere.com/api", + Token: "test-token", + TeamID: "123", + PlanID: "456", + Profile: "ci.yml", + Quiet: true, // Suppress log output in tests + Timeout: time.Minute, + WaitTimeout: time.Minute, + Client: mockClient, + } + runner = &testplan.Runner{Out: out, Quiet: true} + }) + + AfterEach(func() { + mockClient.AssertExpectations(GinkgoT()) + }) + + expectHealthyStatus := func() { + mockClient.EXPECT().ListWorkspacePlans().Return([]api.WorkspacePlan{{Id: 456, Title: "small"}}, nil).Once() + mockClient.EXPECT().ListTeams("").Return([]api.Team{{Id: 123, Name: "team"}}, nil).Once() + } + + Describe("Registry", func() { + It("offers the status and smoketest tests", func() { + registry := codesphere.Registry(opts) + + Expect(registry.TestNames()).To(ContainElements( + codesphere.StatusTestName, + codesphere.SmoketestTestName, + )) + }) + + It("runs the status test before the smoketest in the default playlist", func() { + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(2)) + Expect(tests[0].Name()).To(Equal(codesphere.StatusTestName)) + Expect(tests[1].Name()).To(Equal(codesphere.SmoketestTestName)) + }) + + It("offers a readiness playlist that only checks the status", func() { + tests, err := codesphere.Registry(opts).SelectPlaylist("readiness") + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(1)) + Expect(tests[0].Name()).To(Equal(codesphere.StatusTestName)) + }) + }) + + Describe("status test", func() { + var tests []testplan.Test + + JustBeforeEach(func() { + var err error + + tests, err = codesphere.Registry(opts).Select([]string{codesphere.StatusTestName}) + Expect(err).NotTo(HaveOccurred()) + }) + + It("passes and reports the installation state if the API answers", func() { + expectHealthyStatus() + + results := runner.Run(context.Background(), tests) + + Expect(testplan.Err(results)).To(BeNil()) + Expect(out.String()).To(ContainSubstring("test.codesphere.com")) + Expect(out.String()).To(ContainSubstring("Ready")) + }) + + It("fails if the installation is not reachable", func() { + mockClient.EXPECT().ListWorkspacePlans().Return(nil, fmt.Errorf("connection refused")).Once() + + results := runner.Run(context.Background(), tests) + + Expect(results[0].Status).To(Equal(testplan.StatusFailed)) + Expect(results[0].Err).To(MatchError(ContainSubstring("not ready"))) + Expect(results[0].Err).To(MatchError(ContainSubstring("connection refused"))) + }) + }) + + Describe("default playlist", func() { + It("passes if the installation is ready and the smoketest succeeds", func() { + expectHealthyStatus() + mockFullTestRun(mockClient, 123, 456, 789) + + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + Expect(err).NotTo(HaveOccurred()) + + results := runner.Run(context.Background(), tests) + + Expect(testplan.Err(results)).To(BeNil()) + Expect(results).To(HaveLen(2)) + }) + + It("skips the smoketest if the status test fails with fail-fast", func() { + mockClient.EXPECT().ListWorkspacePlans().Return(nil, fmt.Errorf("connection refused")).Once() + + runner.FailFast = true + + tests, err := codesphere.Registry(opts).SelectPlaylist(codesphere.DefaultPlaylist) + Expect(err).NotTo(HaveOccurred()) + + results := runner.Run(context.Background(), tests) + + Expect(results[0].Status).To(Equal(testplan.StatusFailed)) + Expect(results[1].Name).To(Equal(codesphere.SmoketestTestName)) + Expect(results[1].Status).To(Equal(testplan.StatusSkipped)) + Expect(testplan.Err(results)).To(MatchError(ContainSubstring("status"))) + }) + }) +}) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index e27db81ba..12cba7c29 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -75,6 +75,10 @@ func GetRootCmd() *cobra.Command { // Smoke test commands AddSmoketestCmd(rootCmd, opts) + // Status and test commands + AddStatusCmd(rootCmd, opts) + AddTestCmd(rootCmd, opts) + // Resource creation commands AddCreateCmd(rootCmd, opts) diff --git a/cli/cmd/status.go b/cli/cmd/status.go new file mode 100644 index 000000000..878760db0 --- /dev/null +++ b/cli/cmd/status.go @@ -0,0 +1,30 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/spf13/cobra" +) + +// StatusCmd represents the status command +type StatusCmd struct { + cmd *cobra.Command +} + +// AddStatusCmd adds the status command and its subcommands to the root command. +func AddStatusCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { + status := StatusCmd{ + cmd: &cobra.Command{ + Use: "status", + Short: "Check the status of Codesphere components", + Long: io.Long(`Check whether Codesphere installations or components are up and ready.`), + }, + } + util.AddCmd(rootCmd, status.cmd) + + codesphere.AddStatusCmd(status.cmd, opts) +} diff --git a/cli/cmd/test.go b/cli/cmd/test.go new file mode 100644 index 000000000..0e60c6510 --- /dev/null +++ b/cli/cmd/test.go @@ -0,0 +1,63 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/codesphere-cloud/oms/cli/cmd/codesphere" + "github.com/codesphere-cloud/oms/cli/cmd/util" + "github.com/spf13/cobra" +) + +// TestCmd represents the test command +type TestCmd struct { + cmd *cobra.Command +} + +// TestListCmd represents the test list command +type TestListCmd struct { + cmd *cobra.Command +} + +// AddTestCmd adds the test command and its subcommands to the root command. +func AddTestCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { + test := TestCmd{ + cmd: &cobra.Command{ + Use: "test", + Short: "Run playlists of tests against Codesphere components", + Long: io.Long(`Run playlists of tests against Codesphere components. + + A playlist bundles individual tests, such as a status report or a smoke test, + into a single run with a summarized result.`), + }, + } + util.AddCmd(rootCmd, test.cmd) + + codesphere.AddTestCmd(test.cmd, opts) + AddTestListCmd(test.cmd) +} + +// AddTestListCmd adds the test list command to the given parent command. +func AddTestListCmd(parent *cobra.Command) { + list := TestListCmd{ + cmd: &cobra.Command{ + Use: "list", + Short: "List the available tests and playlists", + Long: io.Long(`List the tests that can be run against a Codesphere installation and the playlists that group them.`), + Example: util.FormatExamples("test list", []io.Example{ + { + Cmd: "", + Desc: "List the available tests and playlists", + }, + }), + }, + } + + list.cmd.RunE = func(cmd *cobra.Command, _ []string) error { + codesphere.Registry(&codesphere.TestCodesphereOpts{}).Describe(cmd.OutOrStdout()) + return nil + } + + util.AddCmd(parent, list.cmd) +} diff --git a/docs/README.md b/docs/README.md index e9dcd6a79..7b6eda8fb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,9 @@ like downloading new versions. * [oms register](oms_register.md) - Register a new API key * [oms revoke](oms_revoke.md) - Revoke resources available through OMS * [oms smoketest](oms_smoketest.md) - Run smoke tests for Codesphere components +* [oms status](oms_status.md) - Check the status of Codesphere components * [oms template](oms_template.md) - Render OMS configuration templates +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components * [oms update](oms_update.md) - Update OMS related resources * [oms version](oms_version.md) - Print version diff --git a/internal/codesphere/testplan/testplan.go b/internal/codesphere/testplan/testplan.go new file mode 100644 index 000000000..fdc1fe42c --- /dev/null +++ b/internal/codesphere/testplan/testplan.go @@ -0,0 +1,347 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +// Package testplan runs ordered playlists of tests against a Codesphere +// installation and reports their results. +// +// A Test is a single, self-contained check (for example a status report or a +// smoke test). A Playlist is a named, ordered selection of those tests, so +// operators can run a well-known set of checks with a single command. +package testplan + +import ( + "context" + "errors" + "fmt" + "io" + "slices" + "strings" + "text/tabwriter" + "time" +) + +const ( + // ANSI color codes + colorGreen = "\033[32m" + colorRed = "\033[31m" + colorYellow = "\033[33m" + colorBold = "\033[1m" + colorReset = "\033[0m" +) + +// Status is the outcome of a single test run. +type Status string + +// The outcomes a test can have. A test that was not run at all, because an +// earlier test failed or the run was cancelled, is skipped. +const ( + StatusPassed Status = "PASS" + StatusFailed Status = "FAIL" + StatusSkipped Status = "SKIP" +) + +func (s Status) colored() string { + switch s { + case StatusPassed: + return colorGreen + string(s) + colorReset + case StatusFailed: + return colorRed + string(s) + colorReset + default: + return colorYellow + string(s) + colorReset + } +} + +// Test is a single, independently runnable check of a Codesphere installation. +type Test interface { + Name() string + Description() string + Run(ctx context.Context, out io.Writer) error +} + +// Func adapts a plain function into a Test. +type Func struct { + TestName string + Desc string + Fn func(ctx context.Context, out io.Writer) error +} + +// Name returns the name the test is selected by. +func (f *Func) Name() string { return f.TestName } + +// Description returns what the test does, as shown in listings and progress logs. +func (f *Func) Description() string { return f.Desc } + +// Run executes the wrapped function. +func (f *Func) Run(ctx context.Context, out io.Writer) error { + return f.Fn(ctx, out) +} + +// Result records the outcome of a single test. +type Result struct { + Name string + Status Status + Duration time.Duration + Err error +} + +// Playlist is a named, ordered selection of tests. +type Playlist struct { + Name string + Description string + Tests []string +} + +// Registry holds the tests that can be run and the playlists that select them. +type Registry struct { + tests []Test + playlists []Playlist +} + +// NewRegistry returns a registry of the given tests, in the order they are +// passed. Tests keep that order unless a playlist specifies a different one. +func NewRegistry(tests ...Test) *Registry { + return &Registry{tests: tests} +} + +// AddPlaylist registers a named selection of tests. +func (r *Registry) AddPlaylist(p Playlist) { + r.playlists = append(r.playlists, p) +} + +// Tests returns all registered tests. +func (r *Registry) Tests() []Test { + return slices.Clone(r.tests) +} + +// Playlists returns all registered playlists. +func (r *Registry) Playlists() []Playlist { + return slices.Clone(r.playlists) +} + +// TestNames returns the names of all registered tests, in registration order. +func (r *Registry) TestNames() []string { + names := make([]string, 0, len(r.tests)) + for _, t := range r.tests { + names = append(names, t.Name()) + } + + return names +} + +// PlaylistNames returns the names of all registered playlists. +func (r *Registry) PlaylistNames() []string { + names := make([]string, 0, len(r.playlists)) + for _, p := range r.playlists { + names = append(names, p.Name) + } + + return names +} + +// Select resolves test names to tests, keeping the requested order. Unknown +// names are reported instead of silently ignored, so a typo doesn't quietly +// shrink the test run. +func (r *Registry) Select(names []string) ([]Test, error) { + if len(names) == 0 { + return nil, errors.New("no tests selected") + } + + byName := make(map[string]Test, len(r.tests)) + for _, t := range r.tests { + byName[t.Name()] = t + } + + selected := make([]Test, 0, len(names)) + + var unknown []string + + for _, name := range names { + test, ok := byName[name] + if !ok { + unknown = append(unknown, name) + continue + } + + if slices.ContainsFunc(selected, func(t Test) bool { return t.Name() == name }) { + continue + } + + selected = append(selected, test) + } + + if len(unknown) > 0 { + return nil, fmt.Errorf("unknown test(s) %s, available tests are %s", + strings.Join(unknown, ","), strings.Join(r.TestNames(), ",")) + } + + return selected, nil +} + +// SelectPlaylist resolves a playlist name to the tests it contains. +func (r *Registry) SelectPlaylist(name string) ([]Test, error) { + idx := slices.IndexFunc(r.playlists, func(p Playlist) bool { return p.Name == name }) + if idx < 0 { + return nil, fmt.Errorf("unknown playlist %q, available playlists are %s", + name, strings.Join(r.PlaylistNames(), ",")) + } + + tests, err := r.Select(r.playlists[idx].Tests) + if err != nil { + return nil, fmt.Errorf("playlist %q: %w", name, err) + } + + return tests, nil +} + +// Describe writes the available tests and playlists in a human readable form. +func (r *Registry) Describe(w io.Writer) { + tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) + + printf(tw, "%sTests%s\n", colorBold, colorReset) + + for _, t := range r.tests { + printf(tw, " %s\t%s\n", t.Name(), t.Description()) + } + + printf(tw, "\n%sPlaylists%s\n", colorBold, colorReset) + + for _, p := range r.playlists { + printf(tw, " %s\t%s\t[%s]\n", p.Name, p.Description, strings.Join(p.Tests, ", ")) + } + + //nolint:errcheck // flushing to the command's output stream, nothing to recover from + tw.Flush() +} + +// Runner executes tests in order and reports what happened. +type Runner struct { + // Out receives both the progress log and the output of the tests themselves. + Out io.Writer + // FailFast skips the remaining tests as soon as one fails. + FailFast bool + // Quiet suppresses the per-test progress log, but not the summary. + Quiet bool +} + +// Run executes the tests in order and returns one result per test. Tests that +// are not run (because of a failure with FailFast, or an expired context) are +// reported as skipped, so the result list always covers the full playlist. +func (r *Runner) Run(ctx context.Context, tests []Test) []Result { + results := make([]Result, 0, len(tests)) + + for i, test := range tests { + if err := ctx.Err(); err != nil { + results = append(results, skipRemaining(tests[i:], fmt.Errorf("test run aborted: %w", err))...) + break + } + + r.logf("\n%s▶ %s%s: %s\n", colorBold, test.Name(), colorReset, test.Description()) + + start := time.Now() + err := test.Run(ctx, r.Out) + result := Result{Name: test.Name(), Duration: time.Since(start), Err: err} + + result.Status = StatusPassed + if err != nil { + result.Status = StatusFailed + } + + results = append(results, result) + + r.logf("%s %s (%s)\n", test.Name(), result.Status.colored(), formatDuration(result.Duration)) + + if err != nil && r.FailFast { + results = append(results, skipRemaining(tests[i+1:], errors.New("skipped after earlier failure"))...) + break + } + } + + return results +} + +func (r *Runner) logf(format string, args ...any) { + if r.Quiet || r.Out == nil { + return + } + + printf(r.Out, format, args...) +} + +func skipRemaining(tests []Test, reason error) []Result { + skipped := make([]Result, 0, len(tests)) + for _, t := range tests { + skipped = append(skipped, Result{Name: t.Name(), Status: StatusSkipped, Err: reason}) + } + + return skipped +} + +// Summarize writes a table of results followed by a one line tally. +func Summarize(w io.Writer, results []Result) { + var ( + passed, failed, skipped int + total time.Duration + ) + for _, res := range results { + total += res.Duration + switch res.Status { + case StatusPassed: + passed++ + case StatusFailed: + failed++ + default: + skipped++ + } + } + + printf(w, "\n%sTest results%s\n", colorBold, colorReset) + + tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0) + + for _, res := range results { + detail := "" + if res.Err != nil { + detail = res.Err.Error() + } + + printf(tw, " %s\t%s\t%s\t%s\n", res.Status.colored(), res.Name, formatDuration(res.Duration), detail) + } + //nolint:errcheck // flushing to the command's output stream, nothing to recover from + tw.Flush() + + printf(w, "\n%d test(s): %d passed, %d failed, %d skipped in %s\n", + len(results), passed, failed, skipped, formatDuration(total)) +} + +// Err aggregates the failures of a test run into a single error, or returns +// nil if nothing failed. +func Err(results []Result) error { + var failed []string + + for _, res := range results { + if res.Status == StatusFailed { + failed = append(failed, res.Name) + } + } + + if len(failed) == 0 { + return nil + } + + return fmt.Errorf("%d of %d test(s) failed: %s", len(failed), len(results), strings.Join(failed, ",")) +} + +// printf writes to the report output. Write errors are ignored: the output is +// the operator's terminal, and there is no fallback to report them on. +func printf(w io.Writer, format string, args ...any) { + //nolint:errcheck // see above + fmt.Fprintf(w, format, args...) +} + +func formatDuration(d time.Duration) string { + if d < time.Second { + return d.Round(time.Millisecond).String() + } + + return d.Round(100 * time.Millisecond).String() +} diff --git a/internal/codesphere/testplan/testplan_suite_test.go b/internal/codesphere/testplan/testplan_suite_test.go new file mode 100644 index 000000000..fbe3f880b --- /dev/null +++ b/internal/codesphere/testplan/testplan_suite_test.go @@ -0,0 +1,16 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package testplan_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestTestplan(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Testplan Suite") +} diff --git a/internal/codesphere/testplan/testplan_test.go b/internal/codesphere/testplan/testplan_test.go new file mode 100644 index 000000000..987988ea2 --- /dev/null +++ b/internal/codesphere/testplan/testplan_test.go @@ -0,0 +1,235 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package testplan_test + +import ( + "bytes" + "context" + "fmt" + "io" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/codesphere/testplan" +) + +// recordingTest records that it ran and returns a fixed error. +type recordingTest struct { + name string + err error + ran *[]string +} + +func (t *recordingTest) Name() string { return t.name } +func (t *recordingTest) Description() string { return t.name + " description" } + +func (t *recordingTest) Run(_ context.Context, out io.Writer) error { + *t.ran = append(*t.ran, t.name) + _, _ = fmt.Fprintf(out, "output of %s\n", t.name) + + return t.err +} + +var _ = Describe("Testplan", func() { + var ( + ran []string + out *bytes.Buffer + passes *recordingTest + fails *recordingTest + second *recordingTest + ) + + newTest := func(name string, err error) *recordingTest { + return &recordingTest{name: name, err: err, ran: &ran} + } + + BeforeEach(func() { + ran = []string{} + out = &bytes.Buffer{} + passes = newTest("passes", nil) + fails = newTest("fails", fmt.Errorf("boom")) + second = newTest("second", nil) + }) + + Describe("Registry", func() { + var registry *testplan.Registry + + BeforeEach(func() { + registry = testplan.NewRegistry(passes, fails, second) + registry.AddPlaylist(testplan.Playlist{ + Name: "default", + Tests: []string{"fails", "passes"}, + }) + }) + + It("lists tests and playlists in registration order", func() { + Expect(registry.TestNames()).To(Equal([]string{"passes", "fails", "second"})) + Expect(registry.PlaylistNames()).To(Equal([]string{"default"})) + }) + + It("selects tests in the requested order", func() { + tests, err := registry.Select([]string{"second", "passes"}) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(2)) + Expect(tests[0].Name()).To(Equal("second")) + Expect(tests[1].Name()).To(Equal("passes")) + }) + + It("ignores duplicates in a selection", func() { + tests, err := registry.Select([]string{"passes", "passes"}) + + Expect(err).NotTo(HaveOccurred()) + Expect(tests).To(HaveLen(1)) + }) + + It("reports unknown test names", func() { + _, err := registry.Select([]string{"passes", "nope"}) + + Expect(err).To(MatchError(ContainSubstring("unknown test(s) nope"))) + Expect(err).To(MatchError(ContainSubstring("passes,fails,second"))) + }) + + It("returns an error for an empty selection", func() { + _, err := registry.Select(nil) + + Expect(err).To(MatchError(ContainSubstring("no tests selected"))) + }) + + It("resolves a playlist to its tests, keeping the playlist order", func() { + tests, err := registry.SelectPlaylist("default") + + Expect(err).NotTo(HaveOccurred()) + Expect(tests[0].Name()).To(Equal("fails")) + Expect(tests[1].Name()).To(Equal("passes")) + }) + + It("reports an unknown playlist", func() { + _, err := registry.SelectPlaylist("nope") + + Expect(err).To(MatchError(ContainSubstring(`unknown playlist "nope"`))) + Expect(err).To(MatchError(ContainSubstring("available playlists are default"))) + }) + + It("reports a playlist that references an unknown test", func() { + registry.AddPlaylist(testplan.Playlist{Name: "broken", Tests: []string{"nope"}}) + + _, err := registry.SelectPlaylist("broken") + + Expect(err).To(MatchError(ContainSubstring(`playlist "broken"`))) + Expect(err).To(MatchError(ContainSubstring("unknown test(s) nope"))) + }) + + It("describes tests and playlists", func() { + registry.Describe(out) + + Expect(out.String()).To(ContainSubstring("passes description")) + Expect(out.String()).To(ContainSubstring("default")) + Expect(out.String()).To(ContainSubstring("[fails, passes]")) + }) + }) + + Describe("Runner", func() { + var runner *testplan.Runner + + BeforeEach(func() { + runner = &testplan.Runner{Out: out} + }) + + It("runs all tests and reports their status", func() { + results := runner.Run(context.Background(), []testplan.Test{passes, fails, second}) + + Expect(ran).To(Equal([]string{"passes", "fails", "second"})) + Expect(results).To(HaveLen(3)) + Expect(results[0].Status).To(Equal(testplan.StatusPassed)) + Expect(results[1].Status).To(Equal(testplan.StatusFailed)) + Expect(results[1].Err).To(MatchError("boom")) + Expect(results[2].Status).To(Equal(testplan.StatusPassed)) + }) + + It("continues after a failure by default", func() { + runner.Run(context.Background(), []testplan.Test{fails, second}) + + Expect(ran).To(Equal([]string{"fails", "second"})) + }) + + It("skips the remaining tests with fail-fast", func() { + runner.FailFast = true + + results := runner.Run(context.Background(), []testplan.Test{fails, second}) + + Expect(ran).To(Equal([]string{"fails"})) + Expect(results).To(HaveLen(2)) + Expect(results[1].Name).To(Equal("second")) + Expect(results[1].Status).To(Equal(testplan.StatusSkipped)) + }) + + It("skips all tests when the context is already done", func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + results := runner.Run(ctx, []testplan.Test{passes, second}) + + Expect(ran).To(BeEmpty()) + Expect(results).To(HaveLen(2)) + + for _, res := range results { + Expect(res.Status).To(Equal(testplan.StatusSkipped)) + Expect(res.Err).To(MatchError(ContainSubstring("test run aborted"))) + } + }) + + It("forwards test output and logs progress", func() { + runner.Run(context.Background(), []testplan.Test{passes}) + + Expect(out.String()).To(ContainSubstring("passes description")) + Expect(out.String()).To(ContainSubstring("output of passes")) + Expect(out.String()).To(ContainSubstring("PASS")) + }) + + It("keeps test output but drops progress logging when quiet", func() { + runner.Quiet = true + + runner.Run(context.Background(), []testplan.Test{passes}) + + Expect(out.String()).To(ContainSubstring("output of passes")) + Expect(out.String()).NotTo(ContainSubstring("passes description")) + }) + }) + + Describe("Summarize", func() { + It("lists every result and tallies them", func() { + results := []testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "fails", Status: testplan.StatusFailed, Err: fmt.Errorf("boom")}, + {Name: "second", Status: testplan.StatusSkipped}, + } + + testplan.Summarize(out, results) + + Expect(out.String()).To(ContainSubstring("passes")) + Expect(out.String()).To(ContainSubstring("boom")) + Expect(out.String()).To(ContainSubstring("3 test(s): 1 passed, 1 failed, 1 skipped")) + }) + }) + + Describe("Err", func() { + It("returns nil if nothing failed", func() { + Expect(testplan.Err([]testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "second", Status: testplan.StatusSkipped}, + })).To(BeNil()) + }) + + It("names the failed tests", func() { + err := testplan.Err([]testplan.Result{ + {Name: "passes", Status: testplan.StatusPassed}, + {Name: "fails", Status: testplan.StatusFailed}, + }) + + Expect(err).To(MatchError("1 of 2 test(s) failed: fails")) + }) + }) +}) From 61cb37f7edf084a4c5e59d19aa1fb6c647a63794 Mon Sep 17 00:00:00 2001 From: DerBurri <7892993+DerBurri@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:25:17 +0000 Subject: [PATCH 130/132] chore(docs): Auto-update docs and licenses Signed-off-by: DerBurri <7892993+DerBurri@users.noreply.github.com> --- docs/oms.md | 2 ++ docs/oms_status.md | 19 +++++++++++ docs/oms_status_codesphere.md | 38 ++++++++++++++++++++++ docs/oms_test.md | 23 ++++++++++++++ docs/oms_test_codesphere.md | 60 +++++++++++++++++++++++++++++++++++ docs/oms_test_list.md | 30 ++++++++++++++++++ 6 files changed, 172 insertions(+) create mode 100644 docs/oms_status.md create mode 100644 docs/oms_status_codesphere.md create mode 100644 docs/oms_test.md create mode 100644 docs/oms_test_codesphere.md create mode 100644 docs/oms_test_list.md diff --git a/docs/oms.md b/docs/oms.md index e9dcd6a79..7b6eda8fb 100644 --- a/docs/oms.md +++ b/docs/oms.md @@ -30,7 +30,9 @@ like downloading new versions. * [oms register](oms_register.md) - Register a new API key * [oms revoke](oms_revoke.md) - Revoke resources available through OMS * [oms smoketest](oms_smoketest.md) - Run smoke tests for Codesphere components +* [oms status](oms_status.md) - Check the status of Codesphere components * [oms template](oms_template.md) - Render OMS configuration templates +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components * [oms update](oms_update.md) - Update OMS related resources * [oms version](oms_version.md) - Print version diff --git a/docs/oms_status.md b/docs/oms_status.md new file mode 100644 index 000000000..6183fb6ce --- /dev/null +++ b/docs/oms_status.md @@ -0,0 +1,19 @@ +## oms status + +Check the status of Codesphere components + +### Synopsis + +Check whether Codesphere installations or components are up and ready. + +### Options + +``` + -h, --help help for status +``` + +### SEE ALSO + +* [oms](oms.md) - Codesphere Operations Management System (OMS) +* [oms status codesphere](oms_status_codesphere.md) - Check the status of a Codesphere installation + diff --git a/docs/oms_status_codesphere.md b/docs/oms_status_codesphere.md new file mode 100644 index 000000000..b21f9c04f --- /dev/null +++ b/docs/oms_status_codesphere.md @@ -0,0 +1,38 @@ +## oms status codesphere + +Check the status of a Codesphere installation + +### Synopsis + +Check whether a Codesphere installation is reachable and ready to use, +by querying the Codesphere API. + +``` +oms status codesphere [flags] +``` + +### Examples + +``` +# Check the status of a Codesphere installation +$ oms status codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN + +# Block and retry until the Codesphere installation is ready +$ oms status codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait + +``` + +### Options + +``` + --baseurl string Base URL of the Codesphere API + -h, --help help for codesphere + --timeout duration Timeout when waiting for the installation to become ready (default 5m0s) + --token string API token for authentication + --wait Block and retry until the installation is ready +``` + +### SEE ALSO + +* [oms status](oms_status.md) - Check the status of Codesphere components + diff --git a/docs/oms_test.md b/docs/oms_test.md new file mode 100644 index 000000000..171cecb7b --- /dev/null +++ b/docs/oms_test.md @@ -0,0 +1,23 @@ +## oms test + +Run playlists of tests against Codesphere components + +### Synopsis + +Run playlists of tests against Codesphere components. + +A playlist bundles individual tests, such as a status report or a smoke test, +into a single run with a summarized result. + +### Options + +``` + -h, --help help for test +``` + +### SEE ALSO + +* [oms](oms.md) - Codesphere Operations Management System (OMS) +* [oms test codesphere](oms_test_codesphere.md) - Run a playlist of tests against a Codesphere installation +* [oms test list](oms_test_list.md) - List the available tests and playlists + diff --git a/docs/oms_test_codesphere.md b/docs/oms_test_codesphere.md new file mode 100644 index 000000000..508ebd4a0 --- /dev/null +++ b/docs/oms_test_codesphere.md @@ -0,0 +1,60 @@ +## oms test codesphere + +Run a playlist of tests against a Codesphere installation + +### Synopsis + +Run a playlist of tests against a Codesphere installation. + +A playlist is an ordered selection of tests, for example a status report +followed by a smoke test. Every test is run even if an earlier one failed, +unless --fail-fast is set, and the results are summarized at the end. + +Run 'oms test list' to see the available tests and playlists. + +``` +oms test codesphere [flags] +``` + +### Examples + +``` +# Run the "default" playlist against a Codesphere installation +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN + +# Run a specific playlist +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --playlist readiness + +# Run a specific list of tests, in the given order +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --tests status,smoketest + +# Wait for the installation to become ready before running the remaining tests +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --wait + +# Stop at the first failing test instead of running the whole playlist +$ oms test codesphere --baseurl https://codesphere.example.com/api --token YOUR_TOKEN --fail-fast + +``` + +### Options + +``` + --baseurl string Base URL of the Codesphere API + --fail-fast Skip the remaining tests after the first failure + -h, --help help for codesphere + --plan-id string Plan ID to use for workspaces created by tests + --playlist string Playlist of tests to run (default,readiness) (default "default") + --profile string CI profile to use for landscape and pipeline (default "ci.yml") + -q, --quiet Suppress progress logging + --team-id string Team ID to run tests in + --tests strings Comma-separated list of tests to run, in the given order (status,smoketest). Takes precedence over --playlist. + --timeout duration Timeout for the entire test run (default 20m0s) + --token string API token for authentication + --wait Wait for the installation to become ready during the status test + --wait-timeout duration Timeout when waiting for the installation to become ready (default 5m0s) +``` + +### SEE ALSO + +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components + diff --git a/docs/oms_test_list.md b/docs/oms_test_list.md new file mode 100644 index 000000000..a3f00c8b9 --- /dev/null +++ b/docs/oms_test_list.md @@ -0,0 +1,30 @@ +## oms test list + +List the available tests and playlists + +### Synopsis + +List the tests that can be run against a Codesphere installation and the playlists that group them. + +``` +oms test list [flags] +``` + +### Examples + +``` +# List the available tests and playlists +$ oms test list + +``` + +### Options + +``` + -h, --help help for list +``` + +### SEE ALSO + +* [oms test](oms_test.md) - Run playlists of tests against Codesphere components + From bd737af836073887a603fe874822c4090833f139 Mon Sep 17 00:00:00 2001 From: DerBurri Date: Wed, 16 Sep 2026 13:29:43 +0200 Subject: [PATCH 131/132] tests: mark the smoketest command as deprecated --- cli/cmd/root.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 12cba7c29..0f9831663 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -72,13 +72,13 @@ func GetRootCmd() *cobra.Command { apikey.AddRegisterCmd(rootCmd, opts) AddRevokeCmd(rootCmd, opts) - // Smoke test commands - AddSmoketestCmd(rootCmd, opts) - // Status and test commands AddStatusCmd(rootCmd, opts) AddTestCmd(rootCmd, opts) + // Deprecated, superseded by the smoketest step of 'oms test codesphere'. + AddSmoketestCmd(rootCmd, opts) + // Resource creation commands AddCreateCmd(rootCmd, opts) From 6695aca55eb32bd5f4db4bf1040edef49a7621df Mon Sep 17 00:00:00 2001 From: DerBurri Date: Wed, 16 Sep 2026 13:31:47 +0200 Subject: [PATCH 132/132] Mark the old smoketest command as deprectated --- cli/cmd/smoketest.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/cmd/smoketest.go b/cli/cmd/smoketest.go index 2d7ac6d8e..cd5ed95af 100644 --- a/cli/cmd/smoketest.go +++ b/cli/cmd/smoketest.go @@ -18,9 +18,10 @@ type SmoketestCmd struct { func AddSmoketestCmd(rootCmd *cobra.Command, opts *util.GlobalOptions) { smoketest := SmoketestCmd{ cmd: &cobra.Command{ - Use: "smoketest", - Short: "Run smoke tests for Codesphere components", - Long: io.Long(`Run automated smoke tests for Codesphere installations to verify functionality.`), + Use: "smoketest", + Short: "Run smoke tests for Codesphere components (deprecated)", + Long: io.Long(`Run automated smoke tests for Codesphere installations to verify functionality.`), + Deprecated: codesphere.SmoketestDeprecation, }, } util.AddCmd(rootCmd, smoketest.cmd)