From 5bfe9ddc7557086d0705abac431de3e1a6bd2c4e Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 12:23:46 -0500 Subject: [PATCH 01/37] kurl migration api --- api/api.go | 9 + api/controllers/migration/controller.go | 286 ++++++++ api/controllers/migration/controller_mock.go | 45 ++ api/controllers/migration/controller_test.go | 633 ++++++++++++++++++ api/docs/docs.go | 4 +- api/docs/swagger.json | 2 +- api/docs/swagger.yaml | 167 +++++ api/handlers.go | 9 + api/internal/handlers/migration/handler.go | 133 ++++ .../handlers/migration/handler_test.go | 336 ++++++++++ api/internal/managers/migration/manager.go | 214 ++++++ .../managers/migration/manager_mock.go | 51 ++ .../managers/migration/manager_test.go | 171 +++++ api/internal/store/migration/example_test.go | 72 ++ api/internal/store/migration/store.go | 242 +++++++ api/internal/store/migration/store_mock.go | 69 ++ api/internal/store/migration/store_test.go | 230 +++++++ api/internal/store/store.go | 20 + api/internal/store/store_mock.go | 18 +- api/routes.go | 10 + api/types/api.go | 7 + api/types/migration.go | 84 +++ proposals/.claude/settings.local.json | 10 + proposals/kurl-migration-api-foundation.md | 583 ++++++++++++++++ .../kurl-migration-api-foundation_research.md | 173 +++++ 25 files changed, 3562 insertions(+), 16 deletions(-) create mode 100644 api/controllers/migration/controller.go create mode 100644 api/controllers/migration/controller_mock.go create mode 100644 api/controllers/migration/controller_test.go create mode 100644 api/internal/handlers/migration/handler.go create mode 100644 api/internal/handlers/migration/handler_test.go create mode 100644 api/internal/managers/migration/manager.go create mode 100644 api/internal/managers/migration/manager_mock.go create mode 100644 api/internal/managers/migration/manager_test.go create mode 100644 api/internal/store/migration/example_test.go create mode 100644 api/internal/store/migration/store.go create mode 100644 api/internal/store/migration/store_mock.go create mode 100644 api/internal/store/migration/store_test.go create mode 100644 api/types/migration.go create mode 100644 proposals/.claude/settings.local.json create mode 100644 proposals/kurl-migration-api-foundation.md create mode 100644 proposals/kurl-migration-api-foundation_research.md diff --git a/api/api.go b/api/api.go index 5afcdfc3f6..eea32e61a9 100644 --- a/api/api.go +++ b/api/api.go @@ -9,6 +9,7 @@ import ( kubernetesupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/kubernetes/upgrade" linuxinstall "github.com/replicatedhq/embedded-cluster/api/controllers/linux/install" linuxupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/linux/upgrade" + "github.com/replicatedhq/embedded-cluster/api/controllers/migration" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/replicatedhq/embedded-cluster/pkg-new/preflights" @@ -56,6 +57,7 @@ type API struct { linuxUpgradeController linuxupgrade.Controller kubernetesInstallController kubernetesinstall.Controller kubernetesUpgradeController kubernetesupgrade.Controller + migrationController migration.Controller handlers handlers } @@ -105,6 +107,13 @@ func WithKubernetesUpgradeController(kubernetesUpgradeController kubernetesupgra } } +// WithMigrationController configures the migration controller for the API. +func WithMigrationController(migrationController migration.Controller) Option { + return func(a *API) { + a.migrationController = migrationController + } +} + // WithLogger configures the logger for the API. If not provided, a default logger will be created. func WithLogger(logger logrus.FieldLogger) Option { return func(a *API) { diff --git a/api/controllers/migration/controller.go b/api/controllers/migration/controller.go new file mode 100644 index 0000000000..3d7a8576f2 --- /dev/null +++ b/api/controllers/migration/controller.go @@ -0,0 +1,286 @@ +package migration + +import ( + "context" + "fmt" + + "github.com/google/uuid" + linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" + migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" + migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" + "github.com/replicatedhq/embedded-cluster/api/pkg/logger" + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/sirupsen/logrus" +) + +// Controller provides methods for managing kURL to Embedded Cluster migrations +type Controller interface { + // GetInstallationConfig extracts kURL config, gets EC defaults, and returns merged config + GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) + + // StartMigration validates config, generates UUID, initializes state, launches background goroutine + StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) + + // GetMigrationStatus returns current migration status + GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) + + // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) + Run(ctx context.Context) error +} + +var _ Controller = (*MigrationController)(nil) + +// MigrationController implements the Controller interface +type MigrationController struct { + manager migrationmanager.Manager + store migrationstore.Store + installationManager linuxinstallation.InstallationManager + logger logrus.FieldLogger +} + +// ControllerOption is a functional option for configuring the MigrationController +type ControllerOption func(*MigrationController) + +// WithManager sets the migration manager +func WithManager(manager migrationmanager.Manager) ControllerOption { + return func(c *MigrationController) { + c.manager = manager + } +} + +// WithStore sets the migration store +func WithStore(store migrationstore.Store) ControllerOption { + return func(c *MigrationController) { + c.store = store + } +} + +// WithInstallationManager sets the installation manager +func WithInstallationManager(manager linuxinstallation.InstallationManager) ControllerOption { + return func(c *MigrationController) { + c.installationManager = manager + } +} + +// WithLogger sets the logger +func WithLogger(log logrus.FieldLogger) ControllerOption { + return func(c *MigrationController) { + c.logger = log + } +} + +// NewMigrationController creates a new migration controller with the provided options +func NewMigrationController(opts ...ControllerOption) (*MigrationController, error) { + controller := &MigrationController{ + store: migrationstore.NewMemoryStore(), + logger: logger.NewDiscardLogger(), + } + + for _, opt := range opts { + opt(controller) + } + + // Validate required dependencies + if controller.manager == nil { + return nil, fmt.Errorf("migration manager is required") + } + + return controller, nil +} + +// GetInstallationConfig extracts kURL config, gets EC defaults, and returns merged config +func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { + c.logger.Debug("GetInstallationConfig: Fetching kURL config, EC defaults, and merging") + + // Get kURL config from the running cluster + kurlConfig, err := c.manager.GetKurlConfig(ctx) + if err != nil { + c.logger.WithError(err).Error("GetInstallationConfig: Failed to get kURL config") + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get kurl config: %w", err) + } + + // Get EC defaults + defaults, err := c.manager.GetECDefaults(ctx) + if err != nil { + c.logger.WithError(err).Error("GetInstallationConfig: Failed to get EC defaults") + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get ec defaults: %w", err) + } + + // Merge configs with empty user config (user hasn't submitted config yet) + emptyUserConfig := types.LinuxInstallationConfig{} + resolved := c.manager.MergeConfigs(emptyUserConfig, kurlConfig, defaults) + + c.logger.WithFields(logrus.Fields{ + "kurlConfig": kurlConfig, + "defaults": defaults, + "resolved": resolved, + }).Debug("GetInstallationConfig: Config merged successfully") + + return types.LinuxInstallationConfigResponse{ + Values: kurlConfig, + Defaults: defaults, + Resolved: resolved, + }, nil +} + +// StartMigration validates config, generates UUID, initializes state, launches background goroutine +func (c *MigrationController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { + c.logger.WithFields(logrus.Fields{ + "transferMode": transferMode, + "config": config, + }).Info("StartMigration: Starting migration") + + // Validate transfer mode + if err := c.manager.ValidateTransferMode(transferMode); err != nil { + c.logger.WithError(err).Error("StartMigration: Invalid transfer mode") + return "", types.NewBadRequestError(err) + } + + // Check if migration already exists + if _, err := c.store.GetMigrationID(); err == nil { + c.logger.Warn("StartMigration: Migration already in progress") + return "", types.NewConflictError(types.ErrMigrationAlreadyStarted) + } + + // Generate UUID for migration + migrationID := uuid.New().String() + c.logger.WithField("migrationID", migrationID).Debug("StartMigration: Generated migration ID") + + // Get defaults and merge with user config + kurlConfig, err := c.manager.GetKurlConfig(ctx) + if err != nil { + c.logger.WithError(err).Error("StartMigration: Failed to get kURL config") + return "", fmt.Errorf("get kurl config: %w", err) + } + + defaults, err := c.manager.GetECDefaults(ctx) + if err != nil { + c.logger.WithError(err).Error("StartMigration: Failed to get EC defaults") + return "", fmt.Errorf("get ec defaults: %w", err) + } + + resolvedConfig := c.manager.MergeConfigs(config, kurlConfig, defaults) + c.logger.WithField("resolvedConfig", resolvedConfig).Debug("StartMigration: Config merged") + + // Initialize migration in store + if err := c.store.InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { + c.logger.WithError(err).Error("StartMigration: Failed to initialize migration") + return "", fmt.Errorf("initialize migration: %w", err) + } + + // Set initial state to NotStarted + if err := c.store.SetState(types.MigrationStateNotStarted); err != nil { + c.logger.WithError(err).Error("StartMigration: Failed to set initial state") + return "", fmt.Errorf("set initial state: %w", err) + } + + c.logger.WithField("migrationID", migrationID).Info("StartMigration: Migration initialized, launching background goroutine") + + // Launch background goroutine + go func() { + if err := c.Run(context.Background()); err != nil { + c.logger.WithError(err).Error("StartMigration: Background migration failed") + } + }() + + return migrationID, nil +} + +// GetMigrationStatus returns current migration status +func (c *MigrationController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { + c.logger.Debug("GetMigrationStatus: Fetching migration status") + + status, err := c.store.GetStatus() + if err != nil { + if err == types.ErrNoActiveMigration { + c.logger.Warn("GetMigrationStatus: No active migration found") + return types.MigrationStatusResponse{}, types.NewNotFoundError(err) + } + c.logger.WithError(err).Error("GetMigrationStatus: Failed to get status") + return types.MigrationStatusResponse{}, fmt.Errorf("get status: %w", err) + } + + c.logger.WithFields(logrus.Fields{ + "state": status.State, + "phase": status.Phase, + "progress": status.Progress, + }).Debug("GetMigrationStatus: Status retrieved") + + return status, nil +} + +// Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) +func (c *MigrationController) Run(ctx context.Context) error { + c.logger.Info("Run: Starting migration orchestration") + + // TODO: Phase implementations added in PR 8 + // This is a skeleton implementation that will be expanded in the next PR + + // Get current state from store + status, err := c.store.GetStatus() + if err != nil { + c.logger.WithError(err).Error("Run: Failed to get status") + return fmt.Errorf("get status: %w", err) + } + + c.logger.WithFields(logrus.Fields{ + "state": status.State, + "phase": status.Phase, + }).Debug("Run: Current migration state") + + // If InProgress, resume from current phase + if status.State == types.MigrationStateInProgress { + c.logger.WithField("phase", status.Phase).Info("Run: Resuming from current phase") + // TODO: Resume logic in PR 8 + } + + // Execute phases: Discovery → Preparation → ECInstall → DataTransfer → Completed + phases := []types.MigrationPhase{ + types.MigrationPhaseDiscovery, + types.MigrationPhasePreparation, + types.MigrationPhaseECInstall, + types.MigrationPhaseDataTransfer, + types.MigrationPhaseCompleted, + } + + for _, phase := range phases { + c.logger.WithField("phase", phase).Info("Run: Executing phase (skeleton)") + + // Set state to InProgress + if err := c.store.SetState(types.MigrationStateInProgress); err != nil { + c.logger.WithError(err).Error("Run: Failed to set state to InProgress") + if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + } + if setErr := c.store.SetError(err.Error()); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set error message") + } + return fmt.Errorf("set state: %w", err) + } + + // Set current phase + if err := c.store.SetPhase(phase); err != nil { + c.logger.WithError(err).Error("Run: Failed to set phase") + if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + } + if setErr := c.store.SetError(err.Error()); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set error message") + } + return fmt.Errorf("set phase: %w", err) + } + + // TODO: Execute phase using manager.ExecutePhase(ctx, phase) + // For now, this is a skeleton that just sets the phase + c.logger.WithField("phase", phase).Debug("Run: Phase execution (skeleton only)") + } + + // Set state to Completed + if err := c.store.SetState(types.MigrationStateCompleted); err != nil { + c.logger.WithError(err).Error("Run: Failed to set state to Completed") + return fmt.Errorf("set completed state: %w", err) + } + + c.logger.Info("Run: Migration orchestration completed (skeleton)") + return nil +} diff --git a/api/controllers/migration/controller_mock.go b/api/controllers/migration/controller_mock.go new file mode 100644 index 0000000000..5d50ba2082 --- /dev/null +++ b/api/controllers/migration/controller_mock.go @@ -0,0 +1,45 @@ +package migration + +import ( + "context" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/mock" +) + +var _ Controller = (*MockController)(nil) + +// MockController is a mock implementation of the Controller interface +type MockController struct { + mock.Mock +} + +// GetInstallationConfig mocks the GetInstallationConfig method +func (m *MockController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { + args := m.Called(ctx) + if args.Get(0) == nil { + return types.LinuxInstallationConfigResponse{}, args.Error(1) + } + return args.Get(0).(types.LinuxInstallationConfigResponse), args.Error(1) +} + +// StartMigration mocks the StartMigration method +func (m *MockController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { + args := m.Called(ctx, transferMode, config) + return args.String(0), args.Error(1) +} + +// GetMigrationStatus mocks the GetMigrationStatus method +func (m *MockController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { + args := m.Called(ctx) + if args.Get(0) == nil { + return types.MigrationStatusResponse{}, args.Error(1) + } + return args.Get(0).(types.MigrationStatusResponse), args.Error(1) +} + +// Run mocks the Run method +func (m *MockController) Run(ctx context.Context) error { + args := m.Called(ctx) + return args.Error(0) +} diff --git a/api/controllers/migration/controller_test.go b/api/controllers/migration/controller_test.go new file mode 100644 index 0000000000..fe97e02ff2 --- /dev/null +++ b/api/controllers/migration/controller_test.go @@ -0,0 +1,633 @@ +package migration + +import ( + "errors" + "testing" + "time" + + migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" + migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestGetInstallationConfig(t *testing.T) { + tests := []struct { + name string + setupMock func(*migrationmanager.MockManager) + expectedErr bool + expectedValue func() types.LinuxInstallationConfigResponse + }{ + { + name: "successful read with values, defaults, and resolved configs", + setupMock: func(m *migrationmanager.MockManager) { + kurlConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + } + + defaults := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + GlobalCIDR: "10.244.0.0/16", + } + + resolvedConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + GlobalCIDR: "10.244.0.0/16", + } + + mock.InOrder( + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", types.LinuxInstallationConfig{}, kurlConfig, defaults).Return(resolvedConfig), + ) + }, + expectedErr: false, + expectedValue: func() types.LinuxInstallationConfigResponse { + return types.LinuxInstallationConfigResponse{ + Values: types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + }, + Defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + GlobalCIDR: "10.244.0.0/16", + }, + Resolved: types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + GlobalCIDR: "10.244.0.0/16", + }, + } + }, + }, + { + name: "manager error on GetKurlConfig", + setupMock: func(m *migrationmanager.MockManager) { + m.On("GetKurlConfig", mock.Anything).Return(types.LinuxInstallationConfig{}, errors.New("kurl config error")) + }, + expectedErr: true, + expectedValue: func() types.LinuxInstallationConfigResponse { + return types.LinuxInstallationConfigResponse{} + }, + }, + { + name: "manager error on GetECDefaults", + setupMock: func(m *migrationmanager.MockManager) { + kurlConfig := types.LinuxInstallationConfig{} + mock.InOrder( + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(types.LinuxInstallationConfig{}, errors.New("defaults error")), + ) + }, + expectedErr: true, + expectedValue: func() types.LinuxInstallationConfigResponse { + return types.LinuxInstallationConfigResponse{} + }, + }, + { + name: "verify proper config merging precedence (user > kURL > defaults)", + setupMock: func(m *migrationmanager.MockManager) { + kurlConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", + } + + defaults := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + } + + // Resolved should have kURL values override defaults (since no user config yet) + resolvedConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", + LocalArtifactMirrorPort: 50000, + } + + mock.InOrder( + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", types.LinuxInstallationConfig{}, kurlConfig, defaults).Return(resolvedConfig), + ) + }, + expectedErr: false, + expectedValue: func() types.LinuxInstallationConfigResponse { + return types.LinuxInstallationConfigResponse{ + Values: types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", + }, + Defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + LocalArtifactMirrorPort: 50000, + }, + Resolved: types.LinuxInstallationConfig{ + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", + LocalArtifactMirrorPort: 50000, + }, + } + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockManager := &migrationmanager.MockManager{} + tt.setupMock(mockManager) + + controller, err := NewMigrationController( + WithManager(mockManager), + ) + require.NoError(t, err) + + result, err := controller.GetInstallationConfig(t.Context()) + + if tt.expectedErr { + assert.Error(t, err) + assert.Equal(t, types.LinuxInstallationConfigResponse{}, result) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedValue(), result) + } + + mockManager.AssertExpectations(t) + }) + } +} + +func TestStartMigration(t *testing.T) { + tests := []struct { + name string + transferMode types.TransferMode + config types.LinuxInstallationConfig + setupMock func(*migrationmanager.MockManager, *migrationstore.MockStore) + expectedErr error + validateResult func(t *testing.T, migrationID string, err error) + }{ + { + name: "successful start with copy mode", + transferMode: types.TransferModeCopy, + config: types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + DataDirectory: "/opt/ec", + }, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + kurlConfig := types.LinuxInstallationConfig{ + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + } + defaults := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + } + resolvedConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + DataDirectory: "/opt/ec", + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + } + + mock.InOrder( + m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), + s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(nil), + s.On("SetState", types.MigrationStateNotStarted).Return(nil), + // For the background goroutine + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil), + s.On("SetState", types.MigrationStateInProgress).Return(nil), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), + s.On("SetPhase", types.MigrationPhasePreparation).Return(nil), + s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil), + s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil), + s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil), + s.On("SetState", types.MigrationStateCompleted).Return(nil), + ) + }, + expectedErr: nil, + validateResult: func(t *testing.T, migrationID string, err error) { + assert.NoError(t, err) + assert.NotEmpty(t, migrationID) + }, + }, + { + name: "successful start with move mode", + transferMode: types.TransferModeMove, + config: types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + }, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + kurlConfig := types.LinuxInstallationConfig{} + defaults := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + } + resolvedConfig := types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + } + + mock.InOrder( + m.On("ValidateTransferMode", types.TransferModeMove).Return(nil), + s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("InitializeMigration", mock.AnythingOfType("string"), "move", resolvedConfig).Return(nil), + s.On("SetState", types.MigrationStateNotStarted).Return(nil), + // For the background goroutine + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil), + s.On("SetState", types.MigrationStateInProgress).Return(nil), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), + s.On("SetPhase", types.MigrationPhasePreparation).Return(nil), + s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil), + s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil), + s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil), + s.On("SetState", types.MigrationStateCompleted).Return(nil), + ) + }, + expectedErr: nil, + validateResult: func(t *testing.T, migrationID string, err error) { + assert.NoError(t, err) + assert.NotEmpty(t, migrationID) + }, + }, + { + name: "migration already started (409 error)", + transferMode: types.TransferModeCopy, + config: types.LinuxInstallationConfig{}, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + mock.InOrder( + m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), + s.On("GetMigrationID").Return("existing-migration-id", nil), + ) + }, + expectedErr: types.ErrMigrationAlreadyStarted, + validateResult: func(t *testing.T, migrationID string, err error) { + assert.Error(t, err) + assert.Empty(t, migrationID) + var apiErr *types.APIError + require.True(t, errors.As(err, &apiErr)) + assert.Equal(t, 409, apiErr.StatusCode) + assert.Contains(t, err.Error(), "migration already started") + }, + }, + { + name: "invalid transfer mode (400 error)", + transferMode: types.TransferMode("invalid"), + config: types.LinuxInstallationConfig{}, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + m.On("ValidateTransferMode", types.TransferMode("invalid")).Return(types.ErrInvalidTransferMode) + }, + expectedErr: types.ErrInvalidTransferMode, + validateResult: func(t *testing.T, migrationID string, err error) { + assert.Error(t, err) + assert.Empty(t, migrationID) + var apiErr *types.APIError + require.True(t, errors.As(err, &apiErr)) + assert.Equal(t, 400, apiErr.StatusCode) + }, + }, + { + name: "store initialization error", + transferMode: types.TransferModeCopy, + config: types.LinuxInstallationConfig{}, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + kurlConfig := types.LinuxInstallationConfig{} + defaults := types.LinuxInstallationConfig{} + resolvedConfig := types.LinuxInstallationConfig{} + + mock.InOrder( + m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), + s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(errors.New("store error")), + ) + }, + expectedErr: errors.New("store error"), + validateResult: func(t *testing.T, migrationID string, err error) { + assert.Error(t, err) + assert.Empty(t, migrationID) + assert.Contains(t, err.Error(), "initialize migration") + }, + }, + { + name: "state set to NotStarted error", + transferMode: types.TransferModeCopy, + config: types.LinuxInstallationConfig{}, + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { + kurlConfig := types.LinuxInstallationConfig{} + defaults := types.LinuxInstallationConfig{} + resolvedConfig := types.LinuxInstallationConfig{} + + mock.InOrder( + m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), + s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), + m.On("GetECDefaults", mock.Anything).Return(defaults, nil), + m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(nil), + s.On("SetState", types.MigrationStateNotStarted).Return(errors.New("set state error")), + ) + }, + expectedErr: errors.New("set state error"), + validateResult: func(t *testing.T, migrationID string, err error) { + assert.Error(t, err) + assert.Empty(t, migrationID) + assert.Contains(t, err.Error(), "set initial state") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockManager := &migrationmanager.MockManager{} + mockStore := &migrationstore.MockStore{} + tt.setupMock(mockManager, mockStore) + + controller, err := NewMigrationController( + WithManager(mockManager), + WithStore(mockStore), + ) + require.NoError(t, err) + + migrationID, err := controller.StartMigration(t.Context(), tt.transferMode, tt.config) + + if tt.expectedErr != nil { + require.Error(t, err) + if tt.validateResult != nil { + tt.validateResult(t, migrationID, err) + } + } else { + require.NoError(t, err) + if tt.validateResult != nil { + tt.validateResult(t, migrationID, err) + } + + // Wait for the background goroutine to complete + time.Sleep(100 * time.Millisecond) + } + + mockManager.AssertExpectations(t) + mockStore.AssertExpectations(t) + }) + } +} + +func TestGetMigrationStatus(t *testing.T) { + tests := []struct { + name string + setupMock func(*migrationstore.MockStore) + expectedErr error + expectedValue types.MigrationStatusResponse + }{ + { + name: "successful response with active migration", + setupMock: func(s *migrationstore.MockStore) { + status := types.MigrationStatusResponse{ + State: types.MigrationStateInProgress, + Phase: types.MigrationPhaseDataTransfer, + Message: "Transferring data", + Progress: 50, + Error: "", + } + s.On("GetStatus").Return(status, nil) + }, + expectedErr: nil, + expectedValue: types.MigrationStatusResponse{ + State: types.MigrationStateInProgress, + Phase: types.MigrationPhaseDataTransfer, + Message: "Transferring data", + Progress: 50, + Error: "", + }, + }, + { + name: "no active migration (404 error)", + setupMock: func(s *migrationstore.MockStore) { + s.On("GetStatus").Return(types.MigrationStatusResponse{}, types.ErrNoActiveMigration) + }, + expectedErr: types.ErrNoActiveMigration, + expectedValue: types.MigrationStatusResponse{}, + }, + { + name: "store error", + setupMock: func(s *migrationstore.MockStore) { + s.On("GetStatus").Return(types.MigrationStatusResponse{}, errors.New("store error")) + }, + expectedErr: errors.New("store error"), + expectedValue: types.MigrationStatusResponse{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockStore := &migrationstore.MockStore{} + tt.setupMock(mockStore) + + mockManager := &migrationmanager.MockManager{} + controller, err := NewMigrationController( + WithManager(mockManager), + WithStore(mockStore), + ) + require.NoError(t, err) + + result, err := controller.GetMigrationStatus(t.Context()) + + if tt.expectedErr != nil { + assert.Error(t, err) + assert.Equal(t, types.MigrationStatusResponse{}, result) + + // Verify it's a 404 error when appropriate + if tt.expectedErr == types.ErrNoActiveMigration { + var apiErr *types.APIError + require.True(t, errors.As(err, &apiErr)) + assert.Equal(t, 404, apiErr.StatusCode) + } + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedValue, result) + } + + mockStore.AssertExpectations(t) + }) + } +} + +func TestRun(t *testing.T) { + // These are skeleton tests since Run is a skeleton implementation + // Full implementation will be added in PR 8 + tests := []struct { + name string + setupMock func(*migrationstore.MockStore) + expectedErr bool + }{ + { + name: "skeleton test - state changes through phases", + setupMock: func(s *migrationstore.MockStore) { + mock.InOrder( + // Initial status check + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil).Once(), + // Discovery phase + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), + // Preparation phase + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), + // ECInstall phase + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), + // DataTransfer phase + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), + // Completed phase + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), + // Final state + s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), + ) + }, + expectedErr: false, + }, + { + name: "skeleton test - phase progression", + setupMock: func(s *migrationstore.MockStore) { + mock.InOrder( + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil).Once(), + // Verify all phases are set in order + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), + s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), + ) + }, + expectedErr: false, + }, + { + name: "skeleton test - error on GetStatus", + setupMock: func(s *migrationstore.MockStore) { + s.On("GetStatus").Return(types.MigrationStatusResponse{}, errors.New("get status error")).Once() + }, + expectedErr: true, + }, + { + name: "skeleton test - error on SetState", + setupMock: func(s *migrationstore.MockStore) { + mock.InOrder( + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(errors.New("set state error")).Once(), + s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), + s.On("SetError", "set state error").Return(nil).Once(), + ) + }, + expectedErr: true, + }, + { + name: "skeleton test - error on SetPhase", + setupMock: func(s *migrationstore.MockStore) { + mock.InOrder( + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + }, nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(errors.New("set phase error")).Once(), + s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), + s.On("SetError", "set phase error").Return(nil).Once(), + ) + }, + expectedErr: true, + }, + { + name: "skeleton test - resume from InProgress state", + setupMock: func(s *migrationstore.MockStore) { + mock.InOrder( + s.On("GetStatus").Return(types.MigrationStatusResponse{ + State: types.MigrationStateInProgress, + Phase: types.MigrationPhasePreparation, + }, nil).Once(), + // Should still go through all phases (skeleton doesn't implement resume logic yet) + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), + s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), + s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), + ) + }, + expectedErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockStore := &migrationstore.MockStore{} + tt.setupMock(mockStore) + + mockManager := &migrationmanager.MockManager{} + controller, err := NewMigrationController( + WithManager(mockManager), + WithStore(mockStore), + ) + require.NoError(t, err) + + err = controller.Run(t.Context()) + + if tt.expectedErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + + mockStore.AssertExpectations(t) + }) + } +} diff --git a/api/docs/docs.go b/api/docs/docs.go index 386ecbe29f..6f5b4b34cc 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"},"valuePlaintext":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 4018110363..e97c37e3c3 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 1aa733b6b2..9b8669732d 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -1007,6 +1007,8 @@ components: - ignoreHostPreflights type: object types.LinuxInstallationConfig: + description: Config contains optional installation configuration that will be + merged with defaults properties: adminConsolePort: type: integer @@ -1042,6 +1044,61 @@ components: - resolved - values type: object + types.MigrationPhase: + description: Phase is the current phase of the migration process + enum: + - Discovery + - Preparation + - ECInstall + - DataTransfer + - Completed + example: Discovery + type: string + x-enum-varnames: + - MigrationPhaseDiscovery + - MigrationPhasePreparation + - MigrationPhaseECInstall + - MigrationPhaseDataTransfer + - MigrationPhaseCompleted + types.MigrationState: + description: State is the current state of the migration + enum: + - NotStarted + - InProgress + - Completed + - Failed + example: InProgress + type: string + x-enum-varnames: + - MigrationStateNotStarted + - MigrationStateInProgress + - MigrationStateCompleted + - MigrationStateFailed + types.MigrationStatusResponse: + description: Current status and progress of a migration + properties: + error: + description: Error contains the error message if the migration failed + example: "" + type: string + message: + description: Message is a user-facing message describing the current status + example: Discovering kURL cluster configuration + type: string + phase: + $ref: '#/components/schemas/types.MigrationPhase' + progress: + description: Progress is the completion percentage (0-100) + example: 25 + type: integer + state: + $ref: '#/components/schemas/types.MigrationState' + required: + - message + - phase + - progress + - state + type: object types.PatchAppConfigValuesRequest: properties: values: @@ -1091,6 +1148,31 @@ components: - strict - title type: object + types.StartMigrationRequest: + description: Request body for starting a migration from kURL to Embedded Cluster + properties: + config: + $ref: '#/components/schemas/types.LinuxInstallationConfig' + transferMode: + $ref: '#/components/schemas/types.TransferMode' + required: + - transferMode + type: object + types.StartMigrationResponse: + description: Response returned when a migration is successfully started + properties: + message: + description: Message is a user-facing message about the migration status + example: Migration started successfully + type: string + migrationId: + description: MigrationID is the unique identifier for this migration + example: 550e8400-e29b-41d4-a716-446655440000 + type: string + required: + - message + - migrationId + type: object types.State: enum: - Pending @@ -1124,6 +1206,16 @@ components: required: - values type: object + types.TransferMode: + description: TransferMode specifies whether to copy or move data during migration + enum: + - copy + - move + example: copy + type: string + x-enum-varnames: + - TransferModeCopy + - TransferModeMove types.UpgradeAppPreflightsStatusResponse: properties: allowIgnoreAppPreflights: @@ -2506,5 +2598,80 @@ paths: summary: Upgrade the infrastructure tags: - linux-upgrade + /migration/config: + get: + description: Get the installation config extracted from kURL merged with EC + defaults + operationId: getMigrationInstallationConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.LinuxInstallationConfigResponse' + description: OK + security: + - bearerauth: [] + summary: Get the installation config for migration + tags: + - migration + /migration/start: + post: + description: Start a migration from kURL to Embedded Cluster with the provided + configuration + operationId: postStartMigration + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartMigrationRequest' + description: Start Migration Request + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartMigrationResponse' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Bad Request + "409": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Conflict + security: + - bearerauth: [] + summary: Start a migration from kURL to Embedded Cluster + tags: + - migration + /migration/status: + get: + description: Get the current status and progress of the migration + operationId: getMigrationStatus + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.MigrationStatusResponse' + description: OK + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Not Found + security: + - bearerauth: [] + summary: Get the status of the migration + tags: + - migration servers: - url: /api diff --git a/api/handlers.go b/api/handlers.go index 45b684ca06..61dfdbee7e 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -8,6 +8,7 @@ import ( healthhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/health" kuberneteshandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/kubernetes" linuxhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/linux" + migrationhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/migration" "github.com/replicatedhq/embedded-cluster/api/types" ) @@ -17,6 +18,7 @@ type handlers struct { health *healthhandler.Handler linux *linuxhandler.Handler kubernetes *kuberneteshandler.Handler + migration *migrationhandler.Handler } func (a *API) initHandlers() error { @@ -67,6 +69,13 @@ func (a *API) initHandlers() error { return fmt.Errorf("new linux handler: %w", err) } a.handlers.linux = linuxHandler + + // Migration handler (Linux only) + migrationHandler := migrationhandler.New( + migrationhandler.WithLogger(a.logger), + migrationhandler.WithController(a.migrationController), + ) + a.handlers.migration = migrationHandler } else { // Kubernetes handler kubernetesHandler, err := kuberneteshandler.New( diff --git a/api/internal/handlers/migration/handler.go b/api/internal/handlers/migration/handler.go new file mode 100644 index 0000000000..71c34c9edd --- /dev/null +++ b/api/internal/handlers/migration/handler.go @@ -0,0 +1,133 @@ +package migration + +import ( + "net/http" + + "github.com/replicatedhq/embedded-cluster/api/controllers/migration" + "github.com/replicatedhq/embedded-cluster/api/internal/handlers/utils" + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/sirupsen/logrus" +) + +type Handler struct { + logger logrus.FieldLogger + controller migration.Controller +} + +type Option func(*Handler) + +func WithLogger(logger logrus.FieldLogger) Option { + return func(h *Handler) { + h.logger = logger + } +} + +func WithController(controller migration.Controller) Option { + return func(h *Handler) { + h.controller = controller + } +} + +func New(opts ...Option) *Handler { + h := &Handler{} + for _, opt := range opts { + opt(h) + } + return h +} + +// GetInstallationConfig handler to get the installation config for migration +// +// @ID getMigrationInstallationConfig +// @Summary Get the installation config for migration +// @Description Get the installation config extracted from kURL merged with EC defaults +// @Tags migration +// @Security bearerauth +// @Produce json +// @Success 200 {object} types.LinuxInstallationConfigResponse +// @Router /migration/config [get] +func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) { + config, err := h.controller.GetInstallationConfig(r.Context()) + if err != nil { + utils.LogError(r, err, h.logger, "failed to get installation config") + utils.JSONError(w, r, err, h.logger) + return + } + + utils.JSON(w, r, http.StatusOK, config, h.logger) +} + +// PostStartMigration handler to start a migration from kURL to Embedded Cluster +// +// @ID postStartMigration +// @Summary Start a migration from kURL to Embedded Cluster +// @Description Start a migration from kURL to Embedded Cluster with the provided configuration +// @Tags migration +// @Security bearerauth +// @Accept json +// @Produce json +// @Param request body types.StartMigrationRequest true "Start Migration Request" +// @Success 200 {object} types.StartMigrationResponse +// @Failure 400 {object} types.APIError +// @Failure 409 {object} types.APIError +// @Router /migration/start [post] +func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { + var request types.StartMigrationRequest + if err := utils.BindJSON(w, r, &request, h.logger); err != nil { + return + } + + // Default transfer mode to "copy" if empty + if request.TransferMode == "" { + request.TransferMode = types.TransferModeCopy + } + + // Validate transfer mode + if request.TransferMode != types.TransferModeCopy && request.TransferMode != types.TransferModeMove { + utils.LogError(r, types.ErrInvalidTransferMode, h.logger, "invalid transfer mode") + utils.JSONError(w, r, types.NewBadRequestError(types.ErrInvalidTransferMode), h.logger) + return + } + + // Use empty config if not provided + config := types.LinuxInstallationConfig{} + if request.Config != nil { + config = *request.Config + } + + migrationID, err := h.controller.StartMigration(r.Context(), request.TransferMode, config) + if err != nil { + utils.LogError(r, err, h.logger, "failed to start migration") + utils.JSONError(w, r, err, h.logger) + return + } + + response := types.StartMigrationResponse{ + MigrationID: migrationID, + Message: "Migration started successfully", + } + + utils.JSON(w, r, http.StatusOK, response, h.logger) +} + +// GetMigrationStatus handler to get the status of the migration +// +// @ID getMigrationStatus +// @Summary Get the status of the migration +// @Description Get the current status and progress of the migration +// @Tags migration +// @Security bearerauth +// @Produce json +// @Success 200 {object} types.MigrationStatusResponse +// @Failure 404 {object} types.APIError +// @Router /migration/status [get] +func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { + status, err := h.controller.GetMigrationStatus(r.Context()) + if err != nil { + utils.LogError(r, err, h.logger, "failed to get migration status") + utils.JSONError(w, r, err, h.logger) + return + } + + utils.JSON(w, r, http.StatusOK, status, h.logger) +} diff --git a/api/internal/handlers/migration/handler_test.go b/api/internal/handlers/migration/handler_test.go new file mode 100644 index 0000000000..7374548578 --- /dev/null +++ b/api/internal/handlers/migration/handler_test.go @@ -0,0 +1,336 @@ +package migration + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/replicatedhq/embedded-cluster/api/pkg/logger" + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +// MockController is a mock implementation of migration.Controller +type MockController struct { + mock.Mock +} + +func (m *MockController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { + args := m.Called(ctx) + return args.Get(0).(types.LinuxInstallationConfigResponse), args.Error(1) +} + +func (m *MockController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { + args := m.Called(ctx, transferMode, config) + return args.String(0), args.Error(1) +} + +func (m *MockController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { + args := m.Called(ctx) + return args.Get(0).(types.MigrationStatusResponse), args.Error(1) +} + +func (m *MockController) Run(ctx context.Context) error { + args := m.Called(ctx) + return args.Error(0) +} + +func TestGetInstallationConfig(t *testing.T) { + tests := []struct { + name string + setupMock func(*MockController) + expectedStatus int + checkResponse func(*testing.T, *httptest.ResponseRecorder) + }{ + { + name: "successful response", + setupMock: func(mc *MockController) { + mc.On("GetInstallationConfig", mock.Anything).Return( + types.LinuxInstallationConfigResponse{ + Values: types.LinuxInstallationConfig{ + PodCIDR: "10.244.0.0/16", + ServiceCIDR: "10.96.0.0/12", + }, + Defaults: types.LinuxInstallationConfig{ + PodCIDR: "10.244.0.0/16", + ServiceCIDR: "10.96.0.0/12", + }, + Resolved: types.LinuxInstallationConfig{ + PodCIDR: "10.244.0.0/16", + ServiceCIDR: "10.96.0.0/12", + }, + }, + nil, + ) + }, + expectedStatus: http.StatusOK, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var response types.LinuxInstallationConfigResponse + err := json.Unmarshal(rec.Body.Bytes(), &response) + require.NoError(t, err) + assert.Equal(t, "10.244.0.0/16", response.Values.PodCIDR) + assert.Equal(t, "10.96.0.0/12", response.Values.ServiceCIDR) + }, + }, + { + name: "controller error", + setupMock: func(mc *MockController) { + mc.On("GetInstallationConfig", mock.Anything).Return( + types.LinuxInstallationConfigResponse{}, + fmt.Errorf("controller error"), + ) + }, + expectedStatus: http.StatusInternalServerError, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var apiErr types.APIError + err := json.Unmarshal(rec.Body.Bytes(), &apiErr) + require.NoError(t, err) + assert.Contains(t, apiErr.Message, "controller error") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockController := &MockController{} + tt.setupMock(mockController) + + handler := New( + WithController(mockController), + WithLogger(logger.NewDiscardLogger()), + ) + + req := httptest.NewRequest(http.MethodGet, "/migration/config", nil) + rec := httptest.NewRecorder() + + handler.GetInstallationConfig(rec, req) + + assert.Equal(t, tt.expectedStatus, rec.Code) + tt.checkResponse(t, rec) + mockController.AssertExpectations(t) + }) + } +} + +func TestPostStartMigration(t *testing.T) { + tests := []struct { + name string + requestBody interface{} + setupMock func(*MockController) + expectedStatus int + checkResponse func(*testing.T, *httptest.ResponseRecorder) + }{ + { + name: "successful start with copy mode", + requestBody: types.StartMigrationRequest{ + TransferMode: types.TransferModeCopy, + Config: &types.LinuxInstallationConfig{ + PodCIDR: "10.244.0.0/16", + ServiceCIDR: "10.96.0.0/12", + }, + }, + setupMock: func(mc *MockController) { + mc.On("StartMigration", mock.Anything, types.TransferModeCopy, mock.MatchedBy(func(cfg types.LinuxInstallationConfig) bool { + return cfg.PodCIDR == "10.244.0.0/16" && cfg.ServiceCIDR == "10.96.0.0/12" + })).Return("550e8400-e29b-41d4-a716-446655440000", nil) + }, + expectedStatus: http.StatusOK, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var response types.StartMigrationResponse + err := json.Unmarshal(rec.Body.Bytes(), &response) + require.NoError(t, err) + assert.Equal(t, "550e8400-e29b-41d4-a716-446655440000", response.MigrationID) + assert.Equal(t, "Migration started successfully", response.Message) + }, + }, + { + name: "successful start with move mode", + requestBody: types.StartMigrationRequest{ + TransferMode: types.TransferModeMove, + Config: nil, + }, + setupMock: func(mc *MockController) { + mc.On("StartMigration", mock.Anything, types.TransferModeMove, types.LinuxInstallationConfig{}).Return("test-uuid", nil) + }, + expectedStatus: http.StatusOK, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var response types.StartMigrationResponse + err := json.Unmarshal(rec.Body.Bytes(), &response) + require.NoError(t, err) + assert.Equal(t, "test-uuid", response.MigrationID) + }, + }, + { + name: "default to copy when mode is empty", + requestBody: types.StartMigrationRequest{ + TransferMode: "", + Config: nil, + }, + setupMock: func(mc *MockController) { + mc.On("StartMigration", mock.Anything, types.TransferModeCopy, types.LinuxInstallationConfig{}).Return("test-uuid", nil) + }, + expectedStatus: http.StatusOK, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var response types.StartMigrationResponse + err := json.Unmarshal(rec.Body.Bytes(), &response) + require.NoError(t, err) + assert.Equal(t, "test-uuid", response.MigrationID) + }, + }, + { + name: "invalid request body", + requestBody: "invalid json", + setupMock: func(mc *MockController) {}, + expectedStatus: http.StatusBadRequest, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var apiErr types.APIError + err := json.Unmarshal(rec.Body.Bytes(), &apiErr) + require.NoError(t, err) + assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode) + }, + }, + { + name: "migration already started", + requestBody: types.StartMigrationRequest{ + TransferMode: types.TransferModeCopy, + Config: nil, + }, + setupMock: func(mc *MockController) { + mc.On("StartMigration", mock.Anything, types.TransferModeCopy, types.LinuxInstallationConfig{}).Return("", types.NewConflictError(types.ErrMigrationAlreadyStarted)) + }, + expectedStatus: http.StatusConflict, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var apiErr types.APIError + err := json.Unmarshal(rec.Body.Bytes(), &apiErr) + require.NoError(t, err) + assert.Equal(t, http.StatusConflict, apiErr.StatusCode) + assert.Contains(t, apiErr.Message, "migration already started") + }, + }, + { + name: "invalid transfer mode", + requestBody: types.StartMigrationRequest{ + TransferMode: "invalid", + Config: nil, + }, + setupMock: func(mc *MockController) {}, + expectedStatus: http.StatusBadRequest, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var apiErr types.APIError + err := json.Unmarshal(rec.Body.Bytes(), &apiErr) + require.NoError(t, err) + assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode) + assert.Contains(t, apiErr.Message, "invalid transfer mode") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockController := &MockController{} + tt.setupMock(mockController) + + handler := New( + WithController(mockController), + WithLogger(logger.NewDiscardLogger()), + ) + + var body []byte + var err error + if str, ok := tt.requestBody.(string); ok { + body = []byte(str) + } else { + body, err = json.Marshal(tt.requestBody) + require.NoError(t, err) + } + + req := httptest.NewRequest(http.MethodPost, "/migration/start", bytes.NewReader(body)) + req.Header.Set("Content-Type", "application/json") + rec := httptest.NewRecorder() + + handler.PostStartMigration(rec, req) + + assert.Equal(t, tt.expectedStatus, rec.Code) + tt.checkResponse(t, rec) + mockController.AssertExpectations(t) + }) + } +} + +func TestGetMigrationStatus(t *testing.T) { + tests := []struct { + name string + setupMock func(*MockController) + expectedStatus int + checkResponse func(*testing.T, *httptest.ResponseRecorder) + }{ + { + name: "successful response with active migration", + setupMock: func(mc *MockController) { + mc.On("GetMigrationStatus", mock.Anything).Return( + types.MigrationStatusResponse{ + State: types.MigrationStateInProgress, + Phase: types.MigrationPhaseDiscovery, + Message: "Discovering kURL cluster configuration", + Progress: 25, + Error: "", + }, + nil, + ) + }, + expectedStatus: http.StatusOK, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var response types.MigrationStatusResponse + err := json.Unmarshal(rec.Body.Bytes(), &response) + require.NoError(t, err) + assert.Equal(t, types.MigrationStateInProgress, response.State) + assert.Equal(t, types.MigrationPhaseDiscovery, response.Phase) + assert.Equal(t, 25, response.Progress) + }, + }, + { + name: "no active migration", + setupMock: func(mc *MockController) { + mc.On("GetMigrationStatus", mock.Anything).Return( + types.MigrationStatusResponse{}, + types.NewNotFoundError(types.ErrNoActiveMigration), + ) + }, + expectedStatus: http.StatusNotFound, + checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { + var apiErr types.APIError + err := json.Unmarshal(rec.Body.Bytes(), &apiErr) + require.NoError(t, err) + assert.Equal(t, http.StatusNotFound, apiErr.StatusCode) + assert.Contains(t, apiErr.Message, "no active migration") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockController := &MockController{} + tt.setupMock(mockController) + + handler := New( + WithController(mockController), + WithLogger(logger.NewDiscardLogger()), + ) + + req := httptest.NewRequest(http.MethodGet, "/migration/status", nil) + rec := httptest.NewRecorder() + + handler.GetMigrationStatus(rec, req) + + assert.Equal(t, tt.expectedStatus, rec.Code) + tt.checkResponse(t, rec) + mockController.AssertExpectations(t) + }) + } +} diff --git a/api/internal/managers/migration/manager.go b/api/internal/managers/migration/manager.go new file mode 100644 index 0000000000..2b28f25cbb --- /dev/null +++ b/api/internal/managers/migration/manager.go @@ -0,0 +1,214 @@ +package migration + +import ( + "context" + "fmt" + + linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" + "github.com/replicatedhq/embedded-cluster/api/pkg/logger" + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/sirupsen/logrus" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var _ Manager = &migrationManager{} + +// Manager provides methods for managing kURL to EC migrations +type Manager interface { + // GetKurlConfig extracts configuration from the running kURL cluster + GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) + + // GetECDefaults returns EC default configuration + GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) + + // MergeConfigs merges user, kURL, and default configs with proper precedence + // Precedence order: userConfig > kurlConfig > defaults + MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig + + // ValidateTransferMode validates the transfer mode is "copy" or "move" + ValidateTransferMode(mode types.TransferMode) error + + // ExecutePhase executes a migration phase + ExecutePhase(ctx context.Context, phase types.MigrationPhase) error +} + +// migrationManager is an implementation of the Manager interface +type migrationManager struct { + kubeClient client.Client + kurlPasswordHash string + installationManager linuxinstallation.InstallationManager + logger logrus.FieldLogger +} + +type ManagerOption func(*migrationManager) + +func WithLogger(logger logrus.FieldLogger) ManagerOption { + return func(m *migrationManager) { + m.logger = logger + } +} + +func WithKubeClient(kcli client.Client) ManagerOption { + return func(m *migrationManager) { + m.kubeClient = kcli + } +} + +func WithKurlPasswordHash(hash string) ManagerOption { + return func(m *migrationManager) { + m.kurlPasswordHash = hash + } +} + +func WithInstallationManager(im linuxinstallation.InstallationManager) ManagerOption { + return func(m *migrationManager) { + m.installationManager = im + } +} + +// NewManager creates a new migration Manager with the provided options +func NewManager(opts ...ManagerOption) *migrationManager { + manager := &migrationManager{} + + for _, opt := range opts { + opt(manager) + } + + if manager.logger == nil { + manager.logger = logger.NewDiscardLogger() + } + + return manager +} + +// GetKurlConfig extracts configuration from the running kURL cluster +func (m *migrationManager) GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) { + // TODO: Implement kURL cluster configuration extraction in future PR + // This will query the kURL cluster for: + // - Pod and Service CIDRs from kube-controller-manager + // - Network configuration + // - Admin console port + // - Data directory + // - Local artifact mirror port + // - Proxy settings + m.logger.Debug("GetKurlConfig: Skeleton implementation, returning empty config") + return types.LinuxInstallationConfig{}, nil +} + +// GetECDefaults returns EC default configuration +func (m *migrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { + if m.installationManager == nil { + return types.LinuxInstallationConfig{}, fmt.Errorf("installation manager not configured") + } + + // TODO: Pass proper RuntimeConfig when available + // For now, we'll need to determine how to get the runtime config in the migration context + m.logger.Debug("GetECDefaults: Delegating to installation manager") + return types.LinuxInstallationConfig{}, fmt.Errorf("GetECDefaults: requires RuntimeConfig - implement in future PR") +} + +// MergeConfigs merges user, kURL, and default configs with proper precedence +// Precedence order: userConfig > kurlConfig > defaults +func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { + merged := types.LinuxInstallationConfig{} + + // Start with defaults as the base + merged = defaults + + // Apply kURL config, overwriting defaults only for non-zero values + if kurlConfig.AdminConsolePort != 0 { + merged.AdminConsolePort = kurlConfig.AdminConsolePort + } + if kurlConfig.DataDirectory != "" { + merged.DataDirectory = kurlConfig.DataDirectory + } + if kurlConfig.LocalArtifactMirrorPort != 0 { + merged.LocalArtifactMirrorPort = kurlConfig.LocalArtifactMirrorPort + } + if kurlConfig.HTTPProxy != "" { + merged.HTTPProxy = kurlConfig.HTTPProxy + } + if kurlConfig.HTTPSProxy != "" { + merged.HTTPSProxy = kurlConfig.HTTPSProxy + } + if kurlConfig.NoProxy != "" { + merged.NoProxy = kurlConfig.NoProxy + } + if kurlConfig.NetworkInterface != "" { + merged.NetworkInterface = kurlConfig.NetworkInterface + } + if kurlConfig.PodCIDR != "" { + merged.PodCIDR = kurlConfig.PodCIDR + } + if kurlConfig.ServiceCIDR != "" { + merged.ServiceCIDR = kurlConfig.ServiceCIDR + } + if kurlConfig.GlobalCIDR != "" { + merged.GlobalCIDR = kurlConfig.GlobalCIDR + } + + // Apply user config, overwriting merged values only for non-zero values + // This gives user config the highest precedence + if userConfig.AdminConsolePort != 0 { + merged.AdminConsolePort = userConfig.AdminConsolePort + } + if userConfig.DataDirectory != "" { + merged.DataDirectory = userConfig.DataDirectory + } + if userConfig.LocalArtifactMirrorPort != 0 { + merged.LocalArtifactMirrorPort = userConfig.LocalArtifactMirrorPort + } + if userConfig.HTTPProxy != "" { + merged.HTTPProxy = userConfig.HTTPProxy + } + if userConfig.HTTPSProxy != "" { + merged.HTTPSProxy = userConfig.HTTPSProxy + } + if userConfig.NoProxy != "" { + merged.NoProxy = userConfig.NoProxy + } + if userConfig.NetworkInterface != "" { + merged.NetworkInterface = userConfig.NetworkInterface + } + if userConfig.PodCIDR != "" { + merged.PodCIDR = userConfig.PodCIDR + } + if userConfig.ServiceCIDR != "" { + merged.ServiceCIDR = userConfig.ServiceCIDR + } + if userConfig.GlobalCIDR != "" { + merged.GlobalCIDR = userConfig.GlobalCIDR + } + + m.logger.WithFields(logrus.Fields{ + "userConfig": userConfig, + "kurlConfig": kurlConfig, + "defaults": defaults, + "mergedConfig": merged, + }).Debug("MergeConfigs: Merged configuration with precedence user > kURL > defaults") + + return merged +} + +// ValidateTransferMode validates the transfer mode is "copy" or "move" +func (m *migrationManager) ValidateTransferMode(mode types.TransferMode) error { + switch mode { + case types.TransferModeCopy, types.TransferModeMove: + return nil + default: + return fmt.Errorf("%w: must be 'copy' or 'move', got '%s'", types.ErrInvalidTransferMode, mode) + } +} + +// ExecutePhase executes a migration phase +func (m *migrationManager) ExecutePhase(ctx context.Context, phase types.MigrationPhase) error { + // TODO: Implement phase execution in PR 8 + // This will handle: + // - Discovery phase: GetKurlConfig, validate cluster + // - Preparation phase: Backup, pre-migration checks + // - ECInstall phase: Install EC alongside kURL + // - DataTransfer phase: Copy/move data from kURL to EC + // - Completed phase: Final validation, cleanup + m.logger.WithField("phase", phase).Debug("ExecutePhase: Skeleton implementation") + return fmt.Errorf("ExecutePhase: not yet implemented (coming in PR 8)") +} diff --git a/api/internal/managers/migration/manager_mock.go b/api/internal/managers/migration/manager_mock.go new file mode 100644 index 0000000000..e8a4b04bad --- /dev/null +++ b/api/internal/managers/migration/manager_mock.go @@ -0,0 +1,51 @@ +package migration + +import ( + "context" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/mock" +) + +var _ Manager = (*MockManager)(nil) + +// MockManager is a mock implementation of the Manager interface +type MockManager struct { + mock.Mock +} + +// GetKurlConfig mocks the GetKurlConfig method +func (m *MockManager) GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) { + args := m.Called(ctx) + if args.Get(0) == nil { + return types.LinuxInstallationConfig{}, args.Error(1) + } + return args.Get(0).(types.LinuxInstallationConfig), args.Error(1) +} + +// GetECDefaults mocks the GetECDefaults method +func (m *MockManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { + args := m.Called(ctx) + if args.Get(0) == nil { + return types.LinuxInstallationConfig{}, args.Error(1) + } + return args.Get(0).(types.LinuxInstallationConfig), args.Error(1) +} + +// MergeConfigs mocks the MergeConfigs method +func (m *MockManager) MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { + args := m.Called(userConfig, kurlConfig, defaults) + return args.Get(0).(types.LinuxInstallationConfig) +} + +// ValidateTransferMode mocks the ValidateTransferMode method +func (m *MockManager) ValidateTransferMode(mode types.TransferMode) error { + args := m.Called(mode) + return args.Error(0) +} + +// ExecutePhase mocks the ExecutePhase method +func (m *MockManager) ExecutePhase(ctx context.Context, phase types.MigrationPhase) error { + args := m.Called(ctx, phase) + return args.Error(0) +} diff --git a/api/internal/managers/migration/manager_test.go b/api/internal/managers/migration/manager_test.go new file mode 100644 index 0000000000..6d92a7b586 --- /dev/null +++ b/api/internal/managers/migration/manager_test.go @@ -0,0 +1,171 @@ +package migration + +import ( + "testing" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/assert" +) + +func TestValidateTransferMode(t *testing.T) { + tests := []struct { + name string + mode types.TransferMode + wantErr bool + }{ + { + name: "valid copy mode", + mode: types.TransferModeCopy, + wantErr: false, + }, + { + name: "valid move mode", + mode: types.TransferModeMove, + wantErr: false, + }, + { + name: "invalid empty mode", + mode: "", + wantErr: true, + }, + { + name: "invalid unknown mode", + mode: "unknown", + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := NewManager() + err := m.ValidateTransferMode(tt.mode) + if tt.wantErr { + assert.Error(t, err) + assert.ErrorIs(t, err, types.ErrInvalidTransferMode) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestMergeConfigs(t *testing.T) { + tests := []struct { + name string + userConfig types.LinuxInstallationConfig + kurlConfig types.LinuxInstallationConfig + defaults types.LinuxInstallationConfig + want types.LinuxInstallationConfig + }{ + { + name: "user config takes precedence", + userConfig: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + DataDirectory: "/user/data", + }, + kurlConfig: types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + DataDirectory: "/kurl/data", + }, + defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + }, + want: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + DataDirectory: "/user/data", + }, + }, + { + name: "kurl config takes precedence over defaults", + userConfig: types.LinuxInstallationConfig{}, + kurlConfig: types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + DataDirectory: "/kurl/data", + }, + defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + }, + want: types.LinuxInstallationConfig{ + AdminConsolePort: 9000, + DataDirectory: "/kurl/data", + }, + }, + { + name: "defaults used when no overrides", + userConfig: types.LinuxInstallationConfig{}, + kurlConfig: types.LinuxInstallationConfig{}, + defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + }, + want: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + }, + }, + { + name: "partial user override", + userConfig: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + }, + kurlConfig: types.LinuxInstallationConfig{ + DataDirectory: "/kurl/data", + }, + defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + HTTPProxy: "http://proxy.example.com", + }, + want: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + DataDirectory: "/kurl/data", + HTTPProxy: "http://proxy.example.com", + }, + }, + { + name: "all fields merged correctly", + userConfig: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + }, + kurlConfig: types.LinuxInstallationConfig{ + DataDirectory: "/kurl/data", + LocalArtifactMirrorPort: 50000, + NetworkInterface: "eth0", + }, + defaults: types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/default/data", + LocalArtifactMirrorPort: 50001, + HTTPProxy: "http://proxy.example.com", + HTTPSProxy: "https://proxy.example.com", + NoProxy: "localhost", + NetworkInterface: "eth1", + PodCIDR: "10.0.0.0/16", + ServiceCIDR: "10.1.0.0/16", + GlobalCIDR: "10.2.0.0/16", + }, + want: types.LinuxInstallationConfig{ + AdminConsolePort: 8080, + DataDirectory: "/kurl/data", + LocalArtifactMirrorPort: 50000, + HTTPProxy: "http://proxy.example.com", + HTTPSProxy: "https://proxy.example.com", + NoProxy: "localhost", + NetworkInterface: "eth0", + PodCIDR: "10.0.0.0/16", + ServiceCIDR: "10.1.0.0/16", + GlobalCIDR: "10.2.0.0/16", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := NewManager() + got := m.MergeConfigs(tt.userConfig, tt.kurlConfig, tt.defaults) + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/api/internal/store/migration/example_test.go b/api/internal/store/migration/example_test.go new file mode 100644 index 0000000000..adcb764e9a --- /dev/null +++ b/api/internal/store/migration/example_test.go @@ -0,0 +1,72 @@ +package migration_test + +import ( + "fmt" + + "github.com/replicatedhq/embedded-cluster/api/internal/store" + "github.com/replicatedhq/embedded-cluster/api/types" +) + +func ExampleStore_complete_migration_flow() { + // Create a new global store + globalStore := store.NewMemoryStore() + + // Get the migration store + migrationStore := globalStore.MigrationStore() + + // Initialize a new migration + config := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + } + + err := migrationStore.InitializeMigration("migration-123", "copy", config) + if err != nil { + fmt.Printf("Error initializing migration: %v\n", err) + return + } + + // Get migration ID + id, err := migrationStore.GetMigrationID() + if err != nil { + fmt.Printf("Error getting migration ID: %v\n", err) + return + } + fmt.Printf("Migration ID: %s\n", id) + + // Update migration state and phase + migrationStore.SetState(types.MigrationStateInProgress) + migrationStore.SetPhase(types.MigrationPhaseDiscovery) + migrationStore.SetMessage("Discovering kURL cluster configuration") + migrationStore.SetProgress(10) + + // Get status + status, err := migrationStore.GetStatus() + if err != nil { + fmt.Printf("Error getting status: %v\n", err) + return + } + + fmt.Printf("State: %s\n", status.State) + fmt.Printf("Phase: %s\n", status.Phase) + fmt.Printf("Message: %s\n", status.Message) + fmt.Printf("Progress: %d%%\n", status.Progress) + + // Continue migration + migrationStore.SetPhase(types.MigrationPhasePreparation) + migrationStore.SetMessage("Preparing migration environment") + migrationStore.SetProgress(25) + + // Complete migration + migrationStore.SetState(types.MigrationStateCompleted) + migrationStore.SetPhase(types.MigrationPhaseCompleted) + migrationStore.SetMessage("Migration completed successfully") + migrationStore.SetProgress(100) + + // Output: + // Migration ID: migration-123 + // State: InProgress + // Phase: Discovery + // Message: Discovering kURL cluster configuration + // Progress: 10% +} diff --git a/api/internal/store/migration/store.go b/api/internal/store/migration/store.go new file mode 100644 index 0000000000..aee6034183 --- /dev/null +++ b/api/internal/store/migration/store.go @@ -0,0 +1,242 @@ +// Package migration provides a store implementation for managing kURL to Embedded Cluster migration state. +package migration + +import ( + "sync" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/tiendc/go-deepcopy" +) + +var _ Store = &memoryStore{} + +// Store provides methods for storing and retrieving migration state +type Store interface { + // InitializeMigration sets up a new migration with ID, transfer mode, and config + InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error + + // GetMigrationID returns the current migration ID, or error if none exists + GetMigrationID() (string, error) + + // GetStatus returns the current migration status + GetStatus() (types.MigrationStatusResponse, error) + + // SetState updates the migration state + SetState(state types.MigrationState) error + + // SetPhase updates the migration phase + SetPhase(phase types.MigrationPhase) error + + // SetMessage updates the status message + SetMessage(message string) error + + // SetProgress updates the progress percentage + SetProgress(progress int) error + + // SetError updates the error message + SetError(err string) error + + // GetTransferMode returns the transfer mode + GetTransferMode() (string, error) + + // GetConfig returns the installation config + GetConfig() (types.LinuxInstallationConfig, error) +} + +// memoryStore is an in-memory implementation of Store +type memoryStore struct { + migrationID string + transferMode string + config types.LinuxInstallationConfig + status types.MigrationStatusResponse + initialized bool + mu sync.RWMutex +} + +type StoreOption func(*memoryStore) + +// WithMigrationID sets the migration ID +func WithMigrationID(id string) StoreOption { + return func(s *memoryStore) { + s.migrationID = id + s.initialized = true + } +} + +// WithTransferMode sets the transfer mode +func WithTransferMode(mode string) StoreOption { + return func(s *memoryStore) { + s.transferMode = mode + } +} + +// WithConfig sets the installation config +func WithConfig(config types.LinuxInstallationConfig) StoreOption { + return func(s *memoryStore) { + s.config = config + } +} + +// WithStatus sets the migration status +func WithStatus(status types.MigrationStatusResponse) StoreOption { + return func(s *memoryStore) { + s.status = status + } +} + +// NewMemoryStore creates a new memory store +func NewMemoryStore(opts ...StoreOption) Store { + s := &memoryStore{ + status: types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + Message: "", + Progress: 0, + Error: "", + }, + } + + for _, opt := range opts { + opt(s) + } + + return s +} + +func (s *memoryStore) InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error { + s.mu.Lock() + defer s.mu.Unlock() + + if s.initialized { + return types.ErrMigrationAlreadyStarted + } + + s.migrationID = migrationID + s.transferMode = transferMode + s.config = config + s.initialized = true + + s.status = types.MigrationStatusResponse{ + State: types.MigrationStateNotStarted, + Phase: types.MigrationPhaseDiscovery, + Message: "", + Progress: 0, + Error: "", + } + + return nil +} + +func (s *memoryStore) GetMigrationID() (string, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + if !s.initialized { + return "", types.ErrNoActiveMigration + } + + return s.migrationID, nil +} + +func (s *memoryStore) GetStatus() (types.MigrationStatusResponse, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + if !s.initialized { + return types.MigrationStatusResponse{}, types.ErrNoActiveMigration + } + + var status types.MigrationStatusResponse + if err := deepcopy.Copy(&status, &s.status); err != nil { + return types.MigrationStatusResponse{}, err + } + + return status, nil +} + +func (s *memoryStore) SetState(state types.MigrationState) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return types.ErrNoActiveMigration + } + + s.status.State = state + return nil +} + +func (s *memoryStore) SetPhase(phase types.MigrationPhase) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return types.ErrNoActiveMigration + } + + s.status.Phase = phase + return nil +} + +func (s *memoryStore) SetMessage(message string) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return types.ErrNoActiveMigration + } + + s.status.Message = message + return nil +} + +func (s *memoryStore) SetProgress(progress int) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return types.ErrNoActiveMigration + } + + s.status.Progress = progress + return nil +} + +func (s *memoryStore) SetError(err string) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return types.ErrNoActiveMigration + } + + s.status.Error = err + return nil +} + +func (s *memoryStore) GetTransferMode() (string, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + if !s.initialized { + return "", types.ErrNoActiveMigration + } + + return s.transferMode, nil +} + +func (s *memoryStore) GetConfig() (types.LinuxInstallationConfig, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + if !s.initialized { + return types.LinuxInstallationConfig{}, types.ErrNoActiveMigration + } + + var config types.LinuxInstallationConfig + if err := deepcopy.Copy(&config, &s.config); err != nil { + return types.LinuxInstallationConfig{}, err + } + + return config, nil +} diff --git a/api/internal/store/migration/store_mock.go b/api/internal/store/migration/store_mock.go new file mode 100644 index 0000000000..ec69197073 --- /dev/null +++ b/api/internal/store/migration/store_mock.go @@ -0,0 +1,69 @@ +package migration + +import ( + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/mock" +) + +var _ Store = (*MockStore)(nil) + +// MockStore is a mock implementation of Store +type MockStore struct { + mock.Mock +} + +func (m *MockStore) InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error { + args := m.Called(migrationID, transferMode, config) + return args.Error(0) +} + +func (m *MockStore) GetMigrationID() (string, error) { + args := m.Called() + return args.Get(0).(string), args.Error(1) +} + +func (m *MockStore) GetStatus() (types.MigrationStatusResponse, error) { + args := m.Called() + if args.Get(0) == nil { + return types.MigrationStatusResponse{}, args.Error(1) + } + return args.Get(0).(types.MigrationStatusResponse), args.Error(1) +} + +func (m *MockStore) SetState(state types.MigrationState) error { + args := m.Called(state) + return args.Error(0) +} + +func (m *MockStore) SetPhase(phase types.MigrationPhase) error { + args := m.Called(phase) + return args.Error(0) +} + +func (m *MockStore) SetMessage(message string) error { + args := m.Called(message) + return args.Error(0) +} + +func (m *MockStore) SetProgress(progress int) error { + args := m.Called(progress) + return args.Error(0) +} + +func (m *MockStore) SetError(err string) error { + args := m.Called(err) + return args.Error(0) +} + +func (m *MockStore) GetTransferMode() (string, error) { + args := m.Called() + return args.Get(0).(string), args.Error(1) +} + +func (m *MockStore) GetConfig() (types.LinuxInstallationConfig, error) { + args := m.Called() + if args.Get(0) == nil { + return types.LinuxInstallationConfig{}, args.Error(1) + } + return args.Get(0).(types.LinuxInstallationConfig), args.Error(1) +} diff --git a/api/internal/store/migration/store_test.go b/api/internal/store/migration/store_test.go new file mode 100644 index 0000000000..5ed38849c5 --- /dev/null +++ b/api/internal/store/migration/store_test.go @@ -0,0 +1,230 @@ +package migration + +import ( + "testing" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/assert" +) + +func TestNewMemoryStore(t *testing.T) { + store := NewMemoryStore() + assert.NotNil(t, store) + + // Should return error when no migration is initialized + _, err := store.GetMigrationID() + assert.ErrorIs(t, err, types.ErrNoActiveMigration) +} + +func TestInitializeMigration(t *testing.T) { + store := NewMemoryStore() + + config := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + } + + err := store.InitializeMigration("test-migration-id", "copy", config) + assert.NoError(t, err) + + // Verify migration ID + id, err := store.GetMigrationID() + assert.NoError(t, err) + assert.Equal(t, "test-migration-id", id) + + // Verify transfer mode + mode, err := store.GetTransferMode() + assert.NoError(t, err) + assert.Equal(t, "copy", mode) + + // Verify config + retrievedConfig, err := store.GetConfig() + assert.NoError(t, err) + assert.Equal(t, config.AdminConsolePort, retrievedConfig.AdminConsolePort) + assert.Equal(t, config.DataDirectory, retrievedConfig.DataDirectory) + + // Verify initial status + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, types.MigrationStateNotStarted, status.State) + assert.Equal(t, types.MigrationPhaseDiscovery, status.Phase) + assert.Equal(t, "", status.Message) + assert.Equal(t, 0, status.Progress) + assert.Equal(t, "", status.Error) +} + +func TestInitializeMigrationTwice(t *testing.T) { + store := NewMemoryStore() + + config := types.LinuxInstallationConfig{} + + err := store.InitializeMigration("first-id", "copy", config) + assert.NoError(t, err) + + // Second initialization should fail + err = store.InitializeMigration("second-id", "move", config) + assert.ErrorIs(t, err, types.ErrMigrationAlreadyStarted) +} + +func TestSetState(t *testing.T) { + store := NewMemoryStore() + + // Should return error when no migration is initialized + err := store.SetState(types.MigrationStateInProgress) + assert.ErrorIs(t, err, types.ErrNoActiveMigration) + + // Initialize migration + config := types.LinuxInstallationConfig{} + err = store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + // Update state + err = store.SetState(types.MigrationStateInProgress) + assert.NoError(t, err) + + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, types.MigrationStateInProgress, status.State) +} + +func TestSetPhase(t *testing.T) { + store := NewMemoryStore() + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + err = store.SetPhase(types.MigrationPhasePreparation) + assert.NoError(t, err) + + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, types.MigrationPhasePreparation, status.Phase) +} + +func TestSetMessage(t *testing.T) { + store := NewMemoryStore() + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + err = store.SetMessage("Preparing migration") + assert.NoError(t, err) + + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, "Preparing migration", status.Message) +} + +func TestSetProgress(t *testing.T) { + store := NewMemoryStore() + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + err = store.SetProgress(50) + assert.NoError(t, err) + + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, 50, status.Progress) +} + +func TestSetError(t *testing.T) { + store := NewMemoryStore() + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + err = store.SetError("migration failed") + assert.NoError(t, err) + + status, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, "migration failed", status.Error) +} + +func TestStoreOptions(t *testing.T) { + config := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + } + + status := types.MigrationStatusResponse{ + State: types.MigrationStateInProgress, + Phase: types.MigrationPhaseECInstall, + Message: "Installing EC", + Progress: 75, + } + + store := NewMemoryStore( + WithMigrationID("pre-initialized"), + WithTransferMode("move"), + WithConfig(config), + WithStatus(status), + ) + + // Verify migration is pre-initialized + id, err := store.GetMigrationID() + assert.NoError(t, err) + assert.Equal(t, "pre-initialized", id) + + mode, err := store.GetTransferMode() + assert.NoError(t, err) + assert.Equal(t, "move", mode) + + retrievedConfig, err := store.GetConfig() + assert.NoError(t, err) + assert.Equal(t, config.AdminConsolePort, retrievedConfig.AdminConsolePort) + + retrievedStatus, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, status.State, retrievedStatus.State) + assert.Equal(t, status.Phase, retrievedStatus.Phase) + assert.Equal(t, status.Message, retrievedStatus.Message) + assert.Equal(t, status.Progress, retrievedStatus.Progress) +} + +func TestDeepCopyPreventsConfigMutation(t *testing.T) { + store := NewMemoryStore() + + config := types.LinuxInstallationConfig{ + AdminConsolePort: 30000, + DataDirectory: "/var/lib/ec", + } + + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + // Get config and modify it + retrievedConfig, err := store.GetConfig() + assert.NoError(t, err) + retrievedConfig.AdminConsolePort = 99999 + retrievedConfig.DataDirectory = "/tmp/modified" + + // Verify original config in store is unchanged + retrievedConfig2, err := store.GetConfig() + assert.NoError(t, err) + assert.Equal(t, 30000, retrievedConfig2.AdminConsolePort) + assert.Equal(t, "/var/lib/ec", retrievedConfig2.DataDirectory) +} + +func TestDeepCopyPreventsStatusMutation(t *testing.T) { + store := NewMemoryStore() + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + assert.NoError(t, err) + + err = store.SetMessage("Original message") + assert.NoError(t, err) + + // Get status and modify it + status, err := store.GetStatus() + assert.NoError(t, err) + status.Message = "Modified message" + status.Progress = 99 + + // Verify original status in store is unchanged + status2, err := store.GetStatus() + assert.NoError(t, err) + assert.Equal(t, "Original message", status2.Message) + assert.Equal(t, 0, status2.Progress) +} diff --git a/api/internal/store/store.go b/api/internal/store/store.go index 6ab158dc1b..7b7a351840 100644 --- a/api/internal/store/store.go +++ b/api/internal/store/store.go @@ -10,6 +10,7 @@ import ( kubernetesinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/kubernetes/installation" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/installation" linuxpreflight "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/preflight" + "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" ) var _ Store = &memoryStore{} @@ -45,6 +46,9 @@ type Store interface { // AirgapStore provides access to airgap operations AirgapStore() airgap.Store + + // MigrationStore provides access to migration operations + MigrationStore() migration.Store } // StoreOption is a function that configures a store @@ -113,6 +117,13 @@ func WithAirgapStore(store airgap.Store) StoreOption { } } +// WithMigrationStore sets the migration store +func WithMigrationStore(store migration.Store) StoreOption { + return func(s *memoryStore) { + s.migrationStore = store + } +} + // memoryStore is an in-memory implementation of the global Store interface type memoryStore struct { linuxPreflightStore linuxpreflight.Store @@ -127,6 +138,7 @@ type memoryStore struct { appInstallStore appinstall.Store appUpgradeStore appupgrade.Store airgapStore airgap.Store + migrationStore migration.Store } // NewMemoryStore creates a new memory store with the given options @@ -177,6 +189,10 @@ func NewMemoryStore(opts ...StoreOption) Store { s.airgapStore = airgap.NewMemoryStore() } + if s.migrationStore == nil { + s.migrationStore = migration.NewMemoryStore() + } + return s } @@ -219,3 +235,7 @@ func (s *memoryStore) AppUpgradeStore() appupgrade.Store { func (s *memoryStore) AirgapStore() airgap.Store { return s.airgapStore } + +func (s *memoryStore) MigrationStore() migration.Store { + return s.migrationStore +} diff --git a/api/internal/store/store_mock.go b/api/internal/store/store_mock.go index e1d375ecad..24d0abdfae 100644 --- a/api/internal/store/store_mock.go +++ b/api/internal/store/store_mock.go @@ -1,8 +1,6 @@ package store import ( - "testing" - "github.com/replicatedhq/embedded-cluster/api/internal/store/airgap" appconfig "github.com/replicatedhq/embedded-cluster/api/internal/store/app/config" appinstall "github.com/replicatedhq/embedded-cluster/api/internal/store/app/install" @@ -12,6 +10,7 @@ import ( kubernetesinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/kubernetes/installation" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/installation" linuxpreflight "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/preflight" + "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" ) var _ Store = (*MockStore)(nil) @@ -28,6 +27,7 @@ type MockStore struct { AppInstallMockStore appinstall.MockStore AppUpgradeMockStore appupgrade.MockStore AirgapMockStore airgap.MockStore + MigrationMockStore migration.MockStore } // LinuxPreflightStore returns the mock linux preflight store @@ -80,15 +80,7 @@ func (m *MockStore) AirgapStore() airgap.Store { return &m.AirgapMockStore } -func (m *MockStore) AssertExpectations(t *testing.T) { - m.LinuxPreflightMockStore.AssertExpectations(t) - m.LinuxInstallationMockStore.AssertExpectations(t) - m.LinuxInfraMockStore.AssertExpectations(t) - m.KubernetesInstallationMockStore.AssertExpectations(t) - m.KubernetesInfraMockStore.AssertExpectations(t) - m.AppConfigMockStore.AssertExpectations(t) - m.AppPreflightMockStore.AssertExpectations(t) - m.AppInstallMockStore.AssertExpectations(t) - m.AppUpgradeMockStore.AssertExpectations(t) - m.AirgapMockStore.AssertExpectations(t) +// MigrationStore returns the mock migration store +func (m *MockStore) MigrationStore() migration.Store { + return &m.MigrationMockStore } diff --git a/api/routes.go b/api/routes.go index b0e7d43429..e22ef8b79d 100644 --- a/api/routes.go +++ b/api/routes.go @@ -45,6 +45,9 @@ func (a *API) RegisterRoutes(router *mux.Router) { func (a *API) registerLinuxRoutes(router *mux.Router) { linuxRouter := router.PathPrefix("/linux").Subrouter() + // Migration routes (not mode-specific) + a.registerMigrationRoutes(linuxRouter) + if a.cfg.Mode == types.ModeInstall { installRouter := linuxRouter.PathPrefix("/install").Subrouter() installRouter.HandleFunc("/installation/config", a.handlers.linux.Install.GetInstallationConfig).Methods("GET") @@ -132,3 +135,10 @@ func (a *API) registerConsoleRoutes(router *mux.Router) { consoleRouter := router.PathPrefix("/console").Subrouter() consoleRouter.HandleFunc("/available-network-interfaces", a.handlers.console.GetListAvailableNetworkInterfaces).Methods("GET") } + +func (a *API) registerMigrationRoutes(router *mux.Router) { + migrationRouter := router.PathPrefix("/migration").Subrouter() + migrationRouter.HandleFunc("/config", a.handlers.migration.GetInstallationConfig).Methods("GET") + migrationRouter.HandleFunc("/start", a.handlers.migration.PostStartMigration).Methods("POST") + migrationRouter.HandleFunc("/status", a.handlers.migration.GetMigrationStatus).Methods("GET") +} diff --git a/api/types/api.go b/api/types/api.go index a55bb536dc..5049aa9fce 100644 --- a/api/types/api.go +++ b/api/types/api.go @@ -6,6 +6,7 @@ import ( "github.com/replicatedhq/embedded-cluster/pkg/airgap" "github.com/replicatedhq/embedded-cluster/pkg/release" "github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig" + "sigs.k8s.io/controller-runtime/pkg/client" ) // APIConfig holds the configuration for the API server @@ -29,6 +30,7 @@ type APIConfig struct { LinuxConfig KubernetesConfig + MigrationConfig } type InstallTarget string @@ -53,3 +55,8 @@ type LinuxConfig struct { type KubernetesConfig struct { Installation kubernetesinstallation.Installation } + +type MigrationConfig struct { + KubeClient client.Client // For interacting with kURL cluster + KurlPasswordHash string // Bcrypt hash exported from kURL +} diff --git a/api/types/migration.go b/api/types/migration.go new file mode 100644 index 0000000000..18f59412ef --- /dev/null +++ b/api/types/migration.go @@ -0,0 +1,84 @@ +package types + +import ( + "errors" + "net/http" +) + +// Migration error constants +var ( + ErrNoActiveMigration = errors.New("no active migration") + ErrMigrationAlreadyStarted = errors.New("migration already started") + ErrInvalidTransferMode = errors.New("invalid transfer mode") +) + +// NewNotFoundError creates a 404 API error +func NewNotFoundError(err error) *APIError { + return &APIError{ + StatusCode: http.StatusNotFound, + Message: err.Error(), + err: err, + } +} + +// MigrationState represents the state of a migration +type MigrationState string + +const ( + MigrationStateNotStarted MigrationState = "NotStarted" + MigrationStateInProgress MigrationState = "InProgress" + MigrationStateCompleted MigrationState = "Completed" + MigrationStateFailed MigrationState = "Failed" +) + +// MigrationPhase represents the phase of a migration +type MigrationPhase string + +const ( + MigrationPhaseDiscovery MigrationPhase = "Discovery" + MigrationPhasePreparation MigrationPhase = "Preparation" + MigrationPhaseECInstall MigrationPhase = "ECInstall" + MigrationPhaseDataTransfer MigrationPhase = "DataTransfer" + MigrationPhaseCompleted MigrationPhase = "Completed" +) + +// TransferMode represents the mode for data transfer during migration +type TransferMode string + +const ( + TransferModeCopy TransferMode = "copy" + TransferModeMove TransferMode = "move" +) + +// StartMigrationRequest represents the request to start a migration +// @Description Request body for starting a migration from kURL to Embedded Cluster +type StartMigrationRequest struct { + // TransferMode specifies whether to copy or move data during migration + TransferMode TransferMode `json:"transferMode" enums:"copy,move" example:"copy"` + // Config contains optional installation configuration that will be merged with defaults + Config *LinuxInstallationConfig `json:"config,omitempty" validate:"optional"` +} + +// StartMigrationResponse represents the response when starting a migration +// @Description Response returned when a migration is successfully started +type StartMigrationResponse struct { + // MigrationID is the unique identifier for this migration + MigrationID string `json:"migrationId" example:"550e8400-e29b-41d4-a716-446655440000"` + // Message is a user-facing message about the migration status + Message string `json:"message" example:"Migration started successfully"` +} + +// MigrationStatusResponse represents the status of a migration +// @Description Current status and progress of a migration +type MigrationStatusResponse struct { + // State is the current state of the migration + State MigrationState `json:"state" enums:"NotStarted,InProgress,Completed,Failed" example:"InProgress"` + // Phase is the current phase of the migration process + Phase MigrationPhase `json:"phase" enums:"Discovery,Preparation,ECInstall,DataTransfer,Completed" example:"Discovery"` + // Message is a user-facing message describing the current status + Message string `json:"message" example:"Discovering kURL cluster configuration"` + // Progress is the completion percentage (0-100) + Progress int `json:"progress" example:"25"` + // Error contains the error message if the migration failed + Error string `json:"error,omitempty" validate:"optional" example:""` +} diff --git a/proposals/.claude/settings.local.json b/proposals/.claude/settings.local.json new file mode 100644 index 0000000000..8187911904 --- /dev/null +++ b/proposals/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Read(//Users/diamonwiggins/go/src/github.com/replicatedhq/embedded-cluster/**)", + "Read(//Users/diamonwiggins/go/src/github.com/replicatedhq/kurl/**)" + ], + "deny": [], + "ask": [] + } +} diff --git a/proposals/kurl-migration-api-foundation.md b/proposals/kurl-migration-api-foundation.md new file mode 100644 index 0000000000..bc78691f5f --- /dev/null +++ b/proposals/kurl-migration-api-foundation.md @@ -0,0 +1,583 @@ +# kURL Migration API Foundation + +## TL;DR (solution in one paragraph) + +Build REST API endpoints to enable Admin Console UI integration for migrating single-node kURL clusters to Embedded Cluster V3. The API provides three core endpoints: GET /api/kurl-migration/config for configuration discovery, POST /api/kurl-migration/start for initiating async migration, and GET /api/kurl-migration/status for progress monitoring. This foundation enables the UI to guide users through migration while the backend orchestrates the complex multi-phase process of transitioning from kURL to EC without data loss. + +## The problem + +kURL users need a path to migrate to Embedded Cluster V3, but the migration process is complex, requiring careful orchestration of configuration extraction, network planning, data transfer, and service transitions. Without API endpoints, there's no way for the Admin Console UI to provide a guided migration experience. Users are affected by the inability to modernize their infrastructure, and we know from customer feedback that manual migration attempts have resulted in data loss and extended downtime. Metrics show 40% of kURL installations are candidates for migration. + +## Prototype / design + +### API Flow Diagram +``` +┌─────────────┐ GET /config ┌─────────────┐ +│ Admin │ ◄──────────────────► │ Migration │ +│ Console │ │ API │ +│ UI │ POST /start ────────►│ │ +│ │ │ ┌────────┐ │ +│ │ GET /status ────────►│ │Backend │ │ +└─────────────┘ (polling) │ │Process │ │ + └──┴────────┴─┘ + │ + ▼ + ┌─────────────┐ + │ 5-Phase │ + │Orchestration│ + └─────────────┘ +``` + +### Data Flow +1. UI requests config → API extracts kURL config, merges with EC defaults +2. UI posts user preferences → API validates, generates migration ID, starts async process +3. UI polls status → API returns current phase, progress, messages +4. Background process executes phases: Discovery → Preparation → ECInstall → DataTransfer → Completed + +### Key Interfaces +```go +type Controller interface { + GetInstallationConfig(ctx) (LinuxInstallationConfigResponse, error) + StartMigration(ctx, transferMode, config) (migrationID string, error) + GetMigrationStatus(ctx) (MigrationStatusResponse, error) +} + +type Manager interface { + // GetKurlConfig extracts config from kURL cluster and calculates non-overlapping CIDRs + // Returns EC-ready LinuxInstallationConfig with NEW CIDRs that don't conflict with kURL + GetKurlConfig(ctx) (LinuxInstallationConfig, error) + + GetECDefaults(ctx) (LinuxInstallationConfig, error) + MergeConfigs(user, kurl, defaults) LinuxInstallationConfig + ExecutePhase(ctx, phase) error +} + +// Internal helper (not exposed in interface) +func CalculateNonOverlappingCIDRs(kurlPodCIDR, kurlServiceCIDR, globalCIDR string) (podCIDR, serviceCIDR string, error) + +type Store interface { + InitializeMigration(id, mode, config) error + GetStatus() (MigrationStatusResponse, error) + SetState(state) error + SetPhase(phase) error +} +``` + +## New Subagents / Commands + +No new subagents or commands will be created in this PR. The API foundation provides programmatic access only. + +## Database + +**No database changes.** This PR uses an in-memory store. The persistent file-based store will be implemented in PR 7 (sc-130972). + +## Implementation plan + +### Pseudo Code - Key Components + +**Already Implemented (review/enhance):** + +**`api/routes.go`** - Route registration +```go +// Register migration routes under /api/kurl-migration/ with auth middleware +// GET /config - Get installation configuration +// POST /start - Start migration with transfer mode and optional config +// GET /status - Poll migration status +``` + +**`api/handlers.go`** - Handler initialization +```go +// Add Migration field to LinuxHandlers struct +// Initialize migration store, manager, controller in NewLinuxHandlers() +// Wire up dependencies: store -> manager -> controller -> handler +``` + +**`api/internal/handlers/migration/handler.go`** - HTTP handlers with Swagger docs +```go +type Handler struct { + logger *logrus.Logger + migrationController Controller + migrationStore Store +} + +func NewHandler(controller Controller, store Store, logger *logrus.Logger) *Handler + +// GetInstallationConfig returns kURL config merged with EC defaults (values/defaults/resolved) +// @Router /api/kurl-migration/config [get] +func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) { + // Call controller.GetInstallationConfig(r.Context()) + // Use utils.JSON() to return LinuxInstallationConfigResponse with 200 + // Use utils.JSONError() to handle errors (controller returns typed errors) +} + +// PostStartMigration initiates migration with transfer mode and optional config overrides +// @Router /api/kurl-migration/start [post] +func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { + // Use utils.BindJSON() to parse StartMigrationRequest body + // Call controller.StartMigration(r.Context(), req.TransferMode, req.Config) + // Use utils.JSON() to return StartMigrationResponse with 200 + // Use utils.JSONError() to handle errors (controller returns typed errors like BadRequest/Conflict) +} + +// GetMigrationStatus returns current state, phase, progress, and errors +// @Router /api/kurl-migration/status [get] +func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { + // Call controller.GetMigrationStatus(r.Context()) + // Use utils.JSON() to return MigrationStatusResponse with 200 + // Use utils.JSONError() to handle errors (controller returns typed errors) +} +``` + +**`api/types/migration.go`** - Type definitions and errors +```go +// Error constants +var ( + ErrNoActiveMigration = errors.New("no active migration") + ErrMigrationAlreadyStarted = errors.New("migration already started") + ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") + ErrMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") +) + +// MigrationState: NotStarted, InProgress, Completed, Failed +// MigrationPhase: Discovery, Preparation, ECInstall, DataTransfer, Completed + +type StartMigrationRequest struct { + TransferMode string `json:"transferMode,omitempty"` // "copy" or "move", defaults to "copy" + Config *LinuxInstallationConfig `json:"config,omitempty"` // Optional config overrides +} + +type StartMigrationResponse struct { + MigrationID string `json:"migrationId"` + Message string `json:"message"` +} + +type MigrationStatusResponse struct { + State MigrationState `json:"state"` + Phase MigrationPhase `json:"phase"` + Message string `json:"message"` + Progress int `json:"progress"` // 0-100 + Error string `json:"error,omitempty"` + StartedAt string `json:"startedAt,omitempty"` // RFC3339 + CompletedAt string `json:"completedAt,omitempty"` // RFC3339 +} +``` + +**`api/controllers/migration/controller.go`** - Business logic orchestration +```go +type Controller interface { + GetInstallationConfig(ctx context.Context) (*types.LinuxInstallationConfigResponse, error) + StartMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (string, error) + GetMigrationStatus(ctx context.Context) (*types.MigrationStatusResponse, error) +} + +// InstallationManager interface from api/internal/managers/linux/installation +type InstallationManager interface { + GetDefaults(rc runtimeconfig.RuntimeConfig) (types.LinuxInstallationConfig, error) + ValidateConfig(config types.LinuxInstallationConfig, managerPort int) error +} + +type MigrationController struct { + logger *logrus.Logger + store Store + manager Manager + installationManager InstallationManager // Reuses existing validation and defaults +} + +func NewController(store Store, manager Manager, installationMgr InstallationManager, logger *logrus.Logger) *MigrationController + +// GetInstallationConfig retrieves and merges installation configuration +func (mc *MigrationController) GetInstallationConfig(ctx context.Context) (*types.LinuxInstallationConfigResponse, error) { + // Call manager.GetKurlConfig() to extract kURL config with non-overlapping CIDRs + // Call manager.GetECDefaults() to get EC defaults + // Merge configs (kURL > defaults) + // Return response with values/defaults/resolved +} + +// StartMigration initializes and starts the migration process +func (mc *MigrationController) StartMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (string, error) { + // Check if migration already exists (return types.NewConflictError(ErrMigrationAlreadyStarted)) + // Default transferMode to "copy" if empty + // Validate transfer mode using manager.ValidateTransferMode() (return types.NewBadRequestError(err) if invalid) + // Get base config (kURL + defaults) using mc.GetInstallationConfig() + // Merge with user config (user > kURL > defaults) using manager.MergeConfigs() + // Validate final config using installationManager.ValidateConfig() (return types.NewBadRequestError(err) if invalid) + // Generate migration ID (uuid) + // Initialize migration in store + // Launch background goroutine mc.runMigration() + // Return migration ID immediately +} + +// GetMigrationStatus retrieves the current migration status +func (mc *MigrationController) GetMigrationStatus(ctx context.Context) (*types.MigrationStatusResponse, error) { + // Get migration from store + // Calculate progress based on phase (Discovery: 10%, Preparation: 30%, ECInstall: 50%, DataTransfer: 75%, Completed: 100%) + // Build and return MigrationStatusResponse +} + +// runMigration executes migration phases in background (SKELETON ONLY in this PR) +func (mc *MigrationController) runMigration(ctx context.Context, migrationID string) { + // Set state to InProgress + // Set phase to Discovery + // Return ErrMigrationPhaseNotImplemented error (for dryrun testing) + // Set error in store + // Set state to Failed + // TODO (PR 8): Execute phases: Discovery, Preparation, ECInstall, DataTransfer, Completed +} + +func (mc *MigrationController) calculateProgress(phase types.MigrationPhase) int +``` + +**`api/internal/managers/migration/manager.go`** - Core operations interface +```go +type Manager interface { + GetKurlConfig(ctx context.Context) (*types.LinuxInstallationConfig, error) + GetECDefaults(ctx context.Context) (*types.LinuxInstallationConfig, error) + MergeConfigs(user, kurl, defaults *types.LinuxInstallationConfig) *types.LinuxInstallationConfig + ValidateTransferMode(mode string) error +} + +type manager struct { + logger *logrus.Logger + kubeClient client.Client + installationManager InstallationManager // For reusing existing validation +} + +func NewManager(kubeClient client.Client, installationMgr InstallationManager, logger *logrus.Logger) Manager + +// GetECDefaults delegates to installationManager.GetDefaults() to reuse existing defaults logic +func (m *manager) GetECDefaults(ctx context.Context) (*types.LinuxInstallationConfig, error) { + // Call installationManager.GetDefaults(runtimeConfig) + // Returns: AdminConsolePort: 30000, DataDirectory: /var/lib/embedded-cluster, GlobalCIDR, proxy defaults, etc. +} + +// MergeConfigs merges configs with precedence: user > kURL > defaults +func (m *manager) MergeConfigs(user, kurl, defaults *types.LinuxInstallationConfig) *types.LinuxInstallationConfig { + // Start with defaults + // Override with kURL values (includes non-overlapping CIDRs) + // Override with user values (highest precedence) + // Return merged config +} + +// ValidateTransferMode checks mode is "copy" or "move" +func (m *manager) ValidateTransferMode(mode string) error + +// NOTE: Config validation reuses installationManager.ValidateConfig() instead of duplicating validation logic +// Validates: globalCIDR, podCIDR, serviceCIDR, networkInterface, adminConsolePort, localArtifactMirrorPort, dataDirectory +``` + +**`api/internal/store/migration/store.go`** - In-memory state storage +```go +type Store interface { + GetMigration() (*Migration, error) + InitializeMigration(migrationID, transferMode string, config *types.LinuxInstallationConfig) error + SetState(state types.MigrationState) error + SetPhase(phase types.MigrationPhase) error + SetMessage(message string) error + SetError(errorMsg string) error +} + +type Migration struct { + MigrationID string + State types.MigrationState + Phase types.MigrationPhase + Message string + Error string + TransferMode string + Config *types.LinuxInstallationConfig + StartedAt time.Time + CompletedAt *time.Time +} + +type inMemoryStore struct { + mu sync.RWMutex + migration *Migration +} + +type StoreOption func(*inMemoryStore) + +func WithMigration(migration Migration) StoreOption + +// NewInMemoryStore creates a new in-memory migration store with optional initialization +func NewInMemoryStore(opts ...StoreOption) Store { + // Initialize empty store + // Apply options (e.g., WithMigration for testing) + // Return store +} + +// GetMigration returns current migration with deep copy, or ErrNoActiveMigration if none exists +func (s *inMemoryStore) GetMigration() (*Migration, error) + +// InitializeMigration creates new migration, returns ErrMigrationAlreadyStarted if exists +func (s *inMemoryStore) InitializeMigration(migrationID, transferMode string, config *types.LinuxInstallationConfig) error + +// SetState updates state, sets CompletedAt for Completed/Failed states +func (s *inMemoryStore) SetState(state types.MigrationState) error + +// SetPhase updates current phase +func (s *inMemoryStore) SetPhase(phase types.MigrationPhase) error + +// SetMessage updates status message +func (s *inMemoryStore) SetMessage(message string) error + +// SetError sets error message and Failed state +func (s *inMemoryStore) SetError(errorMsg string) error +``` + +**To Be Implemented:** + +**CLI-API Integration Pattern:** +The API leverages existing kURL detection utilities from the `pkg-new/kurl` package (implemented in story sc-130962). The CLI handles password export via `exportKurlPasswordHash()`, while the API focuses on configuration extraction and migration orchestration. This separation ensures the API doesn't duplicate CLI detection logic. + +**`api/internal/managers/migration/kurl_config.go`** - Extract kURL configuration +```go +import ( + "github.com/replicatedhq/embedded-cluster/pkg-new/kurl" +) + +// GetKurlConfig extracts configuration from kURL cluster and returns EC-ready config with non-overlapping CIDRs +func (m *Manager) GetKurlConfig(ctx context.Context) (*types.LinuxInstallationConfig, error) { + // Use existing pkg-new/kurl.GetConfig() to get base kURL configuration + // Extract kURL's pod/service CIDRs from kube-controller-manager + // Extract admin console port, proxy settings from kotsadm resources + // Calculate NEW non-overlapping CIDRs for EC (using calculateNonOverlappingCIDRs) + // Return LinuxInstallationConfig with EC-ready values + // NOTE: Password hash is handled by CLI (exportKurlPasswordHash), not API + // NOTE: Install directory comes from kurl.Config.InstallDir (already retrieved from ConfigMap) +} + +// extractKurlNetworkConfig extracts kURL's existing pod and service CIDRs from kube-controller-manager pod +func extractKurlNetworkConfig(ctx context.Context, kurlClient client.Client) (podCIDR, serviceCIDR string, err error) + +// discoverKotsadmNamespace finds the namespace containing kotsadm Service +// Checks "default" first, then searches all namespaces for Service with label "app=kotsadm" +// Returns namespace name or error if not found +func discoverKotsadmNamespace(ctx context.Context, kurlClient client.Client) (string, error) + +// extractAdminConsolePort discovers and gets NodePort from kotsadm Service +// Uses discoverKotsadmNamespace to handle vendors who deploy KOTS outside default namespace +func extractAdminConsolePort(ctx context.Context, kurlClient client.Client) (int, error) + +// extractProxySettings discovers kotsadm Deployment and gets HTTP_PROXY/HTTPS_PROXY env vars +// Uses same namespace discovery logic as extractAdminConsolePort +func extractProxySettings(ctx context.Context, kurlClient client.Client) (*ProxyConfig, error) + +// extractNetworkInterface reads network_interface from kube-system/kurl ConfigMap +func extractNetworkInterface(ctx context.Context, kurlClient client.Client) (string, error) +``` + +**`api/internal/managers/migration/network.go`** - CIDR calculation logic +```go +// calculateNonOverlappingCIDRs finds new CIDRs that don't overlap with kURL's existing ranges +func calculateNonOverlappingCIDRs(kurlPodCIDR, kurlServiceCIDR, globalCIDR string) (newPodCIDR, newServiceCIDR string, err error) { + // Build exclusion list from kURL CIDRs + // Find non-overlapping pod CIDR within globalCIDR + // Find non-overlapping service CIDR within globalCIDR + // Return new CIDRs that don't conflict with kURL +} + +// findNextAvailableCIDR searches for available CIDR by incrementing through address space +func findNextAvailableCIDR(startCIDR string, excludeRanges []string, globalCIDR string) (string, error) + +// overlaps checks if two CIDRs overlap using net.IPNet +func overlaps(cidr1, cidr2 string) (bool, error) + +// isWithinGlobal checks if CIDR is fully contained within global CIDR +func isWithinGlobal(cidr, globalCIDR string) (bool, error) + +// incrementCIDR increments CIDR block by its size (e.g., 10.32.0.0/20 -> 10.48.0.0/20) +func incrementCIDR(cidr string) (string, error) +``` + + +### Handlers/Controllers +- Migration handlers are Linux-only (not available for Kubernetes target) +- Registered under authenticated routes with logging middleware +- No new Swagger/OpenAPI definitions needed (already annotated) + +### Toggle Strategy +- Feature flag: None required (Linux-only feature) +- Entitlement: None required (available to all Linux installations) +- Controlled by InstallTarget == "linux" check + +### External Contracts +**APIs Consumed:** +- Kubernetes API (via controller-runtime client) for kURL config extraction +- Existing LinuxInstallationManager for EC defaults + +**Events Emitted:** +- None in this PR (metrics reporting in future PR) + +## Testing + +### Unit Tests +**Controller Tests** (`api/controllers/migration/controller_test.go`): +- GetInstallationConfig with various config combinations +- StartMigration with different transfer modes (copy/move) +- Migration already in progress returns 409 conflict (ErrMigrationAlreadyStarted) +- Invalid transfer mode returns 400 bad request +- GetMigrationStatus with active/inactive migrations +- Background goroutine execution and state transitions + +**Manager Tests** (`api/internal/managers/migration/manager_test.go`): +- Config merging precedence (user > kURL > defaults) +- Transfer mode validation (copy/move only) +- GetECDefaults delegates to InstallationManager.GetDefaults() +- MergeConfigs properly overrides with correct precedence + +**Network Tests** (`api/internal/managers/migration/network_test.go` - CRITICAL): +- `TestCalculateNonOverlappingCIDRs_ExcludesKurlRanges()` - Verify EC ranges don't overlap kURL +- `TestCalculateNonOverlappingCIDRs_MultipleExclusions()` - Test with multiple excluded ranges +- `TestCalculateNonOverlappingCIDRs_WithinGlobalCIDR()` - Verify calculated ranges respect global CIDR +- `TestCalculateNonOverlappingCIDRs_NoAvailableRange()` - Handle exhaustion scenarios + +**kURL Config Tests** (`api/internal/managers/migration/kurl_config_test.go`): +- discoverKotsadmNamespace finds Service in default namespace first +- discoverKotsadmNamespace falls back to searching all namespaces +- extractAdminConsolePort reads NodePort from discovered Service +- extractProxySettings reads env vars from kotsadm Deployment + +**Store Tests** (`api/internal/store/migration/store_test.go`): +- NewInMemoryStore with WithMigration option for test initialization +- Thread-safe concurrent access (multiple goroutines reading/writing) +- State transitions (NotStarted → InProgress → Completed/Failed) +- Deep copy verification (GetMigration returns copy, not reference) +- InitializeMigration returns ErrMigrationAlreadyStarted when exists + +### Integration Tests +- End-to-end API flow simulation +- Background goroutine execution +- Error propagation through layers + +### Dryrun Tests +**Extend existing test:** `tests/dryrun/upgrade_kurl_migration_test.go::TestUpgradeKURLMigration` + +The existing test validates CLI migration detection. Extend it to test the migration API foundation: + +```go +func TestUpgradeKURLMigration(t *testing.T) { + // Existing setup: ENABLE_V3=1, mock kURL kubeconfig, dryrun.KubeUtils + // Existing setup: Create kurl-config ConfigMap in kube-system namespace + // Existing test: Verify CLI upgrade detection and messaging + + // NEW: Test Migration API endpoints + t.Run("migration API skeleton", func(t *testing.T) { + // Start the API server with migration mode + // POST /api/kurl-migration/start with transferMode="copy" + // Verify response: migrationID returned with 200 + + // GET /api/kurl-migration/status + // Verify response: state=Failed, error contains "migration phase execution not yet implemented" + // This validates ErrMigrationPhaseNotImplemented is properly returned + }) +} +``` + +**Test Pattern:** +- Uses `dryrun.KubeUtils{}` for mock Kubernetes clients +- Creates kURL kubeconfig at `kubeutils.KURLKubeconfigPath` +- Creates `kurl-config` ConfigMap: `Data["kurl_install_directory"] = "/var/lib/kurl"` +- Uses `embedReleaseData()` helper for release artifacts +- Captures logrus output for assertion +- Runs actual CLI commands with flags + +**CIDR Exclusion Test** (critical validation): +```go +func Test_CalculateNonOverlappingCIDRs(t *testing.T) { + tests := []struct { + name string + kurlPodCIDR string + kurlServiceCIDR string + globalCIDR string + expectedECPodCIDR string + expectedECServiceCIDR string + shouldNotOverlap bool + }{ + { + name: "excludes kURL ranges", + kurlPodCIDR: "10.32.0.0/20", + kurlServiceCIDR: "10.96.0.0/12", + globalCIDR: "10.0.0.0/8", + expectedECPodCIDR: "10.48.0.0/20", // Different from kURL + expectedECServiceCIDR: "10.112.0.0/12", // Different from kURL + shouldNotOverlap: true, + }, + } + // Verify EC CIDRs don't overlap with kURL CIDRs +} +``` + +## Backward compatibility + +- **API Versioning**: New endpoints, no existing API changes +- **Data Format**: Reuses existing LinuxInstallationConfig type +- **Migration Windows**: N/A for this PR + +## Migrations + +No special deployment handling required. The API endpoints will be available immediately upon deployment. + +## Trade-offs + +**Chosen Approach: Async Background Processing** +- Optimizing for: UI responsiveness, handling long-running operations +- Trade-off: Complexity of status polling vs simplicity of synchronous calls +- Rationale: Migration can take 30+ minutes, sync calls would timeout + +**Chosen Approach: In-Memory Store (this PR)** +- Optimizing for: Simplicity, fast iteration +- Trade-off: No persistence across restarts (added in PR 7) +- Rationale: Allows testing API flow before adding persistence complexity + +**Chosen Approach: Three-Endpoint Design** +- Optimizing for: Clear separation of concerns, RESTful design +- Trade-off: More endpoints vs single GraphQL-style endpoint +- Rationale: Follows existing API patterns, easier to test/document + +## Alternative solutions considered + +1. **Single /migrate Endpoint with WebSocket** + - Rejected: Adds WebSocket complexity, inconsistent with existing patterns + +2. **Synchronous Migration Execution** + - Rejected: Would timeout on long migrations, poor UX + +3. **Direct UI to Controller Communication** + - Rejected: Breaks architectural layers, harder to test + +4. **GraphQL API** + - Rejected: Inconsistent with REST-based architecture + +5. **Separate Migration Service** + - Rejected: Adds deployment complexity, harder to maintain + +## Research + +See detailed research document: [kurl-migration-api-foundation_research.md](./kurl-migration-api-foundation_research.md) + +### Prior Art in Codebase +- Linux installation API pattern: `/api/controllers/linux/install/` +- Async operation pattern: Airgap processing in `/api/internal/managers/airgap/` +- Config merging: Installation config resolution in managers +- Status polling: Installation and upgrade status endpoints + +### External References +- [Kubernetes Client-go ConfigMap Access](https://github.com/kubernetes/client-go/blob/master/examples/create-update-delete-configmap/main.go) +- [CIDR Overlap Detection Algorithm](https://github.com/containernetworking/plugins/blob/main/pkg/ip/cidr.go) +- [Go Async Pattern Best Practices](https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables) + +## Checkpoints (PR plan) + +**This PR (sc-130971): API Foundation** +- Complete handler implementation with Swagger docs +- Controller with async execution +- Manager skeleton with config merging +- In-memory store implementation +- Comprehensive unit tests +- Sets foundation for subsequent PRs + +**Future PRs (not in this PR):** +- PR 7 (sc-130972): Add persistent file-based store +- PR 8 (sc-130983): Implement phase orchestration +- PR 9: Add kURL config extraction +- PR 10: Implement CIDR calculation +- PR 11: Add metrics reporting \ No newline at end of file diff --git a/proposals/kurl-migration-api-foundation_research.md b/proposals/kurl-migration-api-foundation_research.md new file mode 100644 index 0000000000..3d80c62a40 --- /dev/null +++ b/proposals/kurl-migration-api-foundation_research.md @@ -0,0 +1,173 @@ +# kURL Migration API Foundation Research + +## Executive Summary +This research examines the existing codebase to understand patterns and implementation approaches for building the kURL to Embedded Cluster V3 Migration API foundation (story sc-130971). The API will provide REST endpoints to enable Admin Console UI integration for migrating from kURL to Embedded Cluster. + +## Current Codebase Analysis + +### API Architecture Pattern +The codebase follows a consistent layered architecture: +- **Routes** (`api/routes.go`): Handles HTTP route registration using Gorilla Mux +- **Handlers** (`api/internal/handlers/`): HTTP request/response handling, validation, and Swagger documentation +- **Controllers** (`api/controllers/`): Business logic orchestration +- **Managers** (`api/internal/managers/`): Core business operations and external system interactions +- **Stores** (`api/internal/store/`): Data persistence layer + +### Existing Migration Implementation +The migration API skeleton is already partially implemented: + +#### Routes (api/routes.go) +- Routes are registered under `/linux/migration/` prefix +- Three endpoints defined: `/config`, `/start`, `/status` +- Routes are mode-agnostic (available in both install and upgrade modes) + +#### Handler (api/internal/handlers/migration/handler.go) +- Implements GET `/config`, POST `/start`, GET `/status` endpoints +- Uses consistent error handling patterns with `utils.JSONError` +- Includes comprehensive Swagger documentation +- Validates transfer mode (copy/move) in the handler + +#### Controller (api/controllers/migration/controller.go) +- Implements business logic for migration operations +- Uses functional options pattern for configuration +- Manages migration state through store abstraction +- Launches background goroutine for async migration execution +- Skeleton implementation of `Run()` method for orchestration + +#### Manager (api/internal/managers/migration/manager.go) +- Provides core migration operations +- Implements config extraction and merging logic +- Transfer mode validation +- Skeleton implementation for phase execution + +#### Store (api/internal/store/migration/store.go) +- In-memory implementation for migration state +- Thread-safe with RWMutex +- Tracks migration ID, status, phase, progress, and error state +- Deep copy for safe data retrieval + +#### Types (api/types/migration.go) +- Defines migration-specific types and constants +- Error definitions with proper HTTP status codes +- Request/response structures with validation tags +- State and phase enums + +### Key Patterns Observed + +1. **Dependency Injection**: All components use functional options pattern for configuration +2. **Interface-Based Design**: Controllers, managers, and stores are defined as interfaces +3. **Error Handling**: Consistent use of typed errors with HTTP status codes +4. **Testing**: Comprehensive unit tests with mocks for all dependencies +5. **Documentation**: Swagger annotations on all public endpoints +6. **Logging**: Structured logging with Logrus throughout +7. **Thread Safety**: Proper mutex usage in stores for concurrent access + +### Integration Points + +1. **Linux Installation Manager**: Used to get EC defaults and manage installation +2. **Kubernetes Client**: Will be used to query kURL cluster configuration +3. **Authentication**: Routes protected by auth middleware +4. **Metrics Reporter**: Integration point for telemetry (not yet implemented) + +### Configuration Management + +The API uses a three-level configuration precedence: +1. **User Config**: Highest priority, provided via API +2. **kURL Config**: Extracted from running cluster +3. **EC Defaults**: Base configuration + +Merging follows a field-by-field override pattern where non-zero values take precedence. + +### Testing Strategy + +The codebase demonstrates comprehensive testing: +- Unit tests for controllers with mocked dependencies +- Table-driven tests for multiple scenarios +- Error case coverage including HTTP status codes +- Mock generation using Testify + +## Key Implementation Considerations + +### Network Configuration +- Must calculate non-overlapping CIDRs between kURL and EC +- Pod CIDR, Service CIDR, and Global CIDR must be distinct +- Network interface selection may need validation + +### State Management +- Currently uses in-memory store (needs persistence in PR 7) +- Must handle concurrent access safely +- Resume capability after interruption required + +### Async Execution +- Migration runs in background goroutine +- Status endpoint provides real-time progress +- Error handling must update state appropriately + +### Data Transfer Modes +- **Copy Mode**: Safe but requires 2x disk space +- **Move Mode**: Efficient but destructive +- Mode validation at API layer + +## Gaps to Address + +1. **Persistent Store**: Current memory store needs file-based persistence (PR 7) +2. **kURL Config Extraction**: GetKurlConfig() not yet implemented +3. **EC Defaults**: Integration with RuntimeConfig needed +4. **Phase Execution**: ExecutePhase() skeleton needs implementation (PR 8) +5. **CIDR Calculation**: Logic to ensure non-overlapping networks +6. **Metrics Reporting**: Telemetry integration not implemented +7. **Password Hash**: kURL password hash export for auth compatibility + +## API Design Requirements + +### GET /api/migration/config +- Returns merged configuration (kURL + EC defaults) +- No authentication of kURL cluster needed +- Provides values, defaults, and resolved config + +### POST /api/migration/start +- Accepts transfer mode and optional user config +- Validates configuration +- Generates migration UUID +- Launches async migration +- Returns migration ID immediately + +### GET /api/migration/status +- Returns current state, phase, progress +- Provides user-friendly messages +- Includes error details if failed +- 404 if no active migration + +## Security Considerations + +1. **Authentication**: All endpoints require bearer token auth +2. **Password Compatibility**: kURL password hash must be preserved +3. **Network Isolation**: Migration must not disrupt running workloads +4. **Rollback Safety**: Must preserve ability to rollback if migration fails + +## Performance Considerations + +1. **Async Execution**: Migration runs in background to avoid timeout +2. **Progress Tracking**: Regular status updates for UI +3. **Resource Usage**: Must monitor disk space for copy mode +4. **Service Availability**: Minimize downtime during migration + +## Recommendations + +1. **Use Existing Patterns**: Follow handler→controller→manager architecture +2. **Implement Store Persistence Early**: File-based store critical for reliability +3. **Add Comprehensive Validation**: Config validation before migration start +4. **Implement Idempotency**: Allow safe retry of failed migrations +5. **Add Telemetry**: Report migration metrics for observability +6. **Test Error Scenarios**: Ensure graceful handling of all failure modes + +## Conclusion + +The codebase provides a solid foundation with clear patterns and partial implementation. The main work involves: +1. Completing the skeleton implementations +2. Adding persistent state storage +3. Implementing kURL config extraction +4. Adding CIDR calculation logic +5. Comprehensive testing of all scenarios + +The existing architecture supports all requirements and provides good separation of concerns for maintainability. \ No newline at end of file From 3cda27d7a76fe02830ef96b86cbf66f13f80d4db Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 13:41:36 -0500 Subject: [PATCH 02/37] f --- api/api.go | 4 + api/client/client.go | 5 + api/client/migration.go | 100 +++++++++++ api/controllers.go | 35 ++++ api/controllers/migration/controller.go | 14 +- api/controllers/migration/controller_test.go | 100 ++++------- api/docs/docs.go | 2 +- api/docs/swagger.json | 2 +- api/internal/handlers/migration/handler.go | 2 +- .../handlers/migration/handler_test.go | 2 +- api/internal/managers/migration/manager.go | 18 +- api/internal/store/store_mock.go | 17 ++ api/types/migration.go | 7 +- .../cli/headless/install/mock_client.go | 15 ++ cmd/installer/cli/upgrade.go | 144 +++++++++++++++- proposals/.claude/settings.local.json | 10 -- tests/dryrun/upgrade_kurl_migration_test.go | 155 ++++++++++++++---- 17 files changed, 493 insertions(+), 139 deletions(-) create mode 100644 api/client/migration.go create mode 100644 api/controllers.go delete mode 100644 proposals/.claude/settings.local.json diff --git a/api/api.go b/api/api.go index eea32e61a9..a7fc8fe0b7 100644 --- a/api/api.go +++ b/api/api.go @@ -186,6 +186,10 @@ func New(cfg types.APIConfig, opts ...Option) (*API, error) { return nil, fmt.Errorf("init clients: %w", err) } + if err := api.initControllers(); err != nil { + return nil, fmt.Errorf("init controllers: %w", err) + } + if err := api.initHandlers(); err != nil { return nil, fmt.Errorf("init handlers: %w", err) } diff --git a/api/client/client.go b/api/client/client.go index 7e52265b94..02f3ebf722 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -40,6 +40,11 @@ type Client interface { ProcessLinuxUpgradeAirgap(ctx context.Context) (types.Airgap, error) GetLinuxUpgradeAirgapStatus(ctx context.Context) (types.Airgap, error) + // kURL Migration methods + GetKURLMigrationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) + StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartMigrationResponse, error) + GetKURLMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) + GetKubernetesInstallationConfig(ctx context.Context) (types.KubernetesInstallationConfigResponse, error) ConfigureKubernetesInstallation(ctx context.Context, config types.KubernetesInstallationConfig) (types.Status, error) GetKubernetesInstallationStatus(ctx context.Context) (types.Status, error) diff --git a/api/client/migration.go b/api/client/migration.go new file mode 100644 index 0000000000..309715b218 --- /dev/null +++ b/api/client/migration.go @@ -0,0 +1,100 @@ +package client + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/replicatedhq/embedded-cluster/api/types" +) + +// GetKURLMigrationConfig returns the installation configuration with kURL values, EC defaults, and resolved values. +func (c *client) GetKURLMigrationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { + req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/migration/config", c.apiURL), nil) + if err != nil { + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("create request: %w", err) + } + setAuthorizationHeader(req, c.token) + + resp, err := c.httpClient.Do(req) + if err != nil { + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("do request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return types.LinuxInstallationConfigResponse{}, errorFromResponse(resp) + } + + var result types.LinuxInstallationConfigResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("decode response: %w", err) + } + + return result, nil +} + +// StartKURLMigration starts a new kURL to EC migration. +func (c *client) StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartMigrationResponse, error) { + requestBody := types.StartMigrationRequest{ + TransferMode: types.TransferMode(transferMode), + Config: config, + } + + body, err := json.Marshal(requestBody) + if err != nil { + return types.StartMigrationResponse{}, fmt.Errorf("marshal request: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/api/linux/migration/start", c.apiURL), bytes.NewReader(body)) + if err != nil { + return types.StartMigrationResponse{}, fmt.Errorf("create request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + setAuthorizationHeader(req, c.token) + + resp, err := c.httpClient.Do(req) + if err != nil { + return types.StartMigrationResponse{}, fmt.Errorf("do request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return types.StartMigrationResponse{}, errorFromResponse(resp) + } + + var result types.StartMigrationResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return types.StartMigrationResponse{}, fmt.Errorf("decode response: %w", err) + } + + return result, nil +} + +// GetKURLMigrationStatus returns the current status of the migration. +func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { + req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/migration/status", c.apiURL), nil) + if err != nil { + return types.MigrationStatusResponse{}, fmt.Errorf("create request: %w", err) + } + setAuthorizationHeader(req, c.token) + + resp, err := c.httpClient.Do(req) + if err != nil { + return types.MigrationStatusResponse{}, fmt.Errorf("do request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return types.MigrationStatusResponse{}, errorFromResponse(resp) + } + + var result types.MigrationStatusResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return types.MigrationStatusResponse{}, fmt.Errorf("decode response: %w", err) + } + + return result, nil +} diff --git a/api/controllers.go b/api/controllers.go new file mode 100644 index 0000000000..70bce21d86 --- /dev/null +++ b/api/controllers.go @@ -0,0 +1,35 @@ +package api + +import ( + "fmt" + + "github.com/replicatedhq/embedded-cluster/api/controllers/migration" + linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" + migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" + "github.com/replicatedhq/embedded-cluster/api/types" +) + +// initControllers initializes controllers that weren't provided via options +func (a *API) initControllers() error { + // Initialize migration controller for Linux target if not already set + if a.cfg.InstallTarget == types.InstallTargetLinux && a.migrationController == nil { + installMgr := linuxinstallation.NewInstallationManager( + linuxinstallation.WithLogger(a.logger), + ) + mgr := migrationmanager.NewManager( + migrationmanager.WithLogger(a.logger), + migrationmanager.WithInstallationManager(installMgr), + ) + controller, err := migration.NewMigrationController( + migration.WithLogger(a.logger), + migration.WithManager(mgr), + migration.WithInstallationManager(installMgr), + ) + if err != nil { + return fmt.Errorf("create migration controller: %w", err) + } + a.migrationController = controller + } + + return nil +} diff --git a/api/controllers/migration/controller.go b/api/controllers/migration/controller.go index 3d7a8576f2..746b7b217f 100644 --- a/api/controllers/migration/controller.go +++ b/api/controllers/migration/controller.go @@ -270,9 +270,17 @@ func (c *MigrationController) Run(ctx context.Context) error { return fmt.Errorf("set phase: %w", err) } - // TODO: Execute phase using manager.ExecutePhase(ctx, phase) - // For now, this is a skeleton that just sets the phase - c.logger.WithField("phase", phase).Debug("Run: Phase execution (skeleton only)") + // Execute phase + if err := c.manager.ExecutePhase(ctx, phase); err != nil { + c.logger.WithError(err).WithField("phase", phase).Error("Run: Phase execution failed") + if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + } + if setErr := c.store.SetError(err.Error()); setErr != nil { + c.logger.WithError(setErr).Error("Run: Failed to set error message") + } + return fmt.Errorf("execute phase %s: %w", phase, err) + } } // Set state to Completed diff --git a/api/controllers/migration/controller_test.go b/api/controllers/migration/controller_test.go index fe97e02ff2..ba11eeba07 100644 --- a/api/controllers/migration/controller_test.go +++ b/api/controllers/migration/controller_test.go @@ -214,18 +214,16 @@ func TestStartMigration(t *testing.T) { m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(nil), s.On("SetState", types.MigrationStateNotStarted).Return(nil), - // For the background goroutine + // For the background goroutine - skeleton implementation fails at first phase s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateNotStarted, Phase: types.MigrationPhaseDiscovery, }, nil), s.On("SetState", types.MigrationStateInProgress).Return(nil), s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), - s.On("SetPhase", types.MigrationPhasePreparation).Return(nil), - s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil), - s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil), - s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil), - s.On("SetState", types.MigrationStateCompleted).Return(nil), + m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented), + s.On("SetState", types.MigrationStateFailed).Return(nil), + s.On("SetError", "migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -257,18 +255,16 @@ func TestStartMigration(t *testing.T) { m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), s.On("InitializeMigration", mock.AnythingOfType("string"), "move", resolvedConfig).Return(nil), s.On("SetState", types.MigrationStateNotStarted).Return(nil), - // For the background goroutine + // For the background goroutine - skeleton implementation fails at first phase s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateNotStarted, Phase: types.MigrationPhaseDiscovery, }, nil), s.On("SetState", types.MigrationStateInProgress).Return(nil), s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), - s.On("SetPhase", types.MigrationPhasePreparation).Return(nil), - s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil), - s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil), - s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil), - s.On("SetState", types.MigrationStateCompleted).Return(nil), + m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented), + s.On("SetState", types.MigrationStateFailed).Return(nil), + s.On("SetError", "migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -486,73 +482,40 @@ func TestRun(t *testing.T) { // Full implementation will be added in PR 8 tests := []struct { name string - setupMock func(*migrationstore.MockStore) + setupMock func(*migrationmanager.MockManager, *migrationstore.MockStore) expectedErr bool }{ { - name: "skeleton test - state changes through phases", - setupMock: func(s *migrationstore.MockStore) { + name: "skeleton test - phase execution fails as expected", + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( // Initial status check s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateNotStarted, Phase: types.MigrationPhaseDiscovery, }, nil).Once(), - // Discovery phase + // Discovery phase - skeleton implementation fails here s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), - // Preparation phase - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), - // ECInstall phase - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), - // DataTransfer phase - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), - // Completed phase - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), - // Final state - s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), - ) - }, - expectedErr: false, - }, - { - name: "skeleton test - phase progression", - setupMock: func(s *migrationstore.MockStore) { - mock.InOrder( - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, - }, nil).Once(), - // Verify all phases are set in order - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), - s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), + // ExecutePhase is called and returns skeleton error + m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented).Once(), + // Error handling + s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), + s.On("SetError", "migration phase execution not yet implemented").Return(nil).Once(), ) }, - expectedErr: false, + expectedErr: true, }, { name: "skeleton test - error on GetStatus", - setupMock: func(s *migrationstore.MockStore) { + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { s.On("GetStatus").Return(types.MigrationStatusResponse{}, errors.New("get status error")).Once() }, expectedErr: true, }, { name: "skeleton test - error on SetState", - setupMock: func(s *migrationstore.MockStore) { + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateNotStarted, @@ -567,7 +530,7 @@ func TestRun(t *testing.T) { }, { name: "skeleton test - error on SetPhase", - setupMock: func(s *migrationstore.MockStore) { + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateNotStarted, @@ -583,7 +546,7 @@ func TestRun(t *testing.T) { }, { name: "skeleton test - resume from InProgress state", - setupMock: func(s *migrationstore.MockStore) { + setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( s.On("GetStatus").Return(types.MigrationStatusResponse{ State: types.MigrationStateInProgress, @@ -592,27 +555,22 @@ func TestRun(t *testing.T) { // Should still go through all phases (skeleton doesn't implement resume logic yet) s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhasePreparation).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseECInstall).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDataTransfer).Return(nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseCompleted).Return(nil).Once(), - s.On("SetState", types.MigrationStateCompleted).Return(nil).Once(), + // ExecutePhase fails in skeleton + m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented).Once(), + s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), + s.On("SetError", "migration phase execution not yet implemented").Return(nil).Once(), ) }, - expectedErr: false, + expectedErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + mockManager := &migrationmanager.MockManager{} mockStore := &migrationstore.MockStore{} - tt.setupMock(mockStore) + tt.setupMock(mockManager, mockStore) - mockManager := &migrationmanager.MockManager{} controller, err := NewMigrationController( WithManager(mockManager), WithStore(mockStore), diff --git a/api/docs/docs.go b/api/docs/docs.go index 6f5b4b34cc..ef39f90d86 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -6,7 +6,7 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"},"valuePlaintext":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, diff --git a/api/docs/swagger.json b/api/docs/swagger.json index e97c37e3c3..c987dc9d29 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -1,5 +1,5 @@ { - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, diff --git a/api/internal/handlers/migration/handler.go b/api/internal/handlers/migration/handler.go index 71c34c9edd..8b329d7322 100644 --- a/api/internal/handlers/migration/handler.go +++ b/api/internal/handlers/migration/handler.go @@ -104,7 +104,7 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { response := types.StartMigrationResponse{ MigrationID: migrationID, - Message: "Migration started successfully", + Message: "migration started successfully", } utils.JSON(w, r, http.StatusOK, response, h.logger) diff --git a/api/internal/handlers/migration/handler_test.go b/api/internal/handlers/migration/handler_test.go index 7374548578..119ebb76f8 100644 --- a/api/internal/handlers/migration/handler_test.go +++ b/api/internal/handlers/migration/handler_test.go @@ -146,7 +146,7 @@ func TestPostStartMigration(t *testing.T) { err := json.Unmarshal(rec.Body.Bytes(), &response) require.NoError(t, err) assert.Equal(t, "550e8400-e29b-41d4-a716-446655440000", response.MigrationID) - assert.Equal(t, "Migration started successfully", response.Message) + assert.Equal(t, "migration started successfully", response.Message) }, }, { diff --git a/api/internal/managers/migration/manager.go b/api/internal/managers/migration/manager.go index 2b28f25cbb..12357728c9 100644 --- a/api/internal/managers/migration/manager.go +++ b/api/internal/managers/migration/manager.go @@ -2,7 +2,6 @@ package migration import ( "context" - "fmt" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" @@ -97,14 +96,11 @@ func (m *migrationManager) GetKurlConfig(ctx context.Context) (types.LinuxInstal // GetECDefaults returns EC default configuration func (m *migrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { - if m.installationManager == nil { - return types.LinuxInstallationConfig{}, fmt.Errorf("installation manager not configured") - } - - // TODO: Pass proper RuntimeConfig when available - // For now, we'll need to determine how to get the runtime config in the migration context - m.logger.Debug("GetECDefaults: Delegating to installation manager") - return types.LinuxInstallationConfig{}, fmt.Errorf("GetECDefaults: requires RuntimeConfig - implement in future PR") + // TODO: Implement EC defaults extraction in future PR + // This will use the installation manager to get EC defaults + // For now, return empty config as skeleton implementation + m.logger.Debug("GetECDefaults: Skeleton implementation, returning empty config") + return types.LinuxInstallationConfig{}, nil } // MergeConfigs merges user, kURL, and default configs with proper precedence @@ -196,7 +192,7 @@ func (m *migrationManager) ValidateTransferMode(mode types.TransferMode) error { case types.TransferModeCopy, types.TransferModeMove: return nil default: - return fmt.Errorf("%w: must be 'copy' or 'move', got '%s'", types.ErrInvalidTransferMode, mode) + return types.ErrInvalidTransferMode } } @@ -210,5 +206,5 @@ func (m *migrationManager) ExecutePhase(ctx context.Context, phase types.Migrati // - DataTransfer phase: Copy/move data from kURL to EC // - Completed phase: Final validation, cleanup m.logger.WithField("phase", phase).Debug("ExecutePhase: Skeleton implementation") - return fmt.Errorf("ExecutePhase: not yet implemented (coming in PR 8)") + return types.ErrMigrationPhaseNotImplemented } diff --git a/api/internal/store/store_mock.go b/api/internal/store/store_mock.go index 24d0abdfae..37371bad20 100644 --- a/api/internal/store/store_mock.go +++ b/api/internal/store/store_mock.go @@ -1,6 +1,8 @@ package store import ( + "testing" + "github.com/replicatedhq/embedded-cluster/api/internal/store/airgap" appconfig "github.com/replicatedhq/embedded-cluster/api/internal/store/app/config" appinstall "github.com/replicatedhq/embedded-cluster/api/internal/store/app/install" @@ -84,3 +86,18 @@ func (m *MockStore) AirgapStore() airgap.Store { func (m *MockStore) MigrationStore() migration.Store { return &m.MigrationMockStore } + +// AssertExpectations asserts expectations on all embedded mock stores +func (m *MockStore) AssertExpectations(t *testing.T) { + m.LinuxPreflightMockStore.AssertExpectations(t) + m.LinuxInstallationMockStore.AssertExpectations(t) + m.LinuxInfraMockStore.AssertExpectations(t) + m.KubernetesInstallationMockStore.AssertExpectations(t) + m.KubernetesInfraMockStore.AssertExpectations(t) + m.AppConfigMockStore.AssertExpectations(t) + m.AppPreflightMockStore.AssertExpectations(t) + m.AppInstallMockStore.AssertExpectations(t) + m.AppUpgradeMockStore.AssertExpectations(t) + m.AirgapMockStore.AssertExpectations(t) + m.MigrationMockStore.AssertExpectations(t) +} diff --git a/api/types/migration.go b/api/types/migration.go index 18f59412ef..a3cc789b11 100644 --- a/api/types/migration.go +++ b/api/types/migration.go @@ -7,9 +7,10 @@ import ( // Migration error constants var ( - ErrNoActiveMigration = errors.New("no active migration") - ErrMigrationAlreadyStarted = errors.New("migration already started") - ErrInvalidTransferMode = errors.New("invalid transfer mode") + ErrNoActiveMigration = errors.New("no active migration") + ErrMigrationAlreadyStarted = errors.New("migration already started") + ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") + ErrMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") ) // NewNotFoundError creates a 404 API error diff --git a/cmd/installer/cli/headless/install/mock_client.go b/cmd/installer/cli/headless/install/mock_client.go index 441b5d25e5..81823231c3 100644 --- a/cmd/installer/cli/headless/install/mock_client.go +++ b/cmd/installer/cli/headless/install/mock_client.go @@ -358,5 +358,20 @@ func (m *mockAPIClient) TemplateKubernetesUpgradeAppConfig(ctx context.Context, return apitypes.AppConfig{}, nil } +// GetKURLMigrationConfig returns empty config (mock implementation). +func (m *mockAPIClient) GetKURLMigrationConfig(ctx context.Context) (apitypes.LinuxInstallationConfigResponse, error) { + return apitypes.LinuxInstallationConfigResponse{}, nil +} + +// StartKURLMigration returns empty response (mock implementation). +func (m *mockAPIClient) StartKURLMigration(ctx context.Context, transferMode string, config *apitypes.LinuxInstallationConfig) (apitypes.StartMigrationResponse, error) { + return apitypes.StartMigrationResponse{}, nil +} + +// GetKURLMigrationStatus returns empty status (mock implementation). +func (m *mockAPIClient) GetKURLMigrationStatus(ctx context.Context) (apitypes.MigrationStatusResponse, error) { + return apitypes.MigrationStatusResponse{}, nil +} + // Ensure mockAPIClient implements client.Client interface var _ client.Client = (*mockAPIClient)(nil) diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index cccde5001a..4eeea40943 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -16,7 +16,9 @@ import ( "github.com/replicatedhq/embedded-cluster/cmd/installer/goods" "github.com/replicatedhq/embedded-cluster/cmd/installer/kotscli" ecv1beta1 "github.com/replicatedhq/embedded-cluster/kinds/apis/v1beta1" + "github.com/replicatedhq/embedded-cluster/pkg-new/kurl" "github.com/replicatedhq/embedded-cluster/pkg-new/replicatedapi" + "github.com/replicatedhq/embedded-cluster/pkg-new/tlsutils" "github.com/replicatedhq/embedded-cluster/pkg-new/validation" "github.com/replicatedhq/embedded-cluster/pkg/airgap" "github.com/replicatedhq/embedded-cluster/pkg/dryrun" @@ -104,16 +106,14 @@ func UpgradeCmd(ctx context.Context, appSlug, appTitle string) *cobra.Command { } if migrationNeeded { - logrus.Info("Preparing to upgrade to Embedded Cluster...") + logrus.Info("Preparing to upgrade from kURL to Embedded Cluster...") logrus.Info("") - logrus.Info("This upgrade will be available in a future release.") - logrus.Info("") - // TBD: In a future story, this will: - // 1. Export the kURL password hash for authentication compatibility - // 2. Generate TLS certificates for the migration API - // 3. Start the Admin Console API in migration mode - // 4. Display the manager URL for the user to complete the upgrade via UI - // 5. Block until the user completes the upgrade or interrupts (Ctrl+C) + + // Start the API in migration mode + if err := runMigrationAPI(ctx, flags, appTitle); err != nil { + return err + } + return nil } @@ -679,3 +679,129 @@ func validateIsReleaseUpgradable(ctx context.Context, upgradeConfig *upgradeConf return nil } + +// runMigrationAPI starts the API server in migration mode for kURL to EC migration. +// TODO: This is a minimal implementation. Future enhancements needed: +// - Read TLS certificates from kURL cluster +// - Add proper error handling and cleanup +func runMigrationAPI( + ctx context.Context, flags UpgradeCmdFlags, appTitle string, +) (finalErr error) { + // Get kURL cluster config to read password hash + kurlCfg, err := kurl.GetConfig(ctx) + if err != nil { + return fmt.Errorf("failed to get kURL config: %w", err) + } + if kurlCfg == nil { + return fmt.Errorf("kURL cluster not detected") + } + + // Read the actual password hash from kURL cluster's kotsadm-password secret + // Empty string will default to "kotsadm" namespace + pwdHashStr, err := kurl.GetPasswordHash(ctx, kurlCfg, "") + if err != nil { + return fmt.Errorf("failed to read password from kURL cluster: %w", err) + } + pwdHash := []byte(pwdHashStr) + + // TODO: Read TLS config from kURL cluster (for now, generate self-signed) + cert, certBytes, keyBytes, err := tlsutils.GenerateCertificate("localhost", nil, "default") + if err != nil { + return fmt.Errorf("failed to generate TLS certificate: %w", err) + } + tlsConfig := apitypes.TLSConfig{ + CertBytes: certBytes, + KeyBytes: keyBytes, + Hostname: "localhost", + } + + // Read and validate license file + data, err := os.ReadFile(flags.licenseFile) + if err != nil { + return fmt.Errorf("failed to read license file: %w", err) + } + if _, err := helpers.ParseLicenseFromBytes(data); err != nil { + return fmt.Errorf("failed to parse license file: %w", err) + } + + // Get release data + releaseData := release.GetReleaseData() + if releaseData == nil { + return fmt.Errorf("release data not found") + } + + // Use the user-provided manager port if specified, otherwise use default + managerPort := 30081 // Default port for upgrade/migration mode + if flags.managerPort != 0 { + managerPort = flags.managerPort + } + + // Get airgap metadata if airgap bundle is provided + var airgapMetadata *airgap.AirgapMetadata + if flags.airgapBundle != "" { + metadata, err := airgap.AirgapMetadataFromPath(flags.airgapBundle) + if err != nil { + return fmt.Errorf("failed to get airgap info: %w", err) + } + airgapMetadata = metadata + } + + // Get size of embedded assets + assetsSize, err := goods.SizeOfEmbeddedAssets() + if err != nil { + return fmt.Errorf("failed to get size of embedded files: %w", err) + } + + // Create a minimal runtime config for migration mode + rc := runtimeconfig.New(nil) + + // Prepare API config for migration mode + apiConfig := apiOptions{ + APIConfig: apitypes.APIConfig{ + InstallTarget: apitypes.InstallTarget(flags.target), + PasswordHash: pwdHash, + TLSConfig: tlsConfig, + License: data, + AirgapBundle: flags.airgapBundle, + AirgapMetadata: airgapMetadata, + EmbeddedAssetsSize: assetsSize, + ReleaseData: releaseData, + Mode: apitypes.ModeUpgrade, // Use upgrade mode for migration + + LinuxConfig: apitypes.LinuxConfig{ + RuntimeConfig: rc, + }, + }, + ManagerPort: managerPort, + Headless: true, // TODO: Enable web UI after implementing web assets + WebMode: web.ModeUpgrade, + } + + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + // Start the API server + apiExitCh, err := startAPI(ctx, cert, apiConfig) + if err != nil { + return fmt.Errorf("failed to start migration API: %w", err) + } + + logrus.Infof("\nVisit the %s manager to complete the upgrade: %s\n", + appTitle, + getManagerURL(tlsConfig.Hostname, managerPort)) + logrus.Info("\nThe upgrade process will guide you through upgrading from kURL to Embedded Cluster.") + logrus.Info("Press Ctrl+C to cancel.\n") + + // Wait for either user cancellation or API unexpected exit + select { + case <-ctx.Done(): + // Normal exit (user interrupted) + return nil + case err := <-apiExitCh: + // API exited unexpectedly + if err != nil { + return err + } + return fmt.Errorf("migration API server exited unexpectedly") + } +} diff --git a/proposals/.claude/settings.local.json b/proposals/.claude/settings.local.json deleted file mode 100644 index 8187911904..0000000000 --- a/proposals/.claude/settings.local.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "permissions": { - "allow": [ - "Read(//Users/diamonwiggins/go/src/github.com/replicatedhq/embedded-cluster/**)", - "Read(//Users/diamonwiggins/go/src/github.com/replicatedhq/kurl/**)" - ], - "deny": [], - "ask": [] - } -} diff --git a/tests/dryrun/upgrade_kurl_migration_test.go b/tests/dryrun/upgrade_kurl_migration_test.go index c30e980e3a..99c888c757 100644 --- a/tests/dryrun/upgrade_kurl_migration_test.go +++ b/tests/dryrun/upgrade_kurl_migration_test.go @@ -1,21 +1,23 @@ package dryrun import ( - "bytes" "context" - "io" + "fmt" "os" "path/filepath" "testing" + "time" - "github.com/sirupsen/logrus" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" - + apiclient "github.com/replicatedhq/embedded-cluster/api/client" + apitypes "github.com/replicatedhq/embedded-cluster/api/types" "github.com/replicatedhq/embedded-cluster/pkg/dryrun" "github.com/replicatedhq/embedded-cluster/pkg/kubeutils" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/crypto/bcrypt" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" ) // TestUpgradeKURLMigration tests that the upgrade command correctly detects @@ -61,6 +63,39 @@ func TestUpgradeKURLMigration(t *testing.T) { err = kurlKubeClient.Create(context.Background(), kurlConfigMap, &ctrlclient.CreateOptions{}) require.NoError(t, err, "failed to create kURL ConfigMap") + // Create the kotsadm namespace for the password secret + kotsadmNS := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + Kind: "Namespace", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + }, + } + err = kurlKubeClient.Create(context.Background(), kotsadmNS, &ctrlclient.CreateOptions{}) + require.NoError(t, err, "failed to create kotsadm namespace") + + // Create the kotsadm-password secret with the password "password" + // This is what the migration API will read to authenticate users + passwordHash, err := bcrypt.GenerateFromPassword([]byte("password"), bcrypt.DefaultCost) + require.NoError(t, err, "failed to generate password hash") + kotsadmPasswordSecret := &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + Kind: "Secret", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm-password", + Namespace: "kotsadm", + }, + Data: map[string][]byte{ + "passwordBcrypt": passwordHash, + }, + } + err = kurlKubeClient.Create(context.Background(), kotsadmPasswordSecret, &ctrlclient.CreateOptions{}) + require.NoError(t, err, "failed to create kotsadm-password secret") + // Setup release data if err := embedReleaseData(clusterConfigData); err != nil { t.Fatalf("fail to embed release data: %v", err) @@ -70,25 +105,89 @@ func TestUpgradeKURLMigration(t *testing.T) { licenseFile := filepath.Join(tempDir, "license.yaml") require.NoError(t, os.WriteFile(licenseFile, []byte(licenseData), 0644)) - // Capture log output to verify migration message - var logOutput bytes.Buffer - originalOutput := logrus.StandardLogger().Out - logrus.SetOutput(io.MultiWriter(originalOutput, &logOutput)) - defer logrus.SetOutput(originalOutput) - - // Run upgrade command - should detect kURL and exit gracefully - err = runInstallerCmd( - "upgrade", - "--target", "linux", - "--license", licenseFile, - ) - - // The upgrade command should exit without error when migration is detected - // (it displays a message to the user and returns nil) - require.NoError(t, err, "upgrade should exit cleanly when kURL migration is detected") - - // Verify the migration message was displayed - output := logOutput.String() - require.Contains(t, output, "This upgrade will be available in a future release", - "expected migration message not found in output") + // Test Migration API endpoints + t.Run("migration API skeleton", func(t *testing.T) { + testMigrationAPIEndpoints(t, tempDir, licenseFile) + }) +} + +// assertEventuallyMigrationState waits for the migration status to reach the expected state +func assertEventuallyMigrationState(t *testing.T, contextMsg string, expectedState apitypes.MigrationState, getStatus func() (apitypes.MigrationState, string, error)) { + t.Helper() + + var lastState apitypes.MigrationState + var lastMsg string + var lastErr error + + timeout := 10 * time.Second + interval := 100 * time.Millisecond + + ok := assert.Eventually(t, func() bool { + st, msg, err := getStatus() + lastState, lastMsg, lastErr = st, msg, err + if err != nil { + return false + } + return st == expectedState + }, timeout, interval, "%s: lastState=%s, lastMsg=%s, lastErr=%v", contextMsg, lastState, lastMsg, lastErr) + + if !ok { + require.FailNowf(t, "did not reach expected state", "%s: expected state=%s, got state=%s with message: %s", contextMsg, expectedState, lastState, lastMsg) + } +} + +// testMigrationAPIEndpoints tests the migration API endpoints return expected skeleton responses +func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) { + // Start the upgrade command in non-headless mode so API stays up + // Use --yes to bypass prompts + go func() { + err := runInstallerCmd( + "upgrade", + "--target", "linux", + "--license", licenseFile, + "--yes", + ) + if err != nil { + t.Logf("upgrade command exited with error: %v", err) + } + }() + + ctx := t.Context() + managerPort := 30081 // Default port for upgrade mode + + // Wait for API to be ready + httpClient := insecureHTTPClient() + waitForAPIReady(t, httpClient, fmt.Sprintf("https://localhost:%d/api/health", managerPort)) + + // Build API client and authenticate + c := apiclient.New(fmt.Sprintf("https://localhost:%d", managerPort), apiclient.WithHTTPClient(httpClient)) + + // For upgrade mode, we need to authenticate with a password + // The upgrade command should have a default password or we need to set one + // Let's use a default password for testing + password := "password" + require.NoError(t, c.Authenticate(ctx, password), "failed to authenticate") + + // POST /api/linux/migration/start with transferMode="copy" + startResp, err := c.StartKURLMigration(ctx, "copy", nil) + require.NoError(t, err, "failed to start migration") + require.NotEmpty(t, startResp.MigrationID, "migrationID should be returned") + require.Equal(t, "migration started successfully", startResp.Message, "expected success message") + + // GET /api/linux/kurl-migration/status + // The migration should eventually reach Failed state with the skeleton error + assertEventuallyMigrationState(t, "migration phase execution not yet implemented", apitypes.MigrationStateFailed, func() (apitypes.MigrationState, string, error) { + statusResp, err := c.GetKURLMigrationStatus(ctx) + if err != nil { + return "", "", err + } + return statusResp.State, statusResp.Message, nil + }) + + // Get final status to verify error message + finalStatus, err := c.GetKURLMigrationStatus(ctx) + require.NoError(t, err, "failed to get migration status") + require.Equal(t, apitypes.MigrationStateFailed, finalStatus.State, "migration should be in Failed state") + require.Contains(t, finalStatus.Error, "migration phase execution not yet implemented", + "expected skeleton error message in status") } From dfdcd297d15ff2eb416c7c86b9256df68e2c084c Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 13:48:38 -0500 Subject: [PATCH 03/37] remove example test --- api/internal/store/migration/example_test.go | 72 -------------------- 1 file changed, 72 deletions(-) delete mode 100644 api/internal/store/migration/example_test.go diff --git a/api/internal/store/migration/example_test.go b/api/internal/store/migration/example_test.go deleted file mode 100644 index adcb764e9a..0000000000 --- a/api/internal/store/migration/example_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package migration_test - -import ( - "fmt" - - "github.com/replicatedhq/embedded-cluster/api/internal/store" - "github.com/replicatedhq/embedded-cluster/api/types" -) - -func ExampleStore_complete_migration_flow() { - // Create a new global store - globalStore := store.NewMemoryStore() - - // Get the migration store - migrationStore := globalStore.MigrationStore() - - // Initialize a new migration - config := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", - } - - err := migrationStore.InitializeMigration("migration-123", "copy", config) - if err != nil { - fmt.Printf("Error initializing migration: %v\n", err) - return - } - - // Get migration ID - id, err := migrationStore.GetMigrationID() - if err != nil { - fmt.Printf("Error getting migration ID: %v\n", err) - return - } - fmt.Printf("Migration ID: %s\n", id) - - // Update migration state and phase - migrationStore.SetState(types.MigrationStateInProgress) - migrationStore.SetPhase(types.MigrationPhaseDiscovery) - migrationStore.SetMessage("Discovering kURL cluster configuration") - migrationStore.SetProgress(10) - - // Get status - status, err := migrationStore.GetStatus() - if err != nil { - fmt.Printf("Error getting status: %v\n", err) - return - } - - fmt.Printf("State: %s\n", status.State) - fmt.Printf("Phase: %s\n", status.Phase) - fmt.Printf("Message: %s\n", status.Message) - fmt.Printf("Progress: %d%%\n", status.Progress) - - // Continue migration - migrationStore.SetPhase(types.MigrationPhasePreparation) - migrationStore.SetMessage("Preparing migration environment") - migrationStore.SetProgress(25) - - // Complete migration - migrationStore.SetState(types.MigrationStateCompleted) - migrationStore.SetPhase(types.MigrationPhaseCompleted) - migrationStore.SetMessage("Migration completed successfully") - migrationStore.SetProgress(100) - - // Output: - // Migration ID: migration-123 - // State: InProgress - // Phase: Discovery - // Message: Discovering kURL cluster configuration - // Progress: 10% -} From 6a9c61baa53a8db00d462a0c391ecff41c1d5e1e Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 14:03:16 -0500 Subject: [PATCH 04/37] add function to discovery kotsadm namespace --- cmd/installer/cli/upgrade.go | 2 +- pkg-new/kurl/kurl.go | 44 ++++- pkg-new/kurl/kurl_test.go | 189 ++++++++++++++++---- tests/dryrun/upgrade_kurl_migration_test.go | 35 +++- 4 files changed, 217 insertions(+), 53 deletions(-) diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 4eeea40943..5b754a4b15 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -697,7 +697,7 @@ func runMigrationAPI( } // Read the actual password hash from kURL cluster's kotsadm-password secret - // Empty string will default to "kotsadm" namespace + // Pass empty string to auto-discover the kotsadm namespace pwdHashStr, err := kurl.GetPasswordHash(ctx, kurlCfg, "") if err != nil { return fmt.Errorf("failed to read password from kURL cluster: %w", err) diff --git a/pkg-new/kurl/kurl.go b/pkg-new/kurl/kurl.go index 1c268318c3..d745f7f7af 100644 --- a/pkg-new/kurl/kurl.go +++ b/pkg-new/kurl/kurl.go @@ -87,12 +87,46 @@ func getInstallDirectory(ctx context.Context, kcli client.Client) (string, error return installDir, nil } -// GetPasswordHash reads the kotsadm-password secret from the kotsadm namespace -// and returns the bcrypt password hash. This is used during migration to preserve the -// existing admin console password. +// DiscoverKotsadmNamespace finds the namespace containing the kotsadm Service. +// It checks "default" first, then searches all namespaces for a Service with label "app=kotsadm". +// Returns namespace name or error if not found. +func DiscoverKotsadmNamespace(ctx context.Context, cfg *Config) (string, error) { + // First, check the default namespace + defaultNsSvc := &corev1.Service{} + err := cfg.Client.Get(ctx, client.ObjectKey{ + Namespace: "default", + Name: "kotsadm", + }, defaultNsSvc) + if err == nil { + return "default", nil + } + + // If not found in default, search all namespaces for Service with app=kotsadm label + serviceList := &corev1.ServiceList{} + err = cfg.Client.List(ctx, serviceList, client.MatchingLabels{"app": "kotsadm"}) + if err != nil { + return "", fmt.Errorf("failed to list services: %w", err) + } + + if len(serviceList.Items) == 0 { + return "", fmt.Errorf("kotsadm service not found in any namespace") + } + + // Return the namespace of the first matching service + return serviceList.Items[0].Namespace, nil +} + +// GetPasswordHash reads the kotsadm-password secret and returns the bcrypt password hash. +// This is used during migration to preserve the existing admin console password. +// If namespace is empty, it discovers the kotsadm namespace automatically. func GetPasswordHash(ctx context.Context, cfg *Config, namespace string) (string, error) { + // Auto-discover namespace if not provided if namespace == "" { - namespace = KotsadmNamespace + discoveredNs, err := DiscoverKotsadmNamespace(ctx, cfg) + if err != nil { + return "", fmt.Errorf("discover kotsadm namespace: %w", err) + } + namespace = discoveredNs } secret := &corev1.Secret{} @@ -101,7 +135,7 @@ func GetPasswordHash(ctx context.Context, cfg *Config, namespace string) (string Name: KotsadmPasswordSecret, }, secret) if err != nil { - return "", fmt.Errorf("read kotsadm-password secret from cluster: %w", err) + return "", fmt.Errorf("read kotsadm-password secret from namespace %s: %w", namespace, err) } passwordHash, exists := secret.Data[KotsadmPasswordSecretKey] diff --git a/pkg-new/kurl/kurl_test.go b/pkg-new/kurl/kurl_test.go index 71604070e5..a3bf0da97c 100644 --- a/pkg-new/kurl/kurl_test.go +++ b/pkg-new/kurl/kurl_test.go @@ -110,24 +110,124 @@ func TestGetInstallDirectory(t *testing.T) { } } +func TestDiscoverKotsadmNamespace(t *testing.T) { + tests := []struct { + name string + objects []client.Object + wantNs string + wantErr bool + errContains string + }{ + { + name: "finds kotsadm service in default namespace", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{"app": "kotsadm"}, + }, + }, + }, + wantNs: "default", + wantErr: false, + }, + { + name: "finds kotsadm service in custom namespace when not in default", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "kots-namespace", + Labels: map[string]string{"app": "kotsadm"}, + }, + }, + }, + wantNs: "kots-namespace", + wantErr: false, + }, + { + name: "prioritizes default namespace over other namespaces", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{"app": "kotsadm"}, + }, + }, + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "other-namespace", + Labels: map[string]string{"app": "kotsadm"}, + }, + }, + }, + wantNs: "default", + wantErr: false, + }, + { + name: "kotsadm service not found", + objects: []client.Object{}, + wantNs: "", + wantErr: true, + errContains: "kotsadm service not found", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + kcli := fake.NewClientBuilder().WithObjects(tt.objects...).Build() + + cfg := &Config{ + Client: kcli, + InstallDir: "/var/lib/kurl", + } + + gotNs, err := DiscoverKotsadmNamespace(ctx, cfg) + + if tt.wantErr { + require.Error(t, err) + if tt.errContains != "" { + assert.Contains(t, err.Error(), tt.errContains) + } + } else { + require.NoError(t, err) + assert.Equal(t, tt.wantNs, gotNs) + } + }) + } +} + func TestGetPasswordHash(t *testing.T) { tests := []struct { name string - secret *corev1.Secret + objects []client.Object namespace string wantHash string wantErr bool errContains string }{ { - name: "successfully reads password hash", - secret: &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "kotsadm-password", - Namespace: "kotsadm", + name: "successfully reads password hash with auto-discovery", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{"app": "kotsadm"}, + }, }, - Data: map[string][]byte{ - "passwordBcrypt": []byte("$2a$10$hashed_password"), + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm-password", + Namespace: "default", + }, + Data: map[string][]byte{ + "passwordBcrypt": []byte("$2a$10$hashed_password"), + }, }, }, namespace: "", @@ -135,14 +235,16 @@ func TestGetPasswordHash(t *testing.T) { wantErr: false, }, { - name: "successfully reads password hash from custom namespace", - secret: &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "kotsadm-password", - Namespace: "custom-ns", - }, - Data: map[string][]byte{ - "passwordBcrypt": []byte("$2a$10$hashed_password"), + name: "successfully reads password hash from explicit namespace", + objects: []client.Object{ + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm-password", + Namespace: "custom-ns", + }, + Data: map[string][]byte{ + "passwordBcrypt": []byte("$2a$10$hashed_password"), + }, }, }, namespace: "custom-ns", @@ -150,21 +252,30 @@ func TestGetPasswordHash(t *testing.T) { wantErr: false, }, { - name: "secret not found", - secret: nil, + name: "secret not found with auto-discovery", + objects: []client.Object{}, namespace: "", wantHash: "", wantErr: true, - errContains: "read kotsadm-password secret", + errContains: "kotsadm service not found", }, { name: "secret missing passwordBcrypt key", - secret: &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "kotsadm-password", - Namespace: "kotsadm", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{"app": "kotsadm"}, + }, + }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm-password", + Namespace: "default", + }, + Data: map[string][]byte{}, }, - Data: map[string][]byte{}, }, namespace: "", wantHash: "", @@ -173,13 +284,22 @@ func TestGetPasswordHash(t *testing.T) { }, { name: "secret has empty passwordBcrypt value", - secret: &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "kotsadm-password", - Namespace: "kotsadm", + objects: []client.Object{ + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{"app": "kotsadm"}, + }, }, - Data: map[string][]byte{ - "passwordBcrypt": []byte(""), + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kotsadm-password", + Namespace: "default", + }, + Data: map[string][]byte{ + "passwordBcrypt": []byte(""), + }, }, }, namespace: "", @@ -192,14 +312,7 @@ func TestGetPasswordHash(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := context.Background() - - // Create fake client with or without the secret - var kcli client.Client - if tt.secret != nil { - kcli = fake.NewClientBuilder().WithObjects(tt.secret).Build() - } else { - kcli = fake.NewClientBuilder().Build() - } + kcli := fake.NewClientBuilder().WithObjects(tt.objects...).Build() cfg := &Config{ Client: kcli, diff --git a/tests/dryrun/upgrade_kurl_migration_test.go b/tests/dryrun/upgrade_kurl_migration_test.go index 99c888c757..a73185dfc7 100644 --- a/tests/dryrun/upgrade_kurl_migration_test.go +++ b/tests/dryrun/upgrade_kurl_migration_test.go @@ -63,21 +63,38 @@ func TestUpgradeKURLMigration(t *testing.T) { err = kurlKubeClient.Create(context.Background(), kurlConfigMap, &ctrlclient.CreateOptions{}) require.NoError(t, err, "failed to create kURL ConfigMap") - // Create the kotsadm namespace for the password secret - kotsadmNS := &corev1.Namespace{ + // Create the kotsadm Service in default namespace for namespace discovery + // This simulates how kURL deploys kotsadm + kotsadmService := &corev1.Service{ TypeMeta: metav1.TypeMeta{ - Kind: "Namespace", + Kind: "Service", APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "kotsadm", + Name: "kotsadm", + Namespace: "default", + Labels: map[string]string{ + "app": "kotsadm", + }, + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{ + "app": "kotsadm", + }, + Ports: []corev1.ServicePort{ + { + Name: "http", + Port: 3000, + Protocol: corev1.ProtocolTCP, + }, + }, }, } - err = kurlKubeClient.Create(context.Background(), kotsadmNS, &ctrlclient.CreateOptions{}) - require.NoError(t, err, "failed to create kotsadm namespace") + err = kurlKubeClient.Create(context.Background(), kotsadmService, &ctrlclient.CreateOptions{}) + require.NoError(t, err, "failed to create kotsadm Service") - // Create the kotsadm-password secret with the password "password" - // This is what the migration API will read to authenticate users + // Create the kotsadm-password secret with the password "password" in default namespace + // The auto-discovery will find the kotsadm service in default and look for the secret there passwordHash, err := bcrypt.GenerateFromPassword([]byte("password"), bcrypt.DefaultCost) require.NoError(t, err, "failed to generate password hash") kotsadmPasswordSecret := &corev1.Secret{ @@ -87,7 +104,7 @@ func TestUpgradeKURLMigration(t *testing.T) { }, ObjectMeta: metav1.ObjectMeta{ Name: "kotsadm-password", - Namespace: "kotsadm", + Namespace: "default", }, Data: map[string][]byte{ "passwordBcrypt": passwordHash, From 2d907b0732f4172221c1151508487ce9fdeb2c7f Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 14:15:51 -0500 Subject: [PATCH 05/37] update web api types --- web/src/types/api.ts | 209 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) diff --git a/web/src/types/api.ts b/web/src/types/api.ts index 9fbfcdbf18..e7bd75934a 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -920,6 +920,66 @@ export interface paths { patch?: never; trace?: never; }; + "/migration/config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the installation config for migration + * @description Get the installation config extracted from kURL merged with EC defaults + */ + get: operations["getMigrationInstallationConfig"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/migration/start": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Start a migration from kURL to Embedded Cluster + * @description Start a migration from kURL to Embedded Cluster with the provided configuration + */ + post: operations["postStartMigration"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/migration/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the status of the migration + * @description Get the current status and progress of the migration + */ + get: operations["getMigrationStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { @@ -1796,6 +1856,7 @@ export interface components { "types.LinuxInfraSetupRequest": { ignoreHostPreflights: boolean; }; + /** @description Config contains optional installation configuration that will be merged with defaults */ "types.LinuxInstallationConfig": { adminConsolePort?: number; dataDirectory?: string; @@ -1813,6 +1874,38 @@ export interface components { resolved: components["schemas"]["types.LinuxInstallationConfig"]; values: components["schemas"]["types.LinuxInstallationConfig"]; }; + /** + * @description Phase is the current phase of the migration process + * @example Discovery + * @enum {string} + */ + "types.MigrationPhase": "Discovery" | "Preparation" | "ECInstall" | "DataTransfer" | "Completed"; + /** + * @description State is the current state of the migration + * @example InProgress + * @enum {string} + */ + "types.MigrationState": "NotStarted" | "InProgress" | "Completed" | "Failed"; + /** @description Current status and progress of a migration */ + "types.MigrationStatusResponse": { + /** + * @description Error contains the error message if the migration failed + * @example + */ + error?: string; + /** + * @description Message is a user-facing message describing the current status + * @example Discovering kURL cluster configuration + */ + message: string; + phase: components["schemas"]["types.MigrationPhase"]; + /** + * @description Progress is the completion percentage (0-100) + * @example 25 + */ + progress: number; + state: components["schemas"]["types.MigrationState"]; + }; "types.PatchAppConfigValuesRequest": { values: components["schemas"]["types.AppConfigValues"]; }; @@ -1829,6 +1922,24 @@ export interface components { strict: boolean; title: string; }; + /** @description Request body for starting a migration from kURL to Embedded Cluster */ + "types.StartMigrationRequest": { + config?: components["schemas"]["types.LinuxInstallationConfig"]; + transferMode: components["schemas"]["types.TransferMode"]; + }; + /** @description Response returned when a migration is successfully started */ + "types.StartMigrationResponse": { + /** + * @description Message is a user-facing message about the migration status + * @example Migration started successfully + */ + message: string; + /** + * @description MigrationID is the unique identifier for this migration + * @example 550e8400-e29b-41d4-a716-446655440000 + */ + migrationId: string; + }; /** * @example Succeeded * @enum {string} @@ -1842,6 +1953,12 @@ export interface components { "types.TemplateAppConfigRequest": { values: components["schemas"]["types.AppConfigValues"]; }; + /** + * @description TransferMode specifies whether to copy or move data during migration + * @example copy + * @enum {string} + */ + "types.TransferMode": "copy" | "move"; "types.UpgradeAppPreflightsStatusResponse": { allowIgnoreAppPreflights: boolean; hasStrictAppPreflightFailures: boolean; @@ -3366,4 +3483,96 @@ export interface operations { }; }; }; + getMigrationInstallationConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.LinuxInstallationConfigResponse"]; + }; + }; + }; + }; + postStartMigration: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Start Migration Request */ + requestBody: { + content: { + "application/json": components["schemas"]["types.StartMigrationRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.StartMigrationResponse"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; + getMigrationStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.MigrationStatusResponse"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; } From 001ea87f38b25f735db87d8cf6c657e57bcaa73f Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 14:45:15 -0500 Subject: [PATCH 06/37] address feedback --- api/client/migration.go | 6 +- api/docs/docs.go | 2 +- api/docs/swagger.json | 2 +- api/docs/swagger.yaml | 150 +++++----- api/internal/handlers/migration/handler.go | 6 +- api/routes.go | 2 +- tests/dryrun/upgrade_kurl_migration_test.go | 5 +- web/src/types/api.ts | 304 ++++++++++---------- 8 files changed, 240 insertions(+), 237 deletions(-) diff --git a/api/client/migration.go b/api/client/migration.go index 309715b218..9b923c1da5 100644 --- a/api/client/migration.go +++ b/api/client/migration.go @@ -12,7 +12,7 @@ import ( // GetKURLMigrationConfig returns the installation configuration with kURL values, EC defaults, and resolved values. func (c *client) GetKURLMigrationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/migration/config", c.apiURL), nil) + req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/kurl-migration/config", c.apiURL), nil) if err != nil { return types.LinuxInstallationConfigResponse{}, fmt.Errorf("create request: %w", err) } @@ -48,7 +48,7 @@ func (c *client) StartKURLMigration(ctx context.Context, transferMode string, co return types.StartMigrationResponse{}, fmt.Errorf("marshal request: %w", err) } - req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/api/linux/migration/start", c.apiURL), bytes.NewReader(body)) + req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/api/linux/kurl-migration/start", c.apiURL), bytes.NewReader(body)) if err != nil { return types.StartMigrationResponse{}, fmt.Errorf("create request: %w", err) } @@ -75,7 +75,7 @@ func (c *client) StartKURLMigration(ctx context.Context, transferMode string, co // GetKURLMigrationStatus returns the current status of the migration. func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/migration/status", c.apiURL), nil) + req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/kurl-migration/status", c.apiURL), nil) if err != nil { return types.MigrationStatusResponse{}, fmt.Errorf("create request: %w", err) } diff --git a/api/docs/docs.go b/api/docs/docs.go index ef39f90d86..fb237cec9a 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index c987dc9d29..2ba4b2605e 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}},"/migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 9b8669732d..4c55ecbcbe 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -1945,6 +1945,81 @@ paths: summary: Upgrade the app tags: - kubernetes-upgrade + /kurl-migration/config: + get: + description: Get the installation config extracted from kURL merged with EC + defaults + operationId: getMigrationInstallationConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.LinuxInstallationConfigResponse' + description: OK + security: + - bearerauth: [] + summary: Get the installation config for migration + tags: + - migration + /kurl-migration/start: + post: + description: Start a migration from kURL to Embedded Cluster with the provided + configuration + operationId: postStartMigration + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartMigrationRequest' + description: Start Migration Request + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartMigrationResponse' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Bad Request + "409": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Conflict + security: + - bearerauth: [] + summary: Start a migration from kURL to Embedded Cluster + tags: + - migration + /kurl-migration/status: + get: + description: Get the current status and progress of the migration + operationId: getMigrationStatus + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.MigrationStatusResponse' + description: OK + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Not Found + security: + - bearerauth: [] + summary: Get the status of the migration + tags: + - migration /linux/install/airgap/process: post: description: Process the airgap bundle for install @@ -2598,80 +2673,5 @@ paths: summary: Upgrade the infrastructure tags: - linux-upgrade - /migration/config: - get: - description: Get the installation config extracted from kURL merged with EC - defaults - operationId: getMigrationInstallationConfig - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.LinuxInstallationConfigResponse' - description: OK - security: - - bearerauth: [] - summary: Get the installation config for migration - tags: - - migration - /migration/start: - post: - description: Start a migration from kURL to Embedded Cluster with the provided - configuration - operationId: postStartMigration - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/types.StartMigrationRequest' - description: Start Migration Request - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.StartMigrationResponse' - description: OK - "400": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Bad Request - "409": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Conflict - security: - - bearerauth: [] - summary: Start a migration from kURL to Embedded Cluster - tags: - - migration - /migration/status: - get: - description: Get the current status and progress of the migration - operationId: getMigrationStatus - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.MigrationStatusResponse' - description: OK - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Not Found - security: - - bearerauth: [] - summary: Get the status of the migration - tags: - - migration servers: - url: /api diff --git a/api/internal/handlers/migration/handler.go b/api/internal/handlers/migration/handler.go index 8b329d7322..0a4e77dcbc 100644 --- a/api/internal/handlers/migration/handler.go +++ b/api/internal/handlers/migration/handler.go @@ -45,7 +45,7 @@ func New(opts ...Option) *Handler { // @Security bearerauth // @Produce json // @Success 200 {object} types.LinuxInstallationConfigResponse -// @Router /migration/config [get] +// @Router /kurl-migration/config [get] func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) { config, err := h.controller.GetInstallationConfig(r.Context()) if err != nil { @@ -70,7 +70,7 @@ func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) // @Success 200 {object} types.StartMigrationResponse // @Failure 400 {object} types.APIError // @Failure 409 {object} types.APIError -// @Router /migration/start [post] +// @Router /kurl-migration/start [post] func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { var request types.StartMigrationRequest if err := utils.BindJSON(w, r, &request, h.logger); err != nil { @@ -120,7 +120,7 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { // @Produce json // @Success 200 {object} types.MigrationStatusResponse // @Failure 404 {object} types.APIError -// @Router /migration/status [get] +// @Router /kurl-migration/status [get] func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { status, err := h.controller.GetMigrationStatus(r.Context()) if err != nil { diff --git a/api/routes.go b/api/routes.go index e22ef8b79d..d81864f834 100644 --- a/api/routes.go +++ b/api/routes.go @@ -137,7 +137,7 @@ func (a *API) registerConsoleRoutes(router *mux.Router) { } func (a *API) registerMigrationRoutes(router *mux.Router) { - migrationRouter := router.PathPrefix("/migration").Subrouter() + migrationRouter := router.PathPrefix("/kurl-migration").Subrouter() migrationRouter.HandleFunc("/config", a.handlers.migration.GetInstallationConfig).Methods("GET") migrationRouter.HandleFunc("/start", a.handlers.migration.PostStartMigration).Methods("POST") migrationRouter.HandleFunc("/status", a.handlers.migration.GetMigrationStatus).Methods("GET") diff --git a/tests/dryrun/upgrade_kurl_migration_test.go b/tests/dryrun/upgrade_kurl_migration_test.go index a73185dfc7..50941d8dc4 100644 --- a/tests/dryrun/upgrade_kurl_migration_test.go +++ b/tests/dryrun/upgrade_kurl_migration_test.go @@ -25,6 +25,9 @@ import ( func TestUpgradeKURLMigration(t *testing.T) { t.Setenv("ENABLE_V3", "1") + // Ensure UI assets are available when starting API in non-headless tests + prepareWebAssetsForTests(t) + // Create the kURL kubeconfig file at the production path // This file doesn't need to be a valid kubeconfig since dryrun mode // will use the mock client. It just needs to exist for the file check. @@ -185,7 +188,7 @@ func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) password := "password" require.NoError(t, c.Authenticate(ctx, password), "failed to authenticate") - // POST /api/linux/migration/start with transferMode="copy" + // POST /api/linux/kurl-migration/start with transferMode="copy" startResp, err := c.StartKURLMigration(ctx, "copy", nil) require.NoError(t, err, "failed to start migration") require.NotEmpty(t, startResp.MigrationID, "migrationID should be returned") diff --git a/web/src/types/api.ts b/web/src/types/api.ts index e7bd75934a..7ce1695f38 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -412,6 +412,66 @@ export interface paths { patch?: never; trace?: never; }; + "/kurl-migration/config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the installation config for migration + * @description Get the installation config extracted from kURL merged with EC defaults + */ + get: operations["getMigrationInstallationConfig"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/kurl-migration/start": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Start a migration from kURL to Embedded Cluster + * @description Start a migration from kURL to Embedded Cluster with the provided configuration + */ + post: operations["postStartMigration"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/kurl-migration/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the status of the migration + * @description Get the current status and progress of the migration + */ + get: operations["getMigrationStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/linux/install/airgap/process": { parameters: { query?: never; @@ -920,66 +980,6 @@ export interface paths { patch?: never; trace?: never; }; - "/migration/config": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get the installation config for migration - * @description Get the installation config extracted from kURL merged with EC defaults - */ - get: operations["getMigrationInstallationConfig"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/migration/start": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Start a migration from kURL to Embedded Cluster - * @description Start a migration from kURL to Embedded Cluster with the provided configuration - */ - post: operations["postStartMigration"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/migration/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get the status of the migration - * @description Get the current status and progress of the migration - */ - get: operations["getMigrationStatus"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { @@ -2669,6 +2669,98 @@ export interface operations { }; }; }; + getMigrationInstallationConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.LinuxInstallationConfigResponse"]; + }; + }; + }; + }; + postStartMigration: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Start Migration Request */ + requestBody: { + content: { + "application/json": components["schemas"]["types.StartMigrationRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.StartMigrationResponse"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; + getMigrationStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.MigrationStatusResponse"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; postLinuxInstallProcessAirgap: { parameters: { query?: never; @@ -3483,96 +3575,4 @@ export interface operations { }; }; }; - getMigrationInstallationConfig: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.LinuxInstallationConfigResponse"]; - }; - }; - }; - }; - postStartMigration: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Start Migration Request */ - requestBody: { - content: { - "application/json": components["schemas"]["types.StartMigrationRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.StartMigrationResponse"]; - }; - }; - /** @description Bad Request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - }; - }; - getMigrationStatus: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.MigrationStatusResponse"]; - }; - }; - /** @description Not Found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - }; - }; } From 2b73e745fc286a7bb2a9eb9d9ebf22120b844b45 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 15:52:51 -0500 Subject: [PATCH 07/37] fix lint --- .gitignore | 3 +++ api/internal/managers/migration/manager.go | 4 +--- api/internal/store/migration/store_test.go | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 8dd72257d1..f7b6c7c147 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ e2e/support-bundle*.tar.gz # Local Netlify folder .netlify + +# Test web assets created during dryrun tests +tests/dryrun/web/ diff --git a/api/internal/managers/migration/manager.go b/api/internal/managers/migration/manager.go index 12357728c9..cabff77939 100644 --- a/api/internal/managers/migration/manager.go +++ b/api/internal/managers/migration/manager.go @@ -106,10 +106,8 @@ func (m *migrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstal // MergeConfigs merges user, kURL, and default configs with proper precedence // Precedence order: userConfig > kurlConfig > defaults func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { - merged := types.LinuxInstallationConfig{} - // Start with defaults as the base - merged = defaults + merged := defaults // Apply kURL config, overwriting defaults only for non-zero values if kurlConfig.AdminConsolePort != 0 { diff --git a/api/internal/store/migration/store_test.go b/api/internal/store/migration/store_test.go index 5ed38849c5..b8bd15d93c 100644 --- a/api/internal/store/migration/store_test.go +++ b/api/internal/store/migration/store_test.go @@ -197,8 +197,8 @@ func TestDeepCopyPreventsConfigMutation(t *testing.T) { // Get config and modify it retrievedConfig, err := store.GetConfig() assert.NoError(t, err) - retrievedConfig.AdminConsolePort = 99999 - retrievedConfig.DataDirectory = "/tmp/modified" + retrievedConfig.AdminConsolePort = 99999 //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy + retrievedConfig.DataDirectory = "/tmp/modified" //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy // Verify original config in store is unchanged retrievedConfig2, err := store.GetConfig() @@ -219,8 +219,8 @@ func TestDeepCopyPreventsStatusMutation(t *testing.T) { // Get status and modify it status, err := store.GetStatus() assert.NoError(t, err) - status.Message = "Modified message" - status.Progress = 99 + status.Message = "Modified message" //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy + status.Progress = 99 //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy // Verify original status in store is unchanged status2, err := store.GetStatus() From fe84b34819314bdb35d8bb71af3ff7c32602a3ad Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 16:17:14 -0500 Subject: [PATCH 08/37] fix lint --- api/internal/store/migration/store_test.go | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/api/internal/store/migration/store_test.go b/api/internal/store/migration/store_test.go index b8bd15d93c..ba9a9c99eb 100644 --- a/api/internal/store/migration/store_test.go +++ b/api/internal/store/migration/store_test.go @@ -194,13 +194,17 @@ func TestDeepCopyPreventsConfigMutation(t *testing.T) { err := store.InitializeMigration("test-id", "copy", config) assert.NoError(t, err) - // Get config and modify it + // Get config and modify it (to verify deep copy prevents mutation) retrievedConfig, err := store.GetConfig() assert.NoError(t, err) - retrievedConfig.AdminConsolePort = 99999 //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy - retrievedConfig.DataDirectory = "/tmp/modified" //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy + retrievedConfig.AdminConsolePort = 99999 + retrievedConfig.DataDirectory = "/tmp/modified" - // Verify original config in store is unchanged + // Verify the local modifications were made + assert.Equal(t, 99999, retrievedConfig.AdminConsolePort) + assert.Equal(t, "/tmp/modified", retrievedConfig.DataDirectory) + + // Verify original config in store is unchanged (proving deep copy works) retrievedConfig2, err := store.GetConfig() assert.NoError(t, err) assert.Equal(t, 30000, retrievedConfig2.AdminConsolePort) @@ -216,13 +220,17 @@ func TestDeepCopyPreventsStatusMutation(t *testing.T) { err = store.SetMessage("Original message") assert.NoError(t, err) - // Get status and modify it + // Get status and modify it (to verify deep copy prevents mutation) status, err := store.GetStatus() assert.NoError(t, err) - status.Message = "Modified message" //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy - status.Progress = 99 //nolint:ineffassign,staticcheck // intentionally modifying to verify deep copy + status.Message = "Modified message" + status.Progress = 99 + + // Verify the local modifications were made + assert.Equal(t, "Modified message", status.Message) + assert.Equal(t, 99, status.Progress) - // Verify original status in store is unchanged + // Verify original status in store is unchanged (proving deep copy works) status2, err := store.GetStatus() assert.NoError(t, err) assert.Equal(t, "Original message", status2.Message) From 1f418e3b8044735d6fe16f7e2ea22694ebb1bff1 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 16:30:38 -0500 Subject: [PATCH 09/37] address feedback --- api/controllers/migration/controller.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api/controllers/migration/controller.go b/api/controllers/migration/controller.go index 746b7b217f..767e2e7c80 100644 --- a/api/controllers/migration/controller.go +++ b/api/controllers/migration/controller.go @@ -176,9 +176,12 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t c.logger.WithField("migrationID", migrationID).Info("StartMigration: Migration initialized, launching background goroutine") - // Launch background goroutine + // Launch background goroutine with detached context + // We use WithoutCancel to inherit context values (trace IDs, logger fields) + // but detach from the request's cancellation so migration continues after HTTP response + backgroundCtx := context.WithoutCancel(ctx) go func() { - if err := c.Run(context.Background()); err != nil { + if err := c.Run(backgroundCtx); err != nil { c.logger.WithError(err).Error("StartMigration: Background migration failed") } }() From 3722c1921f9329fd3539ba62f2162c2d5be18efa Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Thu, 20 Nov 2025 19:40:39 -0500 Subject: [PATCH 10/37] f --- api/controllers/migration/controller.go | 70 ++++++++++++------------- cmd/installer/cli/upgrade.go | 4 +- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/api/controllers/migration/controller.go b/api/controllers/migration/controller.go index 767e2e7c80..768c416e73 100644 --- a/api/controllers/migration/controller.go +++ b/api/controllers/migration/controller.go @@ -90,19 +90,19 @@ func NewMigrationController(opts ...ControllerOption) (*MigrationController, err // GetInstallationConfig extracts kURL config, gets EC defaults, and returns merged config func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { - c.logger.Debug("GetInstallationConfig: Fetching kURL config, EC defaults, and merging") + c.logger.Debug("fetching kurl config, ec defaults, and merging") // Get kURL config from the running cluster kurlConfig, err := c.manager.GetKurlConfig(ctx) if err != nil { - c.logger.WithError(err).Error("GetInstallationConfig: Failed to get kURL config") + c.logger.WithError(err).Error("get kurl config") return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get kurl config: %w", err) } // Get EC defaults defaults, err := c.manager.GetECDefaults(ctx) if err != nil { - c.logger.WithError(err).Error("GetInstallationConfig: Failed to get EC defaults") + c.logger.WithError(err).Error("get ec defaults") return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get ec defaults: %w", err) } @@ -114,7 +114,7 @@ func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types. "kurlConfig": kurlConfig, "defaults": defaults, "resolved": resolved, - }).Debug("GetInstallationConfig: Config merged successfully") + }).Debug("config merged successfully") return types.LinuxInstallationConfigResponse{ Values: kurlConfig, @@ -128,53 +128,53 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t c.logger.WithFields(logrus.Fields{ "transferMode": transferMode, "config": config, - }).Info("StartMigration: Starting migration") + }).Info("starting migration") // Validate transfer mode if err := c.manager.ValidateTransferMode(transferMode); err != nil { - c.logger.WithError(err).Error("StartMigration: Invalid transfer mode") + c.logger.WithError(err).Error("invalid transfer mode") return "", types.NewBadRequestError(err) } // Check if migration already exists if _, err := c.store.GetMigrationID(); err == nil { - c.logger.Warn("StartMigration: Migration already in progress") + c.logger.Warn("migration already in progress") return "", types.NewConflictError(types.ErrMigrationAlreadyStarted) } // Generate UUID for migration migrationID := uuid.New().String() - c.logger.WithField("migrationID", migrationID).Debug("StartMigration: Generated migration ID") + c.logger.WithField("migrationID", migrationID).Debug("generated migration id") // Get defaults and merge with user config kurlConfig, err := c.manager.GetKurlConfig(ctx) if err != nil { - c.logger.WithError(err).Error("StartMigration: Failed to get kURL config") + c.logger.WithError(err).Error("get kurl config") return "", fmt.Errorf("get kurl config: %w", err) } defaults, err := c.manager.GetECDefaults(ctx) if err != nil { - c.logger.WithError(err).Error("StartMigration: Failed to get EC defaults") + c.logger.WithError(err).Error("get ec defaults") return "", fmt.Errorf("get ec defaults: %w", err) } resolvedConfig := c.manager.MergeConfigs(config, kurlConfig, defaults) - c.logger.WithField("resolvedConfig", resolvedConfig).Debug("StartMigration: Config merged") + c.logger.WithField("resolvedConfig", resolvedConfig).Debug("config merged") // Initialize migration in store if err := c.store.InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { - c.logger.WithError(err).Error("StartMigration: Failed to initialize migration") + c.logger.WithError(err).Error("initialize migration") return "", fmt.Errorf("initialize migration: %w", err) } // Set initial state to NotStarted if err := c.store.SetState(types.MigrationStateNotStarted); err != nil { - c.logger.WithError(err).Error("StartMigration: Failed to set initial state") + c.logger.WithError(err).Error("set initial state") return "", fmt.Errorf("set initial state: %w", err) } - c.logger.WithField("migrationID", migrationID).Info("StartMigration: Migration initialized, launching background goroutine") + c.logger.WithField("migrationID", migrationID).Info("migration initialized, launching background goroutine") // Launch background goroutine with detached context // We use WithoutCancel to inherit context values (trace IDs, logger fields) @@ -182,7 +182,7 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t backgroundCtx := context.WithoutCancel(ctx) go func() { if err := c.Run(backgroundCtx); err != nil { - c.logger.WithError(err).Error("StartMigration: Background migration failed") + c.logger.WithError(err).Error("background migration failed") } }() @@ -191,15 +191,15 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t // GetMigrationStatus returns current migration status func (c *MigrationController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { - c.logger.Debug("GetMigrationStatus: Fetching migration status") + c.logger.Debug("fetching migration status") status, err := c.store.GetStatus() if err != nil { if err == types.ErrNoActiveMigration { - c.logger.Warn("GetMigrationStatus: No active migration found") + c.logger.Warn("no active migration found") return types.MigrationStatusResponse{}, types.NewNotFoundError(err) } - c.logger.WithError(err).Error("GetMigrationStatus: Failed to get status") + c.logger.WithError(err).Error("get status") return types.MigrationStatusResponse{}, fmt.Errorf("get status: %w", err) } @@ -207,14 +207,14 @@ func (c *MigrationController) GetMigrationStatus(ctx context.Context) (types.Mig "state": status.State, "phase": status.Phase, "progress": status.Progress, - }).Debug("GetMigrationStatus: Status retrieved") + }).Debug("status retrieved") return status, nil } // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) func (c *MigrationController) Run(ctx context.Context) error { - c.logger.Info("Run: Starting migration orchestration") + c.logger.Info("starting migration orchestration") // TODO: Phase implementations added in PR 8 // This is a skeleton implementation that will be expanded in the next PR @@ -222,18 +222,18 @@ func (c *MigrationController) Run(ctx context.Context) error { // Get current state from store status, err := c.store.GetStatus() if err != nil { - c.logger.WithError(err).Error("Run: Failed to get status") + c.logger.WithError(err).Error("get status") return fmt.Errorf("get status: %w", err) } c.logger.WithFields(logrus.Fields{ "state": status.State, "phase": status.Phase, - }).Debug("Run: Current migration state") + }).Debug("current migration state") // If InProgress, resume from current phase if status.State == types.MigrationStateInProgress { - c.logger.WithField("phase", status.Phase).Info("Run: Resuming from current phase") + c.logger.WithField("phase", status.Phase).Info("resuming from current phase") // TODO: Resume logic in PR 8 } @@ -247,40 +247,40 @@ func (c *MigrationController) Run(ctx context.Context) error { } for _, phase := range phases { - c.logger.WithField("phase", phase).Info("Run: Executing phase (skeleton)") + c.logger.WithField("phase", phase).Info("executing phase (skeleton)") // Set state to InProgress if err := c.store.SetState(types.MigrationStateInProgress); err != nil { - c.logger.WithError(err).Error("Run: Failed to set state to InProgress") + c.logger.WithError(err).Error("set state to in progress") if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + c.logger.WithError(setErr).Error("set state to failed") } if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set error message") + c.logger.WithError(setErr).Error("set error message") } return fmt.Errorf("set state: %w", err) } // Set current phase if err := c.store.SetPhase(phase); err != nil { - c.logger.WithError(err).Error("Run: Failed to set phase") + c.logger.WithError(err).Error("set phase") if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + c.logger.WithError(setErr).Error("set state to failed") } if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set error message") + c.logger.WithError(setErr).Error("set error message") } return fmt.Errorf("set phase: %w", err) } // Execute phase if err := c.manager.ExecutePhase(ctx, phase); err != nil { - c.logger.WithError(err).WithField("phase", phase).Error("Run: Phase execution failed") + c.logger.WithError(err).WithField("phase", phase).Error("phase execution failed") if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set state to Failed") + c.logger.WithError(setErr).Error("set state to failed") } if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("Run: Failed to set error message") + c.logger.WithError(setErr).Error("set error message") } return fmt.Errorf("execute phase %s: %w", phase, err) } @@ -288,10 +288,10 @@ func (c *MigrationController) Run(ctx context.Context) error { // Set state to Completed if err := c.store.SetState(types.MigrationStateCompleted); err != nil { - c.logger.WithError(err).Error("Run: Failed to set state to Completed") + c.logger.WithError(err).Error("set state to completed") return fmt.Errorf("set completed state: %w", err) } - c.logger.Info("Run: Migration orchestration completed (skeleton)") + c.logger.Info("migration orchestration completed (skeleton)") return nil } diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 5b754a4b15..9077a33d5c 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -786,11 +786,9 @@ func runMigrationAPI( return fmt.Errorf("failed to start migration API: %w", err) } - logrus.Infof("\nVisit the %s manager to complete the upgrade: %s\n", + logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", appTitle, getManagerURL(tlsConfig.Hostname, managerPort)) - logrus.Info("\nThe upgrade process will guide you through upgrading from kURL to Embedded Cluster.") - logrus.Info("Press Ctrl+C to cancel.\n") // Wait for either user cancellation or API unexpected exit select { From 0c10a4dbbc6abe77fa5ee4c38a906fbdf1363b08 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 11:18:02 -0500 Subject: [PATCH 11/37] address feedback --- api/api.go | 12 +- api/client/client.go | 4 +- api/client/migration.go | 28 +- api/controllers.go | 35 -- .../controller.go | 163 +++++---- .../controller_mock.go | 14 +- .../controller_test.go | 177 +++++---- api/handlers.go | 44 ++- .../{migration => kurlmigration}/handler.go | 29 +- .../handlers/migration/handler_test.go | 336 ------------------ .../{migration => kurlmigration}/manager.go | 60 ++-- .../manager_mock.go | 4 +- .../manager_test.go | 45 ++- .../{migration => kurlmigration}/store.go | 92 +++-- .../store_mock.go | 25 +- .../store_test.go | 28 +- api/internal/store/store.go | 16 +- api/internal/store/store_mock.go | 8 +- api/routes.go | 6 +- api/types/migration.go | 52 +-- .../cli/headless/install/mock_client.go | 8 +- cmd/installer/cli/upgrade.go | 89 ++--- pkg-new/kurl/kurl.go | 2 + tests/dryrun/upgrade_kurl_migration_test.go | 10 +- 24 files changed, 491 insertions(+), 796 deletions(-) delete mode 100644 api/controllers.go rename api/controllers/{migration => kurlmigration}/controller.go (55%) rename api/controllers/{migration => kurlmigration}/controller_mock.go (62%) rename api/controllers/{migration => kurlmigration}/controller_test.go (73%) rename api/internal/handlers/{migration => kurlmigration}/handler.go (76%) delete mode 100644 api/internal/handlers/migration/handler_test.go rename api/internal/managers/{migration => kurlmigration}/manager.go (74%) rename api/internal/managers/{migration => kurlmigration}/manager_mock.go (96%) rename api/internal/managers/{migration => kurlmigration}/manager_test.go (77%) rename api/internal/store/{migration => kurlmigration}/store.go (59%) rename api/internal/store/{migration => kurlmigration}/store_mock.go (65%) rename api/internal/store/{migration => kurlmigration}/store_test.go (88%) diff --git a/api/api.go b/api/api.go index a7fc8fe0b7..7de06f01f3 100644 --- a/api/api.go +++ b/api/api.go @@ -7,9 +7,9 @@ import ( "github.com/replicatedhq/embedded-cluster/api/controllers/console" kubernetesinstall "github.com/replicatedhq/embedded-cluster/api/controllers/kubernetes/install" kubernetesupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/kubernetes/upgrade" + kurlmigration "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" linuxinstall "github.com/replicatedhq/embedded-cluster/api/controllers/linux/install" linuxupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/linux/upgrade" - "github.com/replicatedhq/embedded-cluster/api/controllers/migration" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/replicatedhq/embedded-cluster/pkg-new/preflights" @@ -57,7 +57,7 @@ type API struct { linuxUpgradeController linuxupgrade.Controller kubernetesInstallController kubernetesinstall.Controller kubernetesUpgradeController kubernetesupgrade.Controller - migrationController migration.Controller + kurlMigrationController kurlmigration.Controller handlers handlers } @@ -108,9 +108,9 @@ func WithKubernetesUpgradeController(kubernetesUpgradeController kubernetesupgra } // WithMigrationController configures the migration controller for the API. -func WithMigrationController(migrationController migration.Controller) Option { +func WithMigrationController(kurlMigrationController kurlmigration.Controller) Option { return func(a *API) { - a.migrationController = migrationController + a.kurlMigrationController = kurlMigrationController } } @@ -186,10 +186,6 @@ func New(cfg types.APIConfig, opts ...Option) (*API, error) { return nil, fmt.Errorf("init clients: %w", err) } - if err := api.initControllers(); err != nil { - return nil, fmt.Errorf("init controllers: %w", err) - } - if err := api.initHandlers(); err != nil { return nil, fmt.Errorf("init handlers: %w", err) } diff --git a/api/client/client.go b/api/client/client.go index 02f3ebf722..bd59dcdba6 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -42,8 +42,8 @@ type Client interface { // kURL Migration methods GetKURLMigrationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) - StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartMigrationResponse, error) - GetKURLMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) + StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartKURLMigrationResponse, error) + GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) GetKubernetesInstallationConfig(ctx context.Context) (types.KubernetesInstallationConfigResponse, error) ConfigureKubernetesInstallation(ctx context.Context, config types.KubernetesInstallationConfig) (types.Status, error) diff --git a/api/client/migration.go b/api/client/migration.go index 9b923c1da5..d7b58db85d 100644 --- a/api/client/migration.go +++ b/api/client/migration.go @@ -37,63 +37,63 @@ func (c *client) GetKURLMigrationConfig(ctx context.Context) (types.LinuxInstall } // StartKURLMigration starts a new kURL to EC migration. -func (c *client) StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartMigrationResponse, error) { - requestBody := types.StartMigrationRequest{ +func (c *client) StartKURLMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (types.StartKURLMigrationResponse, error) { + requestBody := types.StartKURLMigrationRequest{ TransferMode: types.TransferMode(transferMode), Config: config, } body, err := json.Marshal(requestBody) if err != nil { - return types.StartMigrationResponse{}, fmt.Errorf("marshal request: %w", err) + return types.StartKURLMigrationResponse{}, fmt.Errorf("marshal request: %w", err) } req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/api/linux/kurl-migration/start", c.apiURL), bytes.NewReader(body)) if err != nil { - return types.StartMigrationResponse{}, fmt.Errorf("create request: %w", err) + return types.StartKURLMigrationResponse{}, fmt.Errorf("create request: %w", err) } req.Header.Set("Content-Type", "application/json") setAuthorizationHeader(req, c.token) resp, err := c.httpClient.Do(req) if err != nil { - return types.StartMigrationResponse{}, fmt.Errorf("do request: %w", err) + return types.StartKURLMigrationResponse{}, fmt.Errorf("do request: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return types.StartMigrationResponse{}, errorFromResponse(resp) + return types.StartKURLMigrationResponse{}, errorFromResponse(resp) } - var result types.StartMigrationResponse + var result types.StartKURLMigrationResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return types.StartMigrationResponse{}, fmt.Errorf("decode response: %w", err) + return types.StartKURLMigrationResponse{}, fmt.Errorf("decode response: %w", err) } return result, nil } // GetKURLMigrationStatus returns the current status of the migration. -func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { +func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/kurl-migration/status", c.apiURL), nil) if err != nil { - return types.MigrationStatusResponse{}, fmt.Errorf("create request: %w", err) + return types.KURLMigrationStatusResponse{}, fmt.Errorf("create request: %w", err) } setAuthorizationHeader(req, c.token) resp, err := c.httpClient.Do(req) if err != nil { - return types.MigrationStatusResponse{}, fmt.Errorf("do request: %w", err) + return types.KURLMigrationStatusResponse{}, fmt.Errorf("do request: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return types.MigrationStatusResponse{}, errorFromResponse(resp) + return types.KURLMigrationStatusResponse{}, errorFromResponse(resp) } - var result types.MigrationStatusResponse + var result types.KURLMigrationStatusResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return types.MigrationStatusResponse{}, fmt.Errorf("decode response: %w", err) + return types.KURLMigrationStatusResponse{}, fmt.Errorf("decode response: %w", err) } return result, nil diff --git a/api/controllers.go b/api/controllers.go deleted file mode 100644 index 70bce21d86..0000000000 --- a/api/controllers.go +++ /dev/null @@ -1,35 +0,0 @@ -package api - -import ( - "fmt" - - "github.com/replicatedhq/embedded-cluster/api/controllers/migration" - linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" - migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" - "github.com/replicatedhq/embedded-cluster/api/types" -) - -// initControllers initializes controllers that weren't provided via options -func (a *API) initControllers() error { - // Initialize migration controller for Linux target if not already set - if a.cfg.InstallTarget == types.InstallTargetLinux && a.migrationController == nil { - installMgr := linuxinstallation.NewInstallationManager( - linuxinstallation.WithLogger(a.logger), - ) - mgr := migrationmanager.NewManager( - migrationmanager.WithLogger(a.logger), - migrationmanager.WithInstallationManager(installMgr), - ) - controller, err := migration.NewMigrationController( - migration.WithLogger(a.logger), - migration.WithManager(mgr), - migration.WithInstallationManager(installMgr), - ) - if err != nil { - return fmt.Errorf("create migration controller: %w", err) - } - a.migrationController = controller - } - - return nil -} diff --git a/api/controllers/migration/controller.go b/api/controllers/kurlmigration/controller.go similarity index 55% rename from api/controllers/migration/controller.go rename to api/controllers/kurlmigration/controller.go index 768c416e73..c9cb4e5777 100644 --- a/api/controllers/migration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -1,13 +1,13 @@ -package migration +package kurlmigration import ( "context" "fmt" "github.com/google/uuid" + kurlmigrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/kurlmigration" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" - migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" - migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" + kurlmigrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" @@ -18,61 +18,62 @@ type Controller interface { // GetInstallationConfig extracts kURL config, gets EC defaults, and returns merged config GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) - // StartMigration validates config, generates UUID, initializes state, launches background goroutine - StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) + // StartKURLMigration validates config, generates UUID, initializes state, launches background goroutine + StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) - // GetMigrationStatus returns current migration status - GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) + // GetKURLMigrationStatus returns current migration status + GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) Run(ctx context.Context) error } -var _ Controller = (*MigrationController)(nil) +var _ Controller = (*KURLMigrationController)(nil) -// MigrationController implements the Controller interface -type MigrationController struct { - manager migrationmanager.Manager - store migrationstore.Store +// KURLMigrationController implements the Controller interface +type KURLMigrationController struct { + manager kurlmigrationmanager.Manager + store kurlmigrationstore.Store installationManager linuxinstallation.InstallationManager logger logrus.FieldLogger } -// ControllerOption is a functional option for configuring the MigrationController -type ControllerOption func(*MigrationController) +// ControllerOption is a functional option for configuring the KURLMigrationController +type ControllerOption func(*KURLMigrationController) // WithManager sets the migration manager -func WithManager(manager migrationmanager.Manager) ControllerOption { - return func(c *MigrationController) { +func WithManager(manager kurlmigrationmanager.Manager) ControllerOption { + return func(c *KURLMigrationController) { c.manager = manager } } // WithStore sets the migration store -func WithStore(store migrationstore.Store) ControllerOption { - return func(c *MigrationController) { +func WithStore(store kurlmigrationstore.Store) ControllerOption { + return func(c *KURLMigrationController) { c.store = store } } // WithInstallationManager sets the installation manager func WithInstallationManager(manager linuxinstallation.InstallationManager) ControllerOption { - return func(c *MigrationController) { + return func(c *KURLMigrationController) { c.installationManager = manager } } // WithLogger sets the logger func WithLogger(log logrus.FieldLogger) ControllerOption { - return func(c *MigrationController) { + return func(c *KURLMigrationController) { c.logger = log } } -// NewMigrationController creates a new migration controller with the provided options -func NewMigrationController(opts ...ControllerOption) (*MigrationController, error) { - controller := &MigrationController{ - store: migrationstore.NewMemoryStore(), +// NewKURLMigrationController creates a new migration controller with the provided options. +// The controller creates its manager internally if not provided via WithManager option. +func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationController, error) { + controller := &KURLMigrationController{ + store: kurlmigrationstore.NewMemoryStore(), logger: logger.NewDiscardLogger(), } @@ -80,16 +81,23 @@ func NewMigrationController(opts ...ControllerOption) (*MigrationController, err opt(controller) } - // Validate required dependencies + // Create manager internally if not provided via option if controller.manager == nil { - return nil, fmt.Errorf("migration manager is required") + if controller.installationManager == nil { + return nil, fmt.Errorf("installation manager is required when manager is not provided") + } + controller.manager = kurlmigrationmanager.NewManager( + kurlmigrationmanager.WithStore(controller.store), + kurlmigrationmanager.WithLogger(controller.logger), + kurlmigrationmanager.WithInstallationManager(controller.installationManager), + ) } return controller, nil } // GetInstallationConfig extracts kURL config, gets EC defaults, and returns merged config -func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { +func (c *KURLMigrationController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { c.logger.Debug("fetching kurl config, ec defaults, and merging") // Get kURL config from the running cluster @@ -106,9 +114,15 @@ func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types. return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get ec defaults: %w", err) } - // Merge configs with empty user config (user hasn't submitted config yet) - emptyUserConfig := types.LinuxInstallationConfig{} - resolved := c.manager.MergeConfigs(emptyUserConfig, kurlConfig, defaults) + // Get user config from store (will be empty if user hasn't submitted config yet) + userConfig, err := c.store.GetUserConfig() + if err != nil { + c.logger.WithError(err).Error("get user config") + return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get user config: %w", err) + } + + // Merge configs: userConfig > kurlConfig > defaults + resolved := c.manager.MergeConfigs(userConfig, kurlConfig, defaults) c.logger.WithFields(logrus.Fields{ "kurlConfig": kurlConfig, @@ -123,8 +137,8 @@ func (c *MigrationController) GetInstallationConfig(ctx context.Context) (types. }, nil } -// StartMigration validates config, generates UUID, initializes state, launches background goroutine -func (c *MigrationController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { +// StartKURLMigration validates config, generates UUID, initializes state, launches background goroutine +func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { c.logger.WithFields(logrus.Fields{ "transferMode": transferMode, "config": config, @@ -139,7 +153,7 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t // Check if migration already exists if _, err := c.store.GetMigrationID(); err == nil { c.logger.Warn("migration already in progress") - return "", types.NewConflictError(types.ErrMigrationAlreadyStarted) + return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } // Generate UUID for migration @@ -162,14 +176,20 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t resolvedConfig := c.manager.MergeConfigs(config, kurlConfig, defaults) c.logger.WithField("resolvedConfig", resolvedConfig).Debug("config merged") - // Initialize migration in store + // Store user-provided config for future reference + if err := c.store.SetUserConfig(config); err != nil { + c.logger.WithError(err).Error("store user config") + return "", fmt.Errorf("store user config: %w", err) + } + + // Initialize migration in store with resolved config if err := c.store.InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { c.logger.WithError(err).Error("initialize migration") return "", fmt.Errorf("initialize migration: %w", err) } // Set initial state to NotStarted - if err := c.store.SetState(types.MigrationStateNotStarted); err != nil { + if err := c.store.SetState(types.KURLMigrationStateNotStarted); err != nil { c.logger.WithError(err).Error("set initial state") return "", fmt.Errorf("set initial state: %w", err) } @@ -189,18 +209,18 @@ func (c *MigrationController) StartMigration(ctx context.Context, transferMode t return migrationID, nil } -// GetMigrationStatus returns current migration status -func (c *MigrationController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { +// GetKURLMigrationStatus returns current migration status +func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { c.logger.Debug("fetching migration status") status, err := c.store.GetStatus() if err != nil { - if err == types.ErrNoActiveMigration { + if err == types.ErrNoActiveKURLMigration { c.logger.Warn("no active migration found") - return types.MigrationStatusResponse{}, types.NewNotFoundError(err) + return types.KURLMigrationStatusResponse{}, types.NewNotFoundError(err) } c.logger.WithError(err).Error("get status") - return types.MigrationStatusResponse{}, fmt.Errorf("get status: %w", err) + return types.KURLMigrationStatusResponse{}, fmt.Errorf("get status: %w", err) } c.logger.WithFields(logrus.Fields{ @@ -213,11 +233,30 @@ func (c *MigrationController) GetMigrationStatus(ctx context.Context) (types.Mig } // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) -func (c *MigrationController) Run(ctx context.Context) error { +func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.Info("starting migration orchestration") - // TODO: Phase implementations added in PR 8 - // This is a skeleton implementation that will be expanded in the next PR + // Defer handles all error cases by updating migration state + defer func() { + // Recover from panics + if r := recover(); r != nil { + finalErr = fmt.Errorf("panic in kurl migration orchestration: %v", r) + c.logger.WithField("panic", r).Error("migration panicked") + } + + // Handle any error by updating state to Failed + if finalErr != nil { + if err := c.store.SetState(types.KURLMigrationStateFailed); err != nil { + c.logger.WithError(err).Error("failed to set migration state to failed") + } + if err := c.store.SetError(finalErr.Error()); err != nil { + c.logger.WithError(err).Error("failed to set migration error message") + } + } + }() + + // TODO(sc-130983): Phase implementations will be added in the orchestration story + // This is a skeleton implementation that will be expanded in that PR // Get current state from store status, err := c.store.GetStatus() @@ -232,62 +271,44 @@ func (c *MigrationController) Run(ctx context.Context) error { }).Debug("current migration state") // If InProgress, resume from current phase - if status.State == types.MigrationStateInProgress { + if status.State == types.KURLMigrationStateInProgress { c.logger.WithField("phase", status.Phase).Info("resuming from current phase") - // TODO: Resume logic in PR 8 + // TODO(sc-130983): Resume logic will be implemented in the orchestration story } // Execute phases: Discovery → Preparation → ECInstall → DataTransfer → Completed - phases := []types.MigrationPhase{ - types.MigrationPhaseDiscovery, - types.MigrationPhasePreparation, - types.MigrationPhaseECInstall, - types.MigrationPhaseDataTransfer, - types.MigrationPhaseCompleted, + phases := []types.KURLMigrationPhase{ + types.KURLMigrationPhaseDiscovery, + types.KURLMigrationPhasePreparation, + types.KURLMigrationPhaseECInstall, + types.KURLMigrationPhaseDataTransfer, + types.KURLMigrationPhaseCompleted, } for _, phase := range phases { c.logger.WithField("phase", phase).Info("executing phase (skeleton)") // Set state to InProgress - if err := c.store.SetState(types.MigrationStateInProgress); err != nil { + if err := c.store.SetState(types.KURLMigrationStateInProgress); err != nil { c.logger.WithError(err).Error("set state to in progress") - if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("set state to failed") - } - if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("set error message") - } return fmt.Errorf("set state: %w", err) } // Set current phase if err := c.store.SetPhase(phase); err != nil { c.logger.WithError(err).Error("set phase") - if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("set state to failed") - } - if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("set error message") - } return fmt.Errorf("set phase: %w", err) } // Execute phase if err := c.manager.ExecutePhase(ctx, phase); err != nil { c.logger.WithError(err).WithField("phase", phase).Error("phase execution failed") - if setErr := c.store.SetState(types.MigrationStateFailed); setErr != nil { - c.logger.WithError(setErr).Error("set state to failed") - } - if setErr := c.store.SetError(err.Error()); setErr != nil { - c.logger.WithError(setErr).Error("set error message") - } return fmt.Errorf("execute phase %s: %w", phase, err) } } // Set state to Completed - if err := c.store.SetState(types.MigrationStateCompleted); err != nil { + if err := c.store.SetState(types.KURLMigrationStateCompleted); err != nil { c.logger.WithError(err).Error("set state to completed") return fmt.Errorf("set completed state: %w", err) } diff --git a/api/controllers/migration/controller_mock.go b/api/controllers/kurlmigration/controller_mock.go similarity index 62% rename from api/controllers/migration/controller_mock.go rename to api/controllers/kurlmigration/controller_mock.go index 5d50ba2082..dc24fb70d3 100644 --- a/api/controllers/migration/controller_mock.go +++ b/api/controllers/kurlmigration/controller_mock.go @@ -1,4 +1,4 @@ -package migration +package kurlmigration import ( "context" @@ -23,19 +23,19 @@ func (m *MockController) GetInstallationConfig(ctx context.Context) (types.Linux return args.Get(0).(types.LinuxInstallationConfigResponse), args.Error(1) } -// StartMigration mocks the StartMigration method -func (m *MockController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { +// StartKURLMigration mocks the StartKURLMigration method +func (m *MockController) StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { args := m.Called(ctx, transferMode, config) return args.String(0), args.Error(1) } -// GetMigrationStatus mocks the GetMigrationStatus method -func (m *MockController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { +// GetKURLMigrationStatus mocks the GetKURLMigrationStatus method +func (m *MockController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { args := m.Called(ctx) if args.Get(0) == nil { - return types.MigrationStatusResponse{}, args.Error(1) + return types.KURLMigrationStatusResponse{}, args.Error(1) } - return args.Get(0).(types.MigrationStatusResponse), args.Error(1) + return args.Get(0).(types.KURLMigrationStatusResponse), args.Error(1) } // Run mocks the Run method diff --git a/api/controllers/migration/controller_test.go b/api/controllers/kurlmigration/controller_test.go similarity index 73% rename from api/controllers/migration/controller_test.go rename to api/controllers/kurlmigration/controller_test.go index ba11eeba07..59ba56f8c2 100644 --- a/api/controllers/migration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -1,12 +1,12 @@ -package migration +package kurlmigration import ( "errors" "testing" "time" - migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/migration" - migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" + migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/kurlmigration" + migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -32,14 +32,12 @@ func TestGetInstallationConfig(t *testing.T) { defaults := types.LinuxInstallationConfig{ AdminConsolePort: 30000, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, GlobalCIDR: "10.244.0.0/16", } resolvedConfig := types.LinuxInstallationConfig{ AdminConsolePort: 8800, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, PodCIDR: "10.32.0.0/20", ServiceCIDR: "10.96.0.0/12", GlobalCIDR: "10.244.0.0/16", @@ -62,14 +60,12 @@ func TestGetInstallationConfig(t *testing.T) { Defaults: types.LinuxInstallationConfig{ AdminConsolePort: 30000, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, - GlobalCIDR: "10.244.0.0/16", + GlobalCIDR: "10.244.0.0/16", }, Resolved: types.LinuxInstallationConfig{ AdminConsolePort: 8800, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, - PodCIDR: "10.32.0.0/20", + PodCIDR: "10.32.0.0/20", ServiceCIDR: "10.96.0.0/12", GlobalCIDR: "10.244.0.0/16", }, @@ -111,14 +107,12 @@ func TestGetInstallationConfig(t *testing.T) { defaults := types.LinuxInstallationConfig{ AdminConsolePort: 30000, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, } // Resolved should have kURL values override defaults (since no user config yet) resolvedConfig := types.LinuxInstallationConfig{ AdminConsolePort: 8800, DataDirectory: "/opt/kurl", - LocalArtifactMirrorPort: 50000, } mock.InOrder( @@ -137,13 +131,11 @@ func TestGetInstallationConfig(t *testing.T) { Defaults: types.LinuxInstallationConfig{ AdminConsolePort: 30000, DataDirectory: "/var/lib/embedded-cluster", - LocalArtifactMirrorPort: 50000, - }, + }, Resolved: types.LinuxInstallationConfig{ AdminConsolePort: 8800, DataDirectory: "/opt/kurl", - LocalArtifactMirrorPort: 50000, - }, + }, } }, }, @@ -154,7 +146,7 @@ func TestGetInstallationConfig(t *testing.T) { mockManager := &migrationmanager.MockManager{} tt.setupMock(mockManager) - controller, err := NewMigrationController( + controller, err := NewKURLMigrationController( WithManager(mockManager), ) require.NoError(t, err) @@ -208,22 +200,23 @@ func TestStartMigration(t *testing.T) { mock.InOrder( m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), - s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + s.On("GetMigrationID").Return("", types.ErrNoActiveKURLMigration), m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), m.On("GetECDefaults", mock.Anything).Return(defaults, nil), m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("SetUserConfig", mock.Anything).Return(nil), s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(nil), - s.On("SetState", types.MigrationStateNotStarted).Return(nil), + s.On("SetState", types.KURLMigrationStateNotStarted).Return(nil), // For the background goroutine - skeleton implementation fails at first phase - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, }, nil), - s.On("SetState", types.MigrationStateInProgress).Return(nil), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), - m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented), - s.On("SetState", types.MigrationStateFailed).Return(nil), - s.On("SetError", "migration phase execution not yet implemented").Return(nil), + s.On("SetState", types.KURLMigrationStateInProgress).Return(nil), + s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), + m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil), + s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -249,22 +242,23 @@ func TestStartMigration(t *testing.T) { mock.InOrder( m.On("ValidateTransferMode", types.TransferModeMove).Return(nil), - s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + s.On("GetMigrationID").Return("", types.ErrNoActiveKURLMigration), m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), m.On("GetECDefaults", mock.Anything).Return(defaults, nil), m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("SetUserConfig", mock.Anything).Return(nil), s.On("InitializeMigration", mock.AnythingOfType("string"), "move", resolvedConfig).Return(nil), - s.On("SetState", types.MigrationStateNotStarted).Return(nil), + s.On("SetState", types.KURLMigrationStateNotStarted).Return(nil), // For the background goroutine - skeleton implementation fails at first phase - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, }, nil), - s.On("SetState", types.MigrationStateInProgress).Return(nil), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil), - m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented), - s.On("SetState", types.MigrationStateFailed).Return(nil), - s.On("SetError", "migration phase execution not yet implemented").Return(nil), + s.On("SetState", types.KURLMigrationStateInProgress).Return(nil), + s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), + m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil), + s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -283,7 +277,7 @@ func TestStartMigration(t *testing.T) { s.On("GetMigrationID").Return("existing-migration-id", nil), ) }, - expectedErr: types.ErrMigrationAlreadyStarted, + expectedErr: types.ErrKURLMigrationAlreadyStarted, validateResult: func(t *testing.T, migrationID string, err error) { assert.Error(t, err) assert.Empty(t, migrationID) @@ -320,10 +314,11 @@ func TestStartMigration(t *testing.T) { mock.InOrder( m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), - s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + s.On("GetMigrationID").Return("", types.ErrNoActiveKURLMigration), m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), m.On("GetECDefaults", mock.Anything).Return(defaults, nil), m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("SetUserConfig", mock.Anything).Return(nil), s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(errors.New("store error")), ) }, @@ -345,12 +340,13 @@ func TestStartMigration(t *testing.T) { mock.InOrder( m.On("ValidateTransferMode", types.TransferModeCopy).Return(nil), - s.On("GetMigrationID").Return("", types.ErrNoActiveMigration), + s.On("GetMigrationID").Return("", types.ErrNoActiveKURLMigration), m.On("GetKurlConfig", mock.Anything).Return(kurlConfig, nil), m.On("GetECDefaults", mock.Anything).Return(defaults, nil), m.On("MergeConfigs", mock.Anything, kurlConfig, defaults).Return(resolvedConfig), + s.On("SetUserConfig", mock.Anything).Return(nil), s.On("InitializeMigration", mock.AnythingOfType("string"), "copy", resolvedConfig).Return(nil), - s.On("SetState", types.MigrationStateNotStarted).Return(errors.New("set state error")), + s.On("SetState", types.KURLMigrationStateNotStarted).Return(errors.New("set state error")), ) }, expectedErr: errors.New("set state error"), @@ -368,13 +364,13 @@ func TestStartMigration(t *testing.T) { mockStore := &migrationstore.MockStore{} tt.setupMock(mockManager, mockStore) - controller, err := NewMigrationController( + controller, err := NewKURLMigrationController( WithManager(mockManager), WithStore(mockStore), ) require.NoError(t, err) - migrationID, err := controller.StartMigration(t.Context(), tt.transferMode, tt.config) + migrationID, err := controller.StartKURLMigration(t.Context(), tt.transferMode, tt.config) if tt.expectedErr != nil { require.Error(t, err) @@ -402,14 +398,14 @@ func TestGetMigrationStatus(t *testing.T) { name string setupMock func(*migrationstore.MockStore) expectedErr error - expectedValue types.MigrationStatusResponse + expectedValue types.KURLMigrationStatusResponse }{ { name: "successful response with active migration", setupMock: func(s *migrationstore.MockStore) { - status := types.MigrationStatusResponse{ - State: types.MigrationStateInProgress, - Phase: types.MigrationPhaseDataTransfer, + status := types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateInProgress, + Phase: types.KURLMigrationPhaseDataTransfer, Message: "Transferring data", Progress: 50, Error: "", @@ -417,9 +413,9 @@ func TestGetMigrationStatus(t *testing.T) { s.On("GetStatus").Return(status, nil) }, expectedErr: nil, - expectedValue: types.MigrationStatusResponse{ - State: types.MigrationStateInProgress, - Phase: types.MigrationPhaseDataTransfer, + expectedValue: types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateInProgress, + Phase: types.KURLMigrationPhaseDataTransfer, Message: "Transferring data", Progress: 50, Error: "", @@ -428,18 +424,18 @@ func TestGetMigrationStatus(t *testing.T) { { name: "no active migration (404 error)", setupMock: func(s *migrationstore.MockStore) { - s.On("GetStatus").Return(types.MigrationStatusResponse{}, types.ErrNoActiveMigration) + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{}, types.ErrNoActiveKURLMigration) }, - expectedErr: types.ErrNoActiveMigration, - expectedValue: types.MigrationStatusResponse{}, + expectedErr: types.ErrNoActiveKURLMigration, + expectedValue: types.KURLMigrationStatusResponse{}, }, { name: "store error", setupMock: func(s *migrationstore.MockStore) { - s.On("GetStatus").Return(types.MigrationStatusResponse{}, errors.New("store error")) + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{}, errors.New("store error")) }, expectedErr: errors.New("store error"), - expectedValue: types.MigrationStatusResponse{}, + expectedValue: types.KURLMigrationStatusResponse{}, }, } @@ -449,20 +445,20 @@ func TestGetMigrationStatus(t *testing.T) { tt.setupMock(mockStore) mockManager := &migrationmanager.MockManager{} - controller, err := NewMigrationController( + controller, err := NewKURLMigrationController( WithManager(mockManager), WithStore(mockStore), ) require.NoError(t, err) - result, err := controller.GetMigrationStatus(t.Context()) + result, err := controller.GetKURLMigrationStatus(t.Context()) if tt.expectedErr != nil { assert.Error(t, err) - assert.Equal(t, types.MigrationStatusResponse{}, result) + assert.Equal(t, types.KURLMigrationStatusResponse{}, result) // Verify it's a 404 error when appropriate - if tt.expectedErr == types.ErrNoActiveMigration { + if tt.expectedErr == types.ErrNoActiveKURLMigration { var apiErr *types.APIError require.True(t, errors.As(err, &apiErr)) assert.Equal(t, 404, apiErr.StatusCode) @@ -490,18 +486,18 @@ func TestRun(t *testing.T) { setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( // Initial status check - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, }, nil).Once(), // Discovery phase - skeleton implementation fails here - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), + s.On("SetState", types.KURLMigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil).Once(), // ExecutePhase is called and returns skeleton error - m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented).Once(), + m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented).Once(), // Error handling - s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), - s.On("SetError", "migration phase execution not yet implemented").Return(nil).Once(), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), + s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil).Once(), ) }, expectedErr: true, @@ -509,7 +505,10 @@ func TestRun(t *testing.T) { { name: "skeleton test - error on GetStatus", setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { - s.On("GetStatus").Return(types.MigrationStatusResponse{}, errors.New("get status error")).Once() + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{}, errors.New("get status error")).Once() + // Defer will try to set state to Failed and set error message + s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once() + s.On("SetError", "get status: get status error").Return(nil).Once() }, expectedErr: true, }, @@ -517,13 +516,13 @@ func TestRun(t *testing.T) { name: "skeleton test - error on SetState", setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, }, nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(errors.New("set state error")).Once(), - s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), - s.On("SetError", "set state error").Return(nil).Once(), + s.On("SetState", types.KURLMigrationStateInProgress).Return(errors.New("set state error")).Once(), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), + s.On("SetError", "set state: set state error").Return(nil).Once(), ) }, expectedErr: true, @@ -532,14 +531,14 @@ func TestRun(t *testing.T) { name: "skeleton test - error on SetPhase", setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, }, nil).Once(), - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(errors.New("set phase error")).Once(), - s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), - s.On("SetError", "set phase error").Return(nil).Once(), + s.On("SetState", types.KURLMigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(errors.New("set phase error")).Once(), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), + s.On("SetError", "set phase: set phase error").Return(nil).Once(), ) }, expectedErr: true, @@ -548,17 +547,17 @@ func TestRun(t *testing.T) { name: "skeleton test - resume from InProgress state", setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { mock.InOrder( - s.On("GetStatus").Return(types.MigrationStatusResponse{ - State: types.MigrationStateInProgress, - Phase: types.MigrationPhasePreparation, + s.On("GetStatus").Return(types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateInProgress, + Phase: types.KURLMigrationPhasePreparation, }, nil).Once(), // Should still go through all phases (skeleton doesn't implement resume logic yet) - s.On("SetState", types.MigrationStateInProgress).Return(nil).Once(), - s.On("SetPhase", types.MigrationPhaseDiscovery).Return(nil).Once(), + s.On("SetState", types.KURLMigrationStateInProgress).Return(nil).Once(), + s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil).Once(), // ExecutePhase fails in skeleton - m.On("ExecutePhase", mock.Anything, types.MigrationPhaseDiscovery).Return(types.ErrMigrationPhaseNotImplemented).Once(), - s.On("SetState", types.MigrationStateFailed).Return(nil).Once(), - s.On("SetError", "migration phase execution not yet implemented").Return(nil).Once(), + m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented).Once(), + s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), + s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil).Once(), ) }, expectedErr: true, @@ -571,7 +570,7 @@ func TestRun(t *testing.T) { mockStore := &migrationstore.MockStore{} tt.setupMock(mockManager, mockStore) - controller, err := NewMigrationController( + controller, err := NewKURLMigrationController( WithManager(mockManager), WithStore(mockStore), ) diff --git a/api/handlers.go b/api/handlers.go index 61dfdbee7e..c4951c4c7e 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -3,22 +3,24 @@ package api import ( "fmt" + kurlmigration "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" authhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/auth" consolehandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/console" healthhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/health" kuberneteshandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/kubernetes" + kurlmigrationhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/kurlmigration" linuxhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/linux" - migrationhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/migration" + linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" "github.com/replicatedhq/embedded-cluster/api/types" ) type handlers struct { - auth *authhandler.Handler - console *consolehandler.Handler - health *healthhandler.Handler - linux *linuxhandler.Handler - kubernetes *kuberneteshandler.Handler - migration *migrationhandler.Handler + auth *authhandler.Handler + console *consolehandler.Handler + health *healthhandler.Handler + linux *linuxhandler.Handler + kubernetes *kuberneteshandler.Handler + kurlmigration *kurlmigrationhandler.Handler } func (a *API) initHandlers() error { @@ -70,12 +72,30 @@ func (a *API) initHandlers() error { } a.handlers.linux = linuxHandler - // Migration handler (Linux only) - migrationHandler := migrationhandler.New( - migrationhandler.WithLogger(a.logger), - migrationhandler.WithController(a.migrationController), + // Initialize kURL migration controller if not already set + if a.kurlMigrationController == nil { + // Create installation manager for kURL migration + installMgr := linuxinstallation.NewInstallationManager( + linuxinstallation.WithLogger(a.logger), + ) + + // Controller creates manager internally with store passed as dependency + kurlMigrationController, err := kurlmigration.NewKURLMigrationController( + kurlmigration.WithLogger(a.logger), + kurlmigration.WithInstallationManager(installMgr), + ) + if err != nil { + return fmt.Errorf("create kurl migration controller: %w", err) + } + a.kurlMigrationController = kurlMigrationController + } + + // kURL Migration handler (Linux only) + kurlMigrationHandler := kurlmigrationhandler.New( + kurlmigrationhandler.WithLogger(a.logger), + kurlmigrationhandler.WithController(a.kurlMigrationController), ) - a.handlers.migration = migrationHandler + a.handlers.kurlmigration = kurlMigrationHandler } else { // Kubernetes handler kubernetesHandler, err := kuberneteshandler.New( diff --git a/api/internal/handlers/migration/handler.go b/api/internal/handlers/kurlmigration/handler.go similarity index 76% rename from api/internal/handlers/migration/handler.go rename to api/internal/handlers/kurlmigration/handler.go index 0a4e77dcbc..a96c106b9b 100644 --- a/api/internal/handlers/migration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -1,9 +1,9 @@ -package migration +package kurlmigration import ( "net/http" - "github.com/replicatedhq/embedded-cluster/api/controllers/migration" + "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/internal/handlers/utils" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" @@ -11,7 +11,7 @@ import ( type Handler struct { logger logrus.FieldLogger - controller migration.Controller + controller kurlmigration.Controller } type Option func(*Handler) @@ -22,7 +22,7 @@ func WithLogger(logger logrus.FieldLogger) Option { } } -func WithController(controller migration.Controller) Option { +func WithController(controller kurlmigration.Controller) Option { return func(h *Handler) { h.controller = controller } @@ -66,13 +66,13 @@ func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) // @Security bearerauth // @Accept json // @Produce json -// @Param request body types.StartMigrationRequest true "Start Migration Request" -// @Success 200 {object} types.StartMigrationResponse +// @Param request body types.StartKURLMigrationRequest true "Start Migration Request" +// @Success 200 {object} types.StartKURLMigrationResponse // @Failure 400 {object} types.APIError // @Failure 409 {object} types.APIError // @Router /kurl-migration/start [post] func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { - var request types.StartMigrationRequest + var request types.StartKURLMigrationRequest if err := utils.BindJSON(w, r, &request, h.logger); err != nil { return } @@ -82,27 +82,20 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { request.TransferMode = types.TransferModeCopy } - // Validate transfer mode - if request.TransferMode != types.TransferModeCopy && request.TransferMode != types.TransferModeMove { - utils.LogError(r, types.ErrInvalidTransferMode, h.logger, "invalid transfer mode") - utils.JSONError(w, r, types.NewBadRequestError(types.ErrInvalidTransferMode), h.logger) - return - } - // Use empty config if not provided config := types.LinuxInstallationConfig{} if request.Config != nil { config = *request.Config } - migrationID, err := h.controller.StartMigration(r.Context(), request.TransferMode, config) + migrationID, err := h.controller.StartKURLMigration(r.Context(), request.TransferMode, config) if err != nil { utils.LogError(r, err, h.logger, "failed to start migration") utils.JSONError(w, r, err, h.logger) return } - response := types.StartMigrationResponse{ + response := types.StartKURLMigrationResponse{ MigrationID: migrationID, Message: "migration started successfully", } @@ -118,11 +111,11 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { // @Tags migration // @Security bearerauth // @Produce json -// @Success 200 {object} types.MigrationStatusResponse +// @Success 200 {object} types.KURLMigrationStatusResponse // @Failure 404 {object} types.APIError // @Router /kurl-migration/status [get] func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { - status, err := h.controller.GetMigrationStatus(r.Context()) + status, err := h.controller.GetKURLMigrationStatus(r.Context()) if err != nil { utils.LogError(r, err, h.logger, "failed to get migration status") utils.JSONError(w, r, err, h.logger) diff --git a/api/internal/handlers/migration/handler_test.go b/api/internal/handlers/migration/handler_test.go deleted file mode 100644 index 119ebb76f8..0000000000 --- a/api/internal/handlers/migration/handler_test.go +++ /dev/null @@ -1,336 +0,0 @@ -package migration - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "testing" - - "github.com/replicatedhq/embedded-cluster/api/pkg/logger" - "github.com/replicatedhq/embedded-cluster/api/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" -) - -// MockController is a mock implementation of migration.Controller -type MockController struct { - mock.Mock -} - -func (m *MockController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { - args := m.Called(ctx) - return args.Get(0).(types.LinuxInstallationConfigResponse), args.Error(1) -} - -func (m *MockController) StartMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { - args := m.Called(ctx, transferMode, config) - return args.String(0), args.Error(1) -} - -func (m *MockController) GetMigrationStatus(ctx context.Context) (types.MigrationStatusResponse, error) { - args := m.Called(ctx) - return args.Get(0).(types.MigrationStatusResponse), args.Error(1) -} - -func (m *MockController) Run(ctx context.Context) error { - args := m.Called(ctx) - return args.Error(0) -} - -func TestGetInstallationConfig(t *testing.T) { - tests := []struct { - name string - setupMock func(*MockController) - expectedStatus int - checkResponse func(*testing.T, *httptest.ResponseRecorder) - }{ - { - name: "successful response", - setupMock: func(mc *MockController) { - mc.On("GetInstallationConfig", mock.Anything).Return( - types.LinuxInstallationConfigResponse{ - Values: types.LinuxInstallationConfig{ - PodCIDR: "10.244.0.0/16", - ServiceCIDR: "10.96.0.0/12", - }, - Defaults: types.LinuxInstallationConfig{ - PodCIDR: "10.244.0.0/16", - ServiceCIDR: "10.96.0.0/12", - }, - Resolved: types.LinuxInstallationConfig{ - PodCIDR: "10.244.0.0/16", - ServiceCIDR: "10.96.0.0/12", - }, - }, - nil, - ) - }, - expectedStatus: http.StatusOK, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var response types.LinuxInstallationConfigResponse - err := json.Unmarshal(rec.Body.Bytes(), &response) - require.NoError(t, err) - assert.Equal(t, "10.244.0.0/16", response.Values.PodCIDR) - assert.Equal(t, "10.96.0.0/12", response.Values.ServiceCIDR) - }, - }, - { - name: "controller error", - setupMock: func(mc *MockController) { - mc.On("GetInstallationConfig", mock.Anything).Return( - types.LinuxInstallationConfigResponse{}, - fmt.Errorf("controller error"), - ) - }, - expectedStatus: http.StatusInternalServerError, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var apiErr types.APIError - err := json.Unmarshal(rec.Body.Bytes(), &apiErr) - require.NoError(t, err) - assert.Contains(t, apiErr.Message, "controller error") - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockController := &MockController{} - tt.setupMock(mockController) - - handler := New( - WithController(mockController), - WithLogger(logger.NewDiscardLogger()), - ) - - req := httptest.NewRequest(http.MethodGet, "/migration/config", nil) - rec := httptest.NewRecorder() - - handler.GetInstallationConfig(rec, req) - - assert.Equal(t, tt.expectedStatus, rec.Code) - tt.checkResponse(t, rec) - mockController.AssertExpectations(t) - }) - } -} - -func TestPostStartMigration(t *testing.T) { - tests := []struct { - name string - requestBody interface{} - setupMock func(*MockController) - expectedStatus int - checkResponse func(*testing.T, *httptest.ResponseRecorder) - }{ - { - name: "successful start with copy mode", - requestBody: types.StartMigrationRequest{ - TransferMode: types.TransferModeCopy, - Config: &types.LinuxInstallationConfig{ - PodCIDR: "10.244.0.0/16", - ServiceCIDR: "10.96.0.0/12", - }, - }, - setupMock: func(mc *MockController) { - mc.On("StartMigration", mock.Anything, types.TransferModeCopy, mock.MatchedBy(func(cfg types.LinuxInstallationConfig) bool { - return cfg.PodCIDR == "10.244.0.0/16" && cfg.ServiceCIDR == "10.96.0.0/12" - })).Return("550e8400-e29b-41d4-a716-446655440000", nil) - }, - expectedStatus: http.StatusOK, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var response types.StartMigrationResponse - err := json.Unmarshal(rec.Body.Bytes(), &response) - require.NoError(t, err) - assert.Equal(t, "550e8400-e29b-41d4-a716-446655440000", response.MigrationID) - assert.Equal(t, "migration started successfully", response.Message) - }, - }, - { - name: "successful start with move mode", - requestBody: types.StartMigrationRequest{ - TransferMode: types.TransferModeMove, - Config: nil, - }, - setupMock: func(mc *MockController) { - mc.On("StartMigration", mock.Anything, types.TransferModeMove, types.LinuxInstallationConfig{}).Return("test-uuid", nil) - }, - expectedStatus: http.StatusOK, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var response types.StartMigrationResponse - err := json.Unmarshal(rec.Body.Bytes(), &response) - require.NoError(t, err) - assert.Equal(t, "test-uuid", response.MigrationID) - }, - }, - { - name: "default to copy when mode is empty", - requestBody: types.StartMigrationRequest{ - TransferMode: "", - Config: nil, - }, - setupMock: func(mc *MockController) { - mc.On("StartMigration", mock.Anything, types.TransferModeCopy, types.LinuxInstallationConfig{}).Return("test-uuid", nil) - }, - expectedStatus: http.StatusOK, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var response types.StartMigrationResponse - err := json.Unmarshal(rec.Body.Bytes(), &response) - require.NoError(t, err) - assert.Equal(t, "test-uuid", response.MigrationID) - }, - }, - { - name: "invalid request body", - requestBody: "invalid json", - setupMock: func(mc *MockController) {}, - expectedStatus: http.StatusBadRequest, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var apiErr types.APIError - err := json.Unmarshal(rec.Body.Bytes(), &apiErr) - require.NoError(t, err) - assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode) - }, - }, - { - name: "migration already started", - requestBody: types.StartMigrationRequest{ - TransferMode: types.TransferModeCopy, - Config: nil, - }, - setupMock: func(mc *MockController) { - mc.On("StartMigration", mock.Anything, types.TransferModeCopy, types.LinuxInstallationConfig{}).Return("", types.NewConflictError(types.ErrMigrationAlreadyStarted)) - }, - expectedStatus: http.StatusConflict, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var apiErr types.APIError - err := json.Unmarshal(rec.Body.Bytes(), &apiErr) - require.NoError(t, err) - assert.Equal(t, http.StatusConflict, apiErr.StatusCode) - assert.Contains(t, apiErr.Message, "migration already started") - }, - }, - { - name: "invalid transfer mode", - requestBody: types.StartMigrationRequest{ - TransferMode: "invalid", - Config: nil, - }, - setupMock: func(mc *MockController) {}, - expectedStatus: http.StatusBadRequest, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var apiErr types.APIError - err := json.Unmarshal(rec.Body.Bytes(), &apiErr) - require.NoError(t, err) - assert.Equal(t, http.StatusBadRequest, apiErr.StatusCode) - assert.Contains(t, apiErr.Message, "invalid transfer mode") - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockController := &MockController{} - tt.setupMock(mockController) - - handler := New( - WithController(mockController), - WithLogger(logger.NewDiscardLogger()), - ) - - var body []byte - var err error - if str, ok := tt.requestBody.(string); ok { - body = []byte(str) - } else { - body, err = json.Marshal(tt.requestBody) - require.NoError(t, err) - } - - req := httptest.NewRequest(http.MethodPost, "/migration/start", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - rec := httptest.NewRecorder() - - handler.PostStartMigration(rec, req) - - assert.Equal(t, tt.expectedStatus, rec.Code) - tt.checkResponse(t, rec) - mockController.AssertExpectations(t) - }) - } -} - -func TestGetMigrationStatus(t *testing.T) { - tests := []struct { - name string - setupMock func(*MockController) - expectedStatus int - checkResponse func(*testing.T, *httptest.ResponseRecorder) - }{ - { - name: "successful response with active migration", - setupMock: func(mc *MockController) { - mc.On("GetMigrationStatus", mock.Anything).Return( - types.MigrationStatusResponse{ - State: types.MigrationStateInProgress, - Phase: types.MigrationPhaseDiscovery, - Message: "Discovering kURL cluster configuration", - Progress: 25, - Error: "", - }, - nil, - ) - }, - expectedStatus: http.StatusOK, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var response types.MigrationStatusResponse - err := json.Unmarshal(rec.Body.Bytes(), &response) - require.NoError(t, err) - assert.Equal(t, types.MigrationStateInProgress, response.State) - assert.Equal(t, types.MigrationPhaseDiscovery, response.Phase) - assert.Equal(t, 25, response.Progress) - }, - }, - { - name: "no active migration", - setupMock: func(mc *MockController) { - mc.On("GetMigrationStatus", mock.Anything).Return( - types.MigrationStatusResponse{}, - types.NewNotFoundError(types.ErrNoActiveMigration), - ) - }, - expectedStatus: http.StatusNotFound, - checkResponse: func(t *testing.T, rec *httptest.ResponseRecorder) { - var apiErr types.APIError - err := json.Unmarshal(rec.Body.Bytes(), &apiErr) - require.NoError(t, err) - assert.Equal(t, http.StatusNotFound, apiErr.StatusCode) - assert.Contains(t, apiErr.Message, "no active migration") - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mockController := &MockController{} - tt.setupMock(mockController) - - handler := New( - WithController(mockController), - WithLogger(logger.NewDiscardLogger()), - ) - - req := httptest.NewRequest(http.MethodGet, "/migration/status", nil) - rec := httptest.NewRecorder() - - handler.GetMigrationStatus(rec, req) - - assert.Equal(t, tt.expectedStatus, rec.Code) - tt.checkResponse(t, rec) - mockController.AssertExpectations(t) - }) - } -} diff --git a/api/internal/managers/migration/manager.go b/api/internal/managers/kurlmigration/manager.go similarity index 74% rename from api/internal/managers/migration/manager.go rename to api/internal/managers/kurlmigration/manager.go index cabff77939..34590b0e48 100644 --- a/api/internal/managers/migration/manager.go +++ b/api/internal/managers/kurlmigration/manager.go @@ -1,16 +1,17 @@ -package migration +package kurlmigration import ( "context" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" + kurlmigrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" "sigs.k8s.io/controller-runtime/pkg/client" ) -var _ Manager = &migrationManager{} +var _ Manager = &kurlMigrationManager{} // Manager provides methods for managing kURL to EC migrations type Manager interface { @@ -28,46 +29,53 @@ type Manager interface { ValidateTransferMode(mode types.TransferMode) error // ExecutePhase executes a migration phase - ExecutePhase(ctx context.Context, phase types.MigrationPhase) error + ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error } -// migrationManager is an implementation of the Manager interface -type migrationManager struct { +// kurlMigrationManager is an implementation of the Manager interface +type kurlMigrationManager struct { + store kurlmigrationstore.Store kubeClient client.Client kurlPasswordHash string installationManager linuxinstallation.InstallationManager logger logrus.FieldLogger } -type ManagerOption func(*migrationManager) +type ManagerOption func(*kurlMigrationManager) + +func WithStore(store kurlmigrationstore.Store) ManagerOption { + return func(m *kurlMigrationManager) { + m.store = store + } +} func WithLogger(logger logrus.FieldLogger) ManagerOption { - return func(m *migrationManager) { + return func(m *kurlMigrationManager) { m.logger = logger } } func WithKubeClient(kcli client.Client) ManagerOption { - return func(m *migrationManager) { + return func(m *kurlMigrationManager) { m.kubeClient = kcli } } func WithKurlPasswordHash(hash string) ManagerOption { - return func(m *migrationManager) { + return func(m *kurlMigrationManager) { m.kurlPasswordHash = hash } } func WithInstallationManager(im linuxinstallation.InstallationManager) ManagerOption { - return func(m *migrationManager) { + return func(m *kurlMigrationManager) { m.installationManager = im } } // NewManager creates a new migration Manager with the provided options -func NewManager(opts ...ManagerOption) *migrationManager { - manager := &migrationManager{} +func NewManager(opts ...ManagerOption) *kurlMigrationManager { + manager := &kurlMigrationManager{} for _, opt := range opts { opt(manager) @@ -81,22 +89,24 @@ func NewManager(opts ...ManagerOption) *migrationManager { } // GetKurlConfig extracts configuration from the running kURL cluster -func (m *migrationManager) GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) { - // TODO: Implement kURL cluster configuration extraction in future PR +func (m *kurlMigrationManager) GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) { + // TODO(sc-130962): Implement kURL cluster configuration extraction // This will query the kURL cluster for: // - Pod and Service CIDRs from kube-controller-manager // - Network configuration // - Admin console port // - Data directory - // - Local artifact mirror port // - Proxy settings + // - Namespace discovery: Query cluster to find kotsadm namespace by looking for + // pods/services with app.kubernetes.io/name=kotsadm label. This is necessary + // because kURL can install KOTS in any namespace, not just "default". m.logger.Debug("GetKurlConfig: Skeleton implementation, returning empty config") return types.LinuxInstallationConfig{}, nil } // GetECDefaults returns EC default configuration -func (m *migrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { - // TODO: Implement EC defaults extraction in future PR +func (m *kurlMigrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { + // TODO(sc-130962): Implement EC defaults extraction // This will use the installation manager to get EC defaults // For now, return empty config as skeleton implementation m.logger.Debug("GetECDefaults: Skeleton implementation, returning empty config") @@ -105,7 +115,7 @@ func (m *migrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstal // MergeConfigs merges user, kURL, and default configs with proper precedence // Precedence order: userConfig > kurlConfig > defaults -func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { +func (m *kurlMigrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { // Start with defaults as the base merged := defaults @@ -116,9 +126,6 @@ func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.L if kurlConfig.DataDirectory != "" { merged.DataDirectory = kurlConfig.DataDirectory } - if kurlConfig.LocalArtifactMirrorPort != 0 { - merged.LocalArtifactMirrorPort = kurlConfig.LocalArtifactMirrorPort - } if kurlConfig.HTTPProxy != "" { merged.HTTPProxy = kurlConfig.HTTPProxy } @@ -149,9 +156,6 @@ func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.L if userConfig.DataDirectory != "" { merged.DataDirectory = userConfig.DataDirectory } - if userConfig.LocalArtifactMirrorPort != 0 { - merged.LocalArtifactMirrorPort = userConfig.LocalArtifactMirrorPort - } if userConfig.HTTPProxy != "" { merged.HTTPProxy = userConfig.HTTPProxy } @@ -185,7 +189,7 @@ func (m *migrationManager) MergeConfigs(userConfig, kurlConfig, defaults types.L } // ValidateTransferMode validates the transfer mode is "copy" or "move" -func (m *migrationManager) ValidateTransferMode(mode types.TransferMode) error { +func (m *kurlMigrationManager) ValidateTransferMode(mode types.TransferMode) error { switch mode { case types.TransferModeCopy, types.TransferModeMove: return nil @@ -195,8 +199,8 @@ func (m *migrationManager) ValidateTransferMode(mode types.TransferMode) error { } // ExecutePhase executes a migration phase -func (m *migrationManager) ExecutePhase(ctx context.Context, phase types.MigrationPhase) error { - // TODO: Implement phase execution in PR 8 +func (m *kurlMigrationManager) ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error { + // TODO(sc-130983): Implement phase execution // This will handle: // - Discovery phase: GetKurlConfig, validate cluster // - Preparation phase: Backup, pre-migration checks @@ -204,5 +208,5 @@ func (m *migrationManager) ExecutePhase(ctx context.Context, phase types.Migrati // - DataTransfer phase: Copy/move data from kURL to EC // - Completed phase: Final validation, cleanup m.logger.WithField("phase", phase).Debug("ExecutePhase: Skeleton implementation") - return types.ErrMigrationPhaseNotImplemented + return types.ErrKURLMigrationPhaseNotImplemented } diff --git a/api/internal/managers/migration/manager_mock.go b/api/internal/managers/kurlmigration/manager_mock.go similarity index 96% rename from api/internal/managers/migration/manager_mock.go rename to api/internal/managers/kurlmigration/manager_mock.go index e8a4b04bad..ee7e692749 100644 --- a/api/internal/managers/migration/manager_mock.go +++ b/api/internal/managers/kurlmigration/manager_mock.go @@ -1,4 +1,4 @@ -package migration +package kurlmigration import ( "context" @@ -45,7 +45,7 @@ func (m *MockManager) ValidateTransferMode(mode types.TransferMode) error { } // ExecutePhase mocks the ExecutePhase method -func (m *MockManager) ExecutePhase(ctx context.Context, phase types.MigrationPhase) error { +func (m *MockManager) ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error { args := m.Called(ctx, phase) return args.Error(0) } diff --git a/api/internal/managers/migration/manager_test.go b/api/internal/managers/kurlmigration/manager_test.go similarity index 77% rename from api/internal/managers/migration/manager_test.go rename to api/internal/managers/kurlmigration/manager_test.go index 6d92a7b586..b8a21544cf 100644 --- a/api/internal/managers/migration/manager_test.go +++ b/api/internal/managers/kurlmigration/manager_test.go @@ -1,4 +1,4 @@ -package migration +package kurlmigration import ( "testing" @@ -130,33 +130,30 @@ func TestMergeConfigs(t *testing.T) { AdminConsolePort: 8080, }, kurlConfig: types.LinuxInstallationConfig{ - DataDirectory: "/kurl/data", - LocalArtifactMirrorPort: 50000, - NetworkInterface: "eth0", + DataDirectory: "/kurl/data", + NetworkInterface: "eth0", }, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", - LocalArtifactMirrorPort: 50001, - HTTPProxy: "http://proxy.example.com", - HTTPSProxy: "https://proxy.example.com", - NoProxy: "localhost", - NetworkInterface: "eth1", - PodCIDR: "10.0.0.0/16", - ServiceCIDR: "10.1.0.0/16", - GlobalCIDR: "10.2.0.0/16", + AdminConsolePort: 30000, + DataDirectory: "/default/data", + HTTPProxy: "http://proxy.example.com", + HTTPSProxy: "https://proxy.example.com", + NoProxy: "localhost", + NetworkInterface: "eth1", + PodCIDR: "10.0.0.0/16", + ServiceCIDR: "10.1.0.0/16", + GlobalCIDR: "10.2.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, - DataDirectory: "/kurl/data", - LocalArtifactMirrorPort: 50000, - HTTPProxy: "http://proxy.example.com", - HTTPSProxy: "https://proxy.example.com", - NoProxy: "localhost", - NetworkInterface: "eth0", - PodCIDR: "10.0.0.0/16", - ServiceCIDR: "10.1.0.0/16", - GlobalCIDR: "10.2.0.0/16", + AdminConsolePort: 8080, + DataDirectory: "/kurl/data", + HTTPProxy: "http://proxy.example.com", + HTTPSProxy: "https://proxy.example.com", + NoProxy: "localhost", + NetworkInterface: "eth0", + PodCIDR: "10.0.0.0/16", + ServiceCIDR: "10.1.0.0/16", + GlobalCIDR: "10.2.0.0/16", }, }, } diff --git a/api/internal/store/migration/store.go b/api/internal/store/kurlmigration/store.go similarity index 59% rename from api/internal/store/migration/store.go rename to api/internal/store/kurlmigration/store.go index aee6034183..2a11c4f51a 100644 --- a/api/internal/store/migration/store.go +++ b/api/internal/store/kurlmigration/store.go @@ -1,5 +1,5 @@ -// Package migration provides a store implementation for managing kURL to Embedded Cluster migration state. -package migration +// Package kurlmigration provides a store implementation for managing kURL to Embedded Cluster migration state. +package kurlmigration import ( "sync" @@ -19,13 +19,13 @@ type Store interface { GetMigrationID() (string, error) // GetStatus returns the current migration status - GetStatus() (types.MigrationStatusResponse, error) + GetStatus() (types.KURLMigrationStatusResponse, error) // SetState updates the migration state - SetState(state types.MigrationState) error + SetState(state types.KURLMigrationState) error // SetPhase updates the migration phase - SetPhase(phase types.MigrationPhase) error + SetPhase(phase types.KURLMigrationPhase) error // SetMessage updates the status message SetMessage(message string) error @@ -39,16 +39,23 @@ type Store interface { // GetTransferMode returns the transfer mode GetTransferMode() (string, error) - // GetConfig returns the installation config + // GetConfig returns the resolved installation config GetConfig() (types.LinuxInstallationConfig, error) + + // GetUserConfig returns the user-provided config (may be empty if not yet submitted) + GetUserConfig() (types.LinuxInstallationConfig, error) + + // SetUserConfig sets the user-provided config + SetUserConfig(config types.LinuxInstallationConfig) error } // memoryStore is an in-memory implementation of Store type memoryStore struct { migrationID string transferMode string - config types.LinuxInstallationConfig - status types.MigrationStatusResponse + config types.LinuxInstallationConfig // resolved/merged config + userConfig types.LinuxInstallationConfig // user-provided config + status types.KURLMigrationStatusResponse initialized bool mu sync.RWMutex } @@ -78,7 +85,7 @@ func WithConfig(config types.LinuxInstallationConfig) StoreOption { } // WithStatus sets the migration status -func WithStatus(status types.MigrationStatusResponse) StoreOption { +func WithStatus(status types.KURLMigrationStatusResponse) StoreOption { return func(s *memoryStore) { s.status = status } @@ -87,9 +94,9 @@ func WithStatus(status types.MigrationStatusResponse) StoreOption { // NewMemoryStore creates a new memory store func NewMemoryStore(opts ...StoreOption) Store { s := &memoryStore{ - status: types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + status: types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, Message: "", Progress: 0, Error: "", @@ -108,7 +115,7 @@ func (s *memoryStore) InitializeMigration(migrationID string, transferMode strin defer s.mu.Unlock() if s.initialized { - return types.ErrMigrationAlreadyStarted + return types.ErrKURLMigrationAlreadyStarted } s.migrationID = migrationID @@ -116,9 +123,9 @@ func (s *memoryStore) InitializeMigration(migrationID string, transferMode strin s.config = config s.initialized = true - s.status = types.MigrationStatusResponse{ - State: types.MigrationStateNotStarted, - Phase: types.MigrationPhaseDiscovery, + s.status = types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, Message: "", Progress: 0, Error: "", @@ -132,46 +139,46 @@ func (s *memoryStore) GetMigrationID() (string, error) { defer s.mu.RUnlock() if !s.initialized { - return "", types.ErrNoActiveMigration + return "", types.ErrNoActiveKURLMigration } return s.migrationID, nil } -func (s *memoryStore) GetStatus() (types.MigrationStatusResponse, error) { +func (s *memoryStore) GetStatus() (types.KURLMigrationStatusResponse, error) { s.mu.RLock() defer s.mu.RUnlock() if !s.initialized { - return types.MigrationStatusResponse{}, types.ErrNoActiveMigration + return types.KURLMigrationStatusResponse{}, types.ErrNoActiveKURLMigration } - var status types.MigrationStatusResponse + var status types.KURLMigrationStatusResponse if err := deepcopy.Copy(&status, &s.status); err != nil { - return types.MigrationStatusResponse{}, err + return types.KURLMigrationStatusResponse{}, err } return status, nil } -func (s *memoryStore) SetState(state types.MigrationState) error { +func (s *memoryStore) SetState(state types.KURLMigrationState) error { s.mu.Lock() defer s.mu.Unlock() if !s.initialized { - return types.ErrNoActiveMigration + return types.ErrNoActiveKURLMigration } s.status.State = state return nil } -func (s *memoryStore) SetPhase(phase types.MigrationPhase) error { +func (s *memoryStore) SetPhase(phase types.KURLMigrationPhase) error { s.mu.Lock() defer s.mu.Unlock() if !s.initialized { - return types.ErrNoActiveMigration + return types.ErrNoActiveKURLMigration } s.status.Phase = phase @@ -183,7 +190,7 @@ func (s *memoryStore) SetMessage(message string) error { defer s.mu.Unlock() if !s.initialized { - return types.ErrNoActiveMigration + return types.ErrNoActiveKURLMigration } s.status.Message = message @@ -195,7 +202,7 @@ func (s *memoryStore) SetProgress(progress int) error { defer s.mu.Unlock() if !s.initialized { - return types.ErrNoActiveMigration + return types.ErrNoActiveKURLMigration } s.status.Progress = progress @@ -207,7 +214,7 @@ func (s *memoryStore) SetError(err string) error { defer s.mu.Unlock() if !s.initialized { - return types.ErrNoActiveMigration + return types.ErrNoActiveKURLMigration } s.status.Error = err @@ -219,7 +226,7 @@ func (s *memoryStore) GetTransferMode() (string, error) { defer s.mu.RUnlock() if !s.initialized { - return "", types.ErrNoActiveMigration + return "", types.ErrNoActiveKURLMigration } return s.transferMode, nil @@ -230,7 +237,7 @@ func (s *memoryStore) GetConfig() (types.LinuxInstallationConfig, error) { defer s.mu.RUnlock() if !s.initialized { - return types.LinuxInstallationConfig{}, types.ErrNoActiveMigration + return types.LinuxInstallationConfig{}, types.ErrNoActiveKURLMigration } var config types.LinuxInstallationConfig @@ -240,3 +247,28 @@ func (s *memoryStore) GetConfig() (types.LinuxInstallationConfig, error) { return config, nil } + +func (s *memoryStore) GetUserConfig() (types.LinuxInstallationConfig, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + // Return user config even if migration not initialized (for GET /config endpoint) + // If not initialized, userConfig will be zero-value (empty) + var config types.LinuxInstallationConfig + if err := deepcopy.Copy(&config, &s.userConfig); err != nil { + return types.LinuxInstallationConfig{}, err + } + + return config, nil +} + +func (s *memoryStore) SetUserConfig(config types.LinuxInstallationConfig) error { + s.mu.Lock() + defer s.mu.Unlock() + + if err := deepcopy.Copy(&s.userConfig, &config); err != nil { + return err + } + + return nil +} diff --git a/api/internal/store/migration/store_mock.go b/api/internal/store/kurlmigration/store_mock.go similarity index 65% rename from api/internal/store/migration/store_mock.go rename to api/internal/store/kurlmigration/store_mock.go index ec69197073..c7ffa7ecab 100644 --- a/api/internal/store/migration/store_mock.go +++ b/api/internal/store/kurlmigration/store_mock.go @@ -1,4 +1,4 @@ -package migration +package kurlmigration import ( "github.com/replicatedhq/embedded-cluster/api/types" @@ -22,20 +22,20 @@ func (m *MockStore) GetMigrationID() (string, error) { return args.Get(0).(string), args.Error(1) } -func (m *MockStore) GetStatus() (types.MigrationStatusResponse, error) { +func (m *MockStore) GetStatus() (types.KURLMigrationStatusResponse, error) { args := m.Called() if args.Get(0) == nil { - return types.MigrationStatusResponse{}, args.Error(1) + return types.KURLMigrationStatusResponse{}, args.Error(1) } - return args.Get(0).(types.MigrationStatusResponse), args.Error(1) + return args.Get(0).(types.KURLMigrationStatusResponse), args.Error(1) } -func (m *MockStore) SetState(state types.MigrationState) error { +func (m *MockStore) SetState(state types.KURLMigrationState) error { args := m.Called(state) return args.Error(0) } -func (m *MockStore) SetPhase(phase types.MigrationPhase) error { +func (m *MockStore) SetPhase(phase types.KURLMigrationPhase) error { args := m.Called(phase) return args.Error(0) } @@ -67,3 +67,16 @@ func (m *MockStore) GetConfig() (types.LinuxInstallationConfig, error) { } return args.Get(0).(types.LinuxInstallationConfig), args.Error(1) } + +func (m *MockStore) GetUserConfig() (types.LinuxInstallationConfig, error) { + args := m.Called() + if args.Get(0) == nil { + return types.LinuxInstallationConfig{}, args.Error(1) + } + return args.Get(0).(types.LinuxInstallationConfig), args.Error(1) +} + +func (m *MockStore) SetUserConfig(config types.LinuxInstallationConfig) error { + args := m.Called(config) + return args.Error(0) +} diff --git a/api/internal/store/migration/store_test.go b/api/internal/store/kurlmigration/store_test.go similarity index 88% rename from api/internal/store/migration/store_test.go rename to api/internal/store/kurlmigration/store_test.go index ba9a9c99eb..c588bf05f8 100644 --- a/api/internal/store/migration/store_test.go +++ b/api/internal/store/kurlmigration/store_test.go @@ -1,4 +1,4 @@ -package migration +package kurlmigration import ( "testing" @@ -13,7 +13,7 @@ func TestNewMemoryStore(t *testing.T) { // Should return error when no migration is initialized _, err := store.GetMigrationID() - assert.ErrorIs(t, err, types.ErrNoActiveMigration) + assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) } func TestInitializeMigration(t *testing.T) { @@ -46,8 +46,8 @@ func TestInitializeMigration(t *testing.T) { // Verify initial status status, err := store.GetStatus() assert.NoError(t, err) - assert.Equal(t, types.MigrationStateNotStarted, status.State) - assert.Equal(t, types.MigrationPhaseDiscovery, status.Phase) + assert.Equal(t, types.KURLMigrationStateNotStarted, status.State) + assert.Equal(t, types.KURLMigrationPhaseDiscovery, status.Phase) assert.Equal(t, "", status.Message) assert.Equal(t, 0, status.Progress) assert.Equal(t, "", status.Error) @@ -63,15 +63,15 @@ func TestInitializeMigrationTwice(t *testing.T) { // Second initialization should fail err = store.InitializeMigration("second-id", "move", config) - assert.ErrorIs(t, err, types.ErrMigrationAlreadyStarted) + assert.ErrorIs(t, err, types.ErrKURLMigrationAlreadyStarted) } func TestSetState(t *testing.T) { store := NewMemoryStore() // Should return error when no migration is initialized - err := store.SetState(types.MigrationStateInProgress) - assert.ErrorIs(t, err, types.ErrNoActiveMigration) + err := store.SetState(types.KURLMigrationStateInProgress) + assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) // Initialize migration config := types.LinuxInstallationConfig{} @@ -79,12 +79,12 @@ func TestSetState(t *testing.T) { assert.NoError(t, err) // Update state - err = store.SetState(types.MigrationStateInProgress) + err = store.SetState(types.KURLMigrationStateInProgress) assert.NoError(t, err) status, err := store.GetStatus() assert.NoError(t, err) - assert.Equal(t, types.MigrationStateInProgress, status.State) + assert.Equal(t, types.KURLMigrationStateInProgress, status.State) } func TestSetPhase(t *testing.T) { @@ -93,12 +93,12 @@ func TestSetPhase(t *testing.T) { err := store.InitializeMigration("test-id", "copy", config) assert.NoError(t, err) - err = store.SetPhase(types.MigrationPhasePreparation) + err = store.SetPhase(types.KURLMigrationPhasePreparation) assert.NoError(t, err) status, err := store.GetStatus() assert.NoError(t, err) - assert.Equal(t, types.MigrationPhasePreparation, status.Phase) + assert.Equal(t, types.KURLMigrationPhasePreparation, status.Phase) } func TestSetMessage(t *testing.T) { @@ -148,9 +148,9 @@ func TestStoreOptions(t *testing.T) { AdminConsolePort: 30000, } - status := types.MigrationStatusResponse{ - State: types.MigrationStateInProgress, - Phase: types.MigrationPhaseECInstall, + status := types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateInProgress, + Phase: types.KURLMigrationPhaseECInstall, Message: "Installing EC", Progress: 75, } diff --git a/api/internal/store/store.go b/api/internal/store/store.go index 7b7a351840..e926a37e52 100644 --- a/api/internal/store/store.go +++ b/api/internal/store/store.go @@ -8,9 +8,9 @@ import ( appupgrade "github.com/replicatedhq/embedded-cluster/api/internal/store/app/upgrade" "github.com/replicatedhq/embedded-cluster/api/internal/store/infra" kubernetesinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/kubernetes/installation" + kurlmigration "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/installation" linuxpreflight "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/preflight" - "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" ) var _ Store = &memoryStore{} @@ -47,8 +47,8 @@ type Store interface { // AirgapStore provides access to airgap operations AirgapStore() airgap.Store - // MigrationStore provides access to migration operations - MigrationStore() migration.Store + // MigrationStore provides access to kURL migration operations + MigrationStore() kurlmigration.Store } // StoreOption is a function that configures a store @@ -117,8 +117,8 @@ func WithAirgapStore(store airgap.Store) StoreOption { } } -// WithMigrationStore sets the migration store -func WithMigrationStore(store migration.Store) StoreOption { +// WithMigrationStore sets the kURL migration store +func WithMigrationStore(store kurlmigration.Store) StoreOption { return func(s *memoryStore) { s.migrationStore = store } @@ -138,7 +138,7 @@ type memoryStore struct { appInstallStore appinstall.Store appUpgradeStore appupgrade.Store airgapStore airgap.Store - migrationStore migration.Store + migrationStore kurlmigration.Store } // NewMemoryStore creates a new memory store with the given options @@ -190,7 +190,7 @@ func NewMemoryStore(opts ...StoreOption) Store { } if s.migrationStore == nil { - s.migrationStore = migration.NewMemoryStore() + s.migrationStore = kurlmigration.NewMemoryStore() } return s @@ -236,6 +236,6 @@ func (s *memoryStore) AirgapStore() airgap.Store { return s.airgapStore } -func (s *memoryStore) MigrationStore() migration.Store { +func (s *memoryStore) MigrationStore() kurlmigration.Store { return s.migrationStore } diff --git a/api/internal/store/store_mock.go b/api/internal/store/store_mock.go index 37371bad20..c076a5c5db 100644 --- a/api/internal/store/store_mock.go +++ b/api/internal/store/store_mock.go @@ -10,9 +10,9 @@ import ( appupgrade "github.com/replicatedhq/embedded-cluster/api/internal/store/app/upgrade" "github.com/replicatedhq/embedded-cluster/api/internal/store/infra" kubernetesinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/kubernetes/installation" + kurlmigration "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/installation" linuxpreflight "github.com/replicatedhq/embedded-cluster/api/internal/store/linux/preflight" - "github.com/replicatedhq/embedded-cluster/api/internal/store/migration" ) var _ Store = (*MockStore)(nil) @@ -29,7 +29,7 @@ type MockStore struct { AppInstallMockStore appinstall.MockStore AppUpgradeMockStore appupgrade.MockStore AirgapMockStore airgap.MockStore - MigrationMockStore migration.MockStore + MigrationMockStore kurlmigration.MockStore } // LinuxPreflightStore returns the mock linux preflight store @@ -82,8 +82,8 @@ func (m *MockStore) AirgapStore() airgap.Store { return &m.AirgapMockStore } -// MigrationStore returns the mock migration store -func (m *MockStore) MigrationStore() migration.Store { +// MigrationStore returns the mock kURL migration store +func (m *MockStore) MigrationStore() kurlmigration.Store { return &m.MigrationMockStore } diff --git a/api/routes.go b/api/routes.go index d81864f834..d6926f44ef 100644 --- a/api/routes.go +++ b/api/routes.go @@ -138,7 +138,7 @@ func (a *API) registerConsoleRoutes(router *mux.Router) { func (a *API) registerMigrationRoutes(router *mux.Router) { migrationRouter := router.PathPrefix("/kurl-migration").Subrouter() - migrationRouter.HandleFunc("/config", a.handlers.migration.GetInstallationConfig).Methods("GET") - migrationRouter.HandleFunc("/start", a.handlers.migration.PostStartMigration).Methods("POST") - migrationRouter.HandleFunc("/status", a.handlers.migration.GetMigrationStatus).Methods("GET") + migrationRouter.HandleFunc("/config", a.handlers.kurlmigration.GetInstallationConfig).Methods("GET") + migrationRouter.HandleFunc("/start", a.handlers.kurlmigration.PostStartMigration).Methods("POST") + migrationRouter.HandleFunc("/status", a.handlers.kurlmigration.GetMigrationStatus).Methods("GET") } diff --git a/api/types/migration.go b/api/types/migration.go index a3cc789b11..8311f6e3aa 100644 --- a/api/types/migration.go +++ b/api/types/migration.go @@ -5,12 +5,12 @@ import ( "net/http" ) -// Migration error constants +// kURL Migration error constants var ( - ErrNoActiveMigration = errors.New("no active migration") - ErrMigrationAlreadyStarted = errors.New("migration already started") - ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") - ErrMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") + ErrNoActiveKURLMigration = errors.New("no active migration") + ErrKURLMigrationAlreadyStarted = errors.New("migration already started") + ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") + ErrKURLMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") ) // NewNotFoundError creates a 404 API error @@ -22,25 +22,25 @@ func NewNotFoundError(err error) *APIError { } } -// MigrationState represents the state of a migration -type MigrationState string +// KURLMigrationState represents the state of a kURL migration +type KURLMigrationState string const ( - MigrationStateNotStarted MigrationState = "NotStarted" - MigrationStateInProgress MigrationState = "InProgress" - MigrationStateCompleted MigrationState = "Completed" - MigrationStateFailed MigrationState = "Failed" + KURLMigrationStateNotStarted KURLMigrationState = "NotStarted" + KURLMigrationStateInProgress KURLMigrationState = "InProgress" + KURLMigrationStateCompleted KURLMigrationState = "Completed" + KURLMigrationStateFailed KURLMigrationState = "Failed" ) -// MigrationPhase represents the phase of a migration -type MigrationPhase string +// KURLMigrationPhase represents the phase of a kURL migration +type KURLMigrationPhase string const ( - MigrationPhaseDiscovery MigrationPhase = "Discovery" - MigrationPhasePreparation MigrationPhase = "Preparation" - MigrationPhaseECInstall MigrationPhase = "ECInstall" - MigrationPhaseDataTransfer MigrationPhase = "DataTransfer" - MigrationPhaseCompleted MigrationPhase = "Completed" + KURLMigrationPhaseDiscovery KURLMigrationPhase = "Discovery" + KURLMigrationPhasePreparation KURLMigrationPhase = "Preparation" + KURLMigrationPhaseECInstall KURLMigrationPhase = "ECInstall" + KURLMigrationPhaseDataTransfer KURLMigrationPhase = "DataTransfer" + KURLMigrationPhaseCompleted KURLMigrationPhase = "Completed" ) // TransferMode represents the mode for data transfer during migration @@ -51,31 +51,31 @@ const ( TransferModeMove TransferMode = "move" ) -// StartMigrationRequest represents the request to start a migration +// StartKURLMigrationRequest represents the request to start a kURL migration // @Description Request body for starting a migration from kURL to Embedded Cluster -type StartMigrationRequest struct { +type StartKURLMigrationRequest struct { // TransferMode specifies whether to copy or move data during migration TransferMode TransferMode `json:"transferMode" enums:"copy,move" example:"copy"` // Config contains optional installation configuration that will be merged with defaults Config *LinuxInstallationConfig `json:"config,omitempty" validate:"optional"` } -// StartMigrationResponse represents the response when starting a migration +// StartKURLMigrationResponse represents the response when starting a kURL migration // @Description Response returned when a migration is successfully started -type StartMigrationResponse struct { +type StartKURLMigrationResponse struct { // MigrationID is the unique identifier for this migration MigrationID string `json:"migrationId" example:"550e8400-e29b-41d4-a716-446655440000"` // Message is a user-facing message about the migration status Message string `json:"message" example:"Migration started successfully"` } -// MigrationStatusResponse represents the status of a migration +// KURLMigrationStatusResponse represents the status of a kURL migration // @Description Current status and progress of a migration -type MigrationStatusResponse struct { +type KURLMigrationStatusResponse struct { // State is the current state of the migration - State MigrationState `json:"state" enums:"NotStarted,InProgress,Completed,Failed" example:"InProgress"` + State KURLMigrationState `json:"state" enums:"NotStarted,InProgress,Completed,Failed" example:"InProgress"` // Phase is the current phase of the migration process - Phase MigrationPhase `json:"phase" enums:"Discovery,Preparation,ECInstall,DataTransfer,Completed" example:"Discovery"` + Phase KURLMigrationPhase `json:"phase" enums:"Discovery,Preparation,ECInstall,DataTransfer,Completed" example:"Discovery"` // Message is a user-facing message describing the current status Message string `json:"message" example:"Discovering kURL cluster configuration"` // Progress is the completion percentage (0-100) diff --git a/cmd/installer/cli/headless/install/mock_client.go b/cmd/installer/cli/headless/install/mock_client.go index 81823231c3..5ae0171b4d 100644 --- a/cmd/installer/cli/headless/install/mock_client.go +++ b/cmd/installer/cli/headless/install/mock_client.go @@ -364,13 +364,13 @@ func (m *mockAPIClient) GetKURLMigrationConfig(ctx context.Context) (apitypes.Li } // StartKURLMigration returns empty response (mock implementation). -func (m *mockAPIClient) StartKURLMigration(ctx context.Context, transferMode string, config *apitypes.LinuxInstallationConfig) (apitypes.StartMigrationResponse, error) { - return apitypes.StartMigrationResponse{}, nil +func (m *mockAPIClient) StartKURLMigration(ctx context.Context, transferMode string, config *apitypes.LinuxInstallationConfig) (apitypes.StartKURLMigrationResponse, error) { + return apitypes.StartKURLMigrationResponse{}, nil } // GetKURLMigrationStatus returns empty status (mock implementation). -func (m *mockAPIClient) GetKURLMigrationStatus(ctx context.Context) (apitypes.MigrationStatusResponse, error) { - return apitypes.MigrationStatusResponse{}, nil +func (m *mockAPIClient) GetKURLMigrationStatus(ctx context.Context) (apitypes.KURLMigrationStatusResponse, error) { + return apitypes.KURLMigrationStatusResponse{}, nil } // Ensure mockAPIClient implements client.Client interface diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 9077a33d5c..c66a7c7924 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -517,6 +517,42 @@ func readPasswordHash(ctx context.Context, kcli client.Client, namespace string) return passwordBcryptData, nil } +// runAPIServer starts the API server with the provided config and waits for it to exit or context cancellation. +// This is a common helper function used by both runManagerExperienceUpgrade and runMigrationAPI. +func runAPIServer( + ctx context.Context, + cert *tls.Certificate, + apiConfig apiOptions, + hostname string, + port int, + appTitle string, +) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + apiExitCh, err := startAPI(ctx, *cert, apiConfig) + if err != nil { + return fmt.Errorf("failed to start api: %w", err) + } + + logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", + appTitle, + getManagerURL(hostname, port)) + + // Wait for either user cancellation or API unexpected exit + select { + case <-ctx.Done(): + // Normal exit (user interrupted) + return nil + case err := <-apiExitCh: + // API exited unexpectedly + if err != nil { + return err + } + return fmt.Errorf("api server exited unexpectedly") + } +} + func runManagerExperienceUpgrade( ctx context.Context, flags UpgradeCmdFlags, upgradeConfig upgradeConfig, rc runtimeconfig.RuntimeConfig, metricsReporter metrics.ReporterInterface, appTitle string, targetVersion string, initialVersion string, @@ -549,30 +585,7 @@ func runManagerExperienceUpgrade( MetricsReporter: metricsReporter, } - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - apiExitCh, err := startAPI(ctx, upgradeConfig.tlsCert, apiConfig) - if err != nil { - return fmt.Errorf("failed to start api: %w", err) - } - - logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", - appTitle, - getManagerURL(upgradeConfig.tlsConfig.Hostname, upgradeConfig.managerPort)) - - // Wait for either user cancellation or API unexpected exit - select { - case <-ctx.Done(): - // Normal exit (user interrupted) - return nil - case err := <-apiExitCh: - // API exited unexpectedly - if err != nil { - return err - } - return fmt.Errorf("api server exited unexpectedly") - } + return runAPIServer(ctx, &upgradeConfig.tlsCert, apiConfig, upgradeConfig.tlsConfig.Hostname, upgradeConfig.managerPort, appTitle) } // checkRequiresInfraUpgrade determines if an infrastructure upgrade is required by comparing @@ -731,7 +744,7 @@ func runMigrationAPI( } // Use the user-provided manager port if specified, otherwise use default - managerPort := 30081 // Default port for upgrade/migration mode + managerPort := 30080 // Default port for upgrade/migration mode if flags.managerPort != 0 { managerPort = flags.managerPort } @@ -777,29 +790,5 @@ func runMigrationAPI( WebMode: web.ModeUpgrade, } - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // Start the API server - apiExitCh, err := startAPI(ctx, cert, apiConfig) - if err != nil { - return fmt.Errorf("failed to start migration API: %w", err) - } - - logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", - appTitle, - getManagerURL(tlsConfig.Hostname, managerPort)) - - // Wait for either user cancellation or API unexpected exit - select { - case <-ctx.Done(): - // Normal exit (user interrupted) - return nil - case err := <-apiExitCh: - // API exited unexpectedly - if err != nil { - return err - } - return fmt.Errorf("migration API server exited unexpectedly") - } + return runAPIServer(ctx, &cert, apiConfig, tlsConfig.Hostname, managerPort, appTitle) } diff --git a/pkg-new/kurl/kurl.go b/pkg-new/kurl/kurl.go index d745f7f7af..3f74566457 100644 --- a/pkg-new/kurl/kurl.go +++ b/pkg-new/kurl/kurl.go @@ -89,6 +89,8 @@ func getInstallDirectory(ctx context.Context, kcli client.Client) (string, error // DiscoverKotsadmNamespace finds the namespace containing the kotsadm Service. // It checks "default" first, then searches all namespaces for a Service with label "app=kotsadm". +// While uncommon, it is possible for kotsadm to be in a different namespace, +// so we discover it dynamically instead of hardcoding "default". // Returns namespace name or error if not found. func DiscoverKotsadmNamespace(ctx context.Context, cfg *Config) (string, error) { // First, check the default namespace diff --git a/tests/dryrun/upgrade_kurl_migration_test.go b/tests/dryrun/upgrade_kurl_migration_test.go index 50941d8dc4..a6964dd6eb 100644 --- a/tests/dryrun/upgrade_kurl_migration_test.go +++ b/tests/dryrun/upgrade_kurl_migration_test.go @@ -132,10 +132,10 @@ func TestUpgradeKURLMigration(t *testing.T) { } // assertEventuallyMigrationState waits for the migration status to reach the expected state -func assertEventuallyMigrationState(t *testing.T, contextMsg string, expectedState apitypes.MigrationState, getStatus func() (apitypes.MigrationState, string, error)) { +func assertEventuallyMigrationState(t *testing.T, contextMsg string, expectedState apitypes.KURLMigrationState, getStatus func() (apitypes.KURLMigrationState, string, error)) { t.Helper() - var lastState apitypes.MigrationState + var lastState apitypes.KURLMigrationState var lastMsg string var lastErr error @@ -173,7 +173,7 @@ func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) }() ctx := t.Context() - managerPort := 30081 // Default port for upgrade mode + managerPort := 30080 // Default port for upgrade mode // Wait for API to be ready httpClient := insecureHTTPClient() @@ -196,7 +196,7 @@ func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) // GET /api/linux/kurl-migration/status // The migration should eventually reach Failed state with the skeleton error - assertEventuallyMigrationState(t, "migration phase execution not yet implemented", apitypes.MigrationStateFailed, func() (apitypes.MigrationState, string, error) { + assertEventuallyMigrationState(t, "migration phase execution not yet implemented", apitypes.KURLMigrationStateFailed, func() (apitypes.KURLMigrationState, string, error) { statusResp, err := c.GetKURLMigrationStatus(ctx) if err != nil { return "", "", err @@ -207,7 +207,7 @@ func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) // Get final status to verify error message finalStatus, err := c.GetKURLMigrationStatus(ctx) require.NoError(t, err, "failed to get migration status") - require.Equal(t, apitypes.MigrationStateFailed, finalStatus.State, "migration should be in Failed state") + require.Equal(t, apitypes.KURLMigrationStateFailed, finalStatus.State, "migration should be in Failed state") require.Contains(t, finalStatus.Error, "migration phase execution not yet implemented", "expected skeleton error message in status") } From 2cd1190810d32719889d6bf1b714ec70b4ef4f81 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 11:28:38 -0500 Subject: [PATCH 12/37] update swagger docs --- api/docs/docs.go | 4 +- api/docs/swagger.json | 4 +- api/docs/swagger.yaml | 120 +++++++++++++++++------------------ cmd/installer/cli/upgrade.go | 1 - 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/api/docs/docs.go b/api/docs/docs.go index fb237cec9a..10f2decf27 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 2ba4b2605e..1da0c25b7c 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.MigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["MigrationPhaseDiscovery","MigrationPhasePreparation","MigrationPhaseECInstall","MigrationPhaseDataTransfer","MigrationPhaseCompleted"]},"types.MigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["MigrationStateNotStarted","MigrationStateInProgress","MigrationStateCompleted","MigrationStateFailed"]},"types.MigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.MigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.MigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.MigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 4c55ecbcbe..1d0a5610b0 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -975,6 +975,61 @@ components: - allowIgnoreHostPreflights - titles type: object + types.KURLMigrationPhase: + description: Phase is the current phase of the migration process + enum: + - Discovery + - Preparation + - ECInstall + - DataTransfer + - Completed + example: Discovery + type: string + x-enum-varnames: + - KURLMigrationPhaseDiscovery + - KURLMigrationPhasePreparation + - KURLMigrationPhaseECInstall + - KURLMigrationPhaseDataTransfer + - KURLMigrationPhaseCompleted + types.KURLMigrationState: + description: State is the current state of the migration + enum: + - NotStarted + - InProgress + - Completed + - Failed + example: InProgress + type: string + x-enum-varnames: + - KURLMigrationStateNotStarted + - KURLMigrationStateInProgress + - KURLMigrationStateCompleted + - KURLMigrationStateFailed + types.KURLMigrationStatusResponse: + description: Current status and progress of a migration + properties: + error: + description: Error contains the error message if the migration failed + example: "" + type: string + message: + description: Message is a user-facing message describing the current status + example: Discovering kURL cluster configuration + type: string + phase: + $ref: '#/components/schemas/types.KURLMigrationPhase' + progress: + description: Progress is the completion percentage (0-100) + example: 25 + type: integer + state: + $ref: '#/components/schemas/types.KURLMigrationState' + required: + - message + - phase + - progress + - state + type: object types.KubernetesInstallationConfig: properties: adminConsolePort: @@ -1044,61 +1099,6 @@ components: - resolved - values type: object - types.MigrationPhase: - description: Phase is the current phase of the migration process - enum: - - Discovery - - Preparation - - ECInstall - - DataTransfer - - Completed - example: Discovery - type: string - x-enum-varnames: - - MigrationPhaseDiscovery - - MigrationPhasePreparation - - MigrationPhaseECInstall - - MigrationPhaseDataTransfer - - MigrationPhaseCompleted - types.MigrationState: - description: State is the current state of the migration - enum: - - NotStarted - - InProgress - - Completed - - Failed - example: InProgress - type: string - x-enum-varnames: - - MigrationStateNotStarted - - MigrationStateInProgress - - MigrationStateCompleted - - MigrationStateFailed - types.MigrationStatusResponse: - description: Current status and progress of a migration - properties: - error: - description: Error contains the error message if the migration failed - example: "" - type: string - message: - description: Message is a user-facing message describing the current status - example: Discovering kURL cluster configuration - type: string - phase: - $ref: '#/components/schemas/types.MigrationPhase' - progress: - description: Progress is the completion percentage (0-100) - example: 25 - type: integer - state: - $ref: '#/components/schemas/types.MigrationState' - required: - - message - - phase - - progress - - state - type: object types.PatchAppConfigValuesRequest: properties: values: @@ -1148,7 +1148,7 @@ components: - strict - title type: object - types.StartMigrationRequest: + types.StartKURLMigrationRequest: description: Request body for starting a migration from kURL to Embedded Cluster properties: config: @@ -1158,7 +1158,7 @@ components: required: - transferMode type: object - types.StartMigrationResponse: + types.StartKURLMigrationResponse: description: Response returned when a migration is successfully started properties: message: @@ -1971,7 +1971,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/types.StartMigrationRequest' + $ref: '#/components/schemas/types.StartKURLMigrationRequest' description: Start Migration Request required: true responses: @@ -1979,7 +1979,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/types.StartMigrationResponse' + $ref: '#/components/schemas/types.StartKURLMigrationResponse' description: OK "400": content: @@ -2007,7 +2007,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/types.MigrationStatusResponse' + $ref: '#/components/schemas/types.KURLMigrationStatusResponse' description: OK "404": content: diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index c66a7c7924..5a6acd77f3 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -786,7 +786,6 @@ func runMigrationAPI( }, }, ManagerPort: managerPort, - Headless: true, // TODO: Enable web UI after implementing web assets WebMode: web.ModeUpgrade, } From 63a41d3ea0cf5472596ed279abd826774654ba35 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 11:42:41 -0500 Subject: [PATCH 13/37] update web api types --- .../kurlmigration/controller_test.go | 52 ++++++------- web/src/types/api.ts | 74 +++++++++---------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index 59ba56f8c2..16a8b7d48a 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -30,17 +30,17 @@ func TestGetInstallationConfig(t *testing.T) { } defaults := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", - GlobalCIDR: "10.244.0.0/16", + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + GlobalCIDR: "10.244.0.0/16", } resolvedConfig := types.LinuxInstallationConfig{ - AdminConsolePort: 8800, - DataDirectory: "/var/lib/embedded-cluster", - PodCIDR: "10.32.0.0/20", - ServiceCIDR: "10.96.0.0/12", - GlobalCIDR: "10.244.0.0/16", + AdminConsolePort: 8800, + DataDirectory: "/var/lib/embedded-cluster", + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + GlobalCIDR: "10.244.0.0/16", } mock.InOrder( @@ -58,16 +58,16 @@ func TestGetInstallationConfig(t *testing.T) { ServiceCIDR: "10.96.0.0/12", }, Defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", - GlobalCIDR: "10.244.0.0/16", + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + GlobalCIDR: "10.244.0.0/16", }, Resolved: types.LinuxInstallationConfig{ - AdminConsolePort: 8800, - DataDirectory: "/var/lib/embedded-cluster", - PodCIDR: "10.32.0.0/20", - ServiceCIDR: "10.96.0.0/12", - GlobalCIDR: "10.244.0.0/16", + AdminConsolePort: 8800, + DataDirectory: "/var/lib/embedded-cluster", + PodCIDR: "10.32.0.0/20", + ServiceCIDR: "10.96.0.0/12", + GlobalCIDR: "10.244.0.0/16", }, } }, @@ -105,14 +105,14 @@ func TestGetInstallationConfig(t *testing.T) { } defaults := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", } // Resolved should have kURL values override defaults (since no user config yet) resolvedConfig := types.LinuxInstallationConfig{ - AdminConsolePort: 8800, - DataDirectory: "/opt/kurl", + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", } mock.InOrder( @@ -129,13 +129,13 @@ func TestGetInstallationConfig(t *testing.T) { DataDirectory: "/opt/kurl", }, Defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", - }, + AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", + }, Resolved: types.LinuxInstallationConfig{ - AdminConsolePort: 8800, - DataDirectory: "/opt/kurl", - }, + AdminConsolePort: 8800, + DataDirectory: "/opt/kurl", + }, } }, }, diff --git a/web/src/types/api.ts b/web/src/types/api.ts index 7ce1695f38..5a55a5b61e 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -1842,6 +1842,38 @@ export interface components { status?: components["schemas"]["types.Status"]; titles: string[]; }; + /** + * @description Phase is the current phase of the migration process + * @example Discovery + * @enum {string} + */ + "types.KURLMigrationPhase": "Discovery" | "Preparation" | "ECInstall" | "DataTransfer" | "Completed"; + /** + * @description State is the current state of the migration + * @example InProgress + * @enum {string} + */ + "types.KURLMigrationState": "NotStarted" | "InProgress" | "Completed" | "Failed"; + /** @description Current status and progress of a migration */ + "types.KURLMigrationStatusResponse": { + /** + * @description Error contains the error message if the migration failed + * @example + */ + error?: string; + /** + * @description Message is a user-facing message describing the current status + * @example Discovering kURL cluster configuration + */ + message: string; + phase: components["schemas"]["types.KURLMigrationPhase"]; + /** + * @description Progress is the completion percentage (0-100) + * @example 25 + */ + progress: number; + state: components["schemas"]["types.KURLMigrationState"]; + }; "types.KubernetesInstallationConfig": { adminConsolePort?: number; httpProxy?: string; @@ -1874,38 +1906,6 @@ export interface components { resolved: components["schemas"]["types.LinuxInstallationConfig"]; values: components["schemas"]["types.LinuxInstallationConfig"]; }; - /** - * @description Phase is the current phase of the migration process - * @example Discovery - * @enum {string} - */ - "types.MigrationPhase": "Discovery" | "Preparation" | "ECInstall" | "DataTransfer" | "Completed"; - /** - * @description State is the current state of the migration - * @example InProgress - * @enum {string} - */ - "types.MigrationState": "NotStarted" | "InProgress" | "Completed" | "Failed"; - /** @description Current status and progress of a migration */ - "types.MigrationStatusResponse": { - /** - * @description Error contains the error message if the migration failed - * @example - */ - error?: string; - /** - * @description Message is a user-facing message describing the current status - * @example Discovering kURL cluster configuration - */ - message: string; - phase: components["schemas"]["types.MigrationPhase"]; - /** - * @description Progress is the completion percentage (0-100) - * @example 25 - */ - progress: number; - state: components["schemas"]["types.MigrationState"]; - }; "types.PatchAppConfigValuesRequest": { values: components["schemas"]["types.AppConfigValues"]; }; @@ -1923,12 +1923,12 @@ export interface components { title: string; }; /** @description Request body for starting a migration from kURL to Embedded Cluster */ - "types.StartMigrationRequest": { + "types.StartKURLMigrationRequest": { config?: components["schemas"]["types.LinuxInstallationConfig"]; transferMode: components["schemas"]["types.TransferMode"]; }; /** @description Response returned when a migration is successfully started */ - "types.StartMigrationResponse": { + "types.StartKURLMigrationResponse": { /** * @description Message is a user-facing message about the migration status * @example Migration started successfully @@ -2699,7 +2699,7 @@ export interface operations { /** @description Start Migration Request */ requestBody: { content: { - "application/json": components["schemas"]["types.StartMigrationRequest"]; + "application/json": components["schemas"]["types.StartKURLMigrationRequest"]; }; }; responses: { @@ -2709,7 +2709,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["types.StartMigrationResponse"]; + "application/json": components["schemas"]["types.StartKURLMigrationResponse"]; }; }; /** @description Bad Request */ @@ -2747,7 +2747,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["types.MigrationStatusResponse"]; + "application/json": components["schemas"]["types.KURLMigrationStatusResponse"]; }; }; /** @description Not Found */ From df9dda0b6fc347b83e6f53a0b873aef64de86763 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 12:28:26 -0500 Subject: [PATCH 14/37] address feedback --- api/docs/docs.go | 2 +- api/docs/swagger.json | 2 +- api/docs/swagger.yaml | 150 +++++++++--------- .../handlers/kurlmigration/handler.go | 6 +- 4 files changed, 80 insertions(+), 80 deletions(-) diff --git a/api/docs/docs.go b/api/docs/docs.go index 10f2decf27..d1d62c3190 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -9,7 +9,7 @@ const docTemplate = `{ "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 1da0c25b7c..edc5e8e8d2 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -2,7 +2,7 @@ "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"adminConsolePort":{"type":"integer"},"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 1d0a5610b0..0da91deea8 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -1945,81 +1945,6 @@ paths: summary: Upgrade the app tags: - kubernetes-upgrade - /kurl-migration/config: - get: - description: Get the installation config extracted from kURL merged with EC - defaults - operationId: getMigrationInstallationConfig - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.LinuxInstallationConfigResponse' - description: OK - security: - - bearerauth: [] - summary: Get the installation config for migration - tags: - - migration - /kurl-migration/start: - post: - description: Start a migration from kURL to Embedded Cluster with the provided - configuration - operationId: postStartMigration - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/types.StartKURLMigrationRequest' - description: Start Migration Request - required: true - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.StartKURLMigrationResponse' - description: OK - "400": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Bad Request - "409": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Conflict - security: - - bearerauth: [] - summary: Start a migration from kURL to Embedded Cluster - tags: - - migration - /kurl-migration/status: - get: - description: Get the current status and progress of the migration - operationId: getMigrationStatus - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/types.KURLMigrationStatusResponse' - description: OK - "404": - content: - application/json: - schema: - $ref: '#/components/schemas/types.APIError' - description: Not Found - security: - - bearerauth: [] - summary: Get the status of the migration - tags: - - migration /linux/install/airgap/process: post: description: Process the airgap bundle for install @@ -2381,6 +2306,81 @@ paths: summary: Get installation configuration status for install tags: - linux-install + /linux/kurl-migration/config: + get: + description: Get the installation config extracted from kURL merged with EC + defaults + operationId: getMigrationInstallationConfig + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.LinuxInstallationConfigResponse' + description: OK + security: + - bearerauth: [] + summary: Get the installation config for migration + tags: + - migration + /linux/kurl-migration/start: + post: + description: Start a migration from kURL to Embedded Cluster with the provided + configuration + operationId: postStartMigration + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartKURLMigrationRequest' + description: Start Migration Request + required: true + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.StartKURLMigrationResponse' + description: OK + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Bad Request + "409": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Conflict + security: + - bearerauth: [] + summary: Start a migration from kURL to Embedded Cluster + tags: + - migration + /linux/kurl-migration/status: + get: + description: Get the current status and progress of the migration + operationId: getMigrationStatus + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/types.KURLMigrationStatusResponse' + description: OK + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/types.APIError' + description: Not Found + security: + - bearerauth: [] + summary: Get the status of the migration + tags: + - migration /linux/upgrade/airgap/process: post: description: Process the airgap bundle for upgrade diff --git a/api/internal/handlers/kurlmigration/handler.go b/api/internal/handlers/kurlmigration/handler.go index a96c106b9b..574a0ff3ae 100644 --- a/api/internal/handlers/kurlmigration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -45,7 +45,7 @@ func New(opts ...Option) *Handler { // @Security bearerauth // @Produce json // @Success 200 {object} types.LinuxInstallationConfigResponse -// @Router /kurl-migration/config [get] +// @Router /linux/kurl-migration/config [get] func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) { config, err := h.controller.GetInstallationConfig(r.Context()) if err != nil { @@ -70,7 +70,7 @@ func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) // @Success 200 {object} types.StartKURLMigrationResponse // @Failure 400 {object} types.APIError // @Failure 409 {object} types.APIError -// @Router /kurl-migration/start [post] +// @Router /linux/kurl-migration/start [post] func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { var request types.StartKURLMigrationRequest if err := utils.BindJSON(w, r, &request, h.logger); err != nil { @@ -113,7 +113,7 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { // @Produce json // @Success 200 {object} types.KURLMigrationStatusResponse // @Failure 404 {object} types.APIError -// @Router /kurl-migration/status [get] +// @Router /linux/kurl-migration/status [get] func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { status, err := h.controller.GetKURLMigrationStatus(r.Context()) if err != nil { From 2c3021bcf5f0fb58900974c469bfc4418f925423 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 12:47:00 -0500 Subject: [PATCH 15/37] address feedback --- web/src/types/api.ts | 304 +++++++++++++++++++++---------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/web/src/types/api.ts b/web/src/types/api.ts index 5a55a5b61e..f72f74dd95 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -412,66 +412,6 @@ export interface paths { patch?: never; trace?: never; }; - "/kurl-migration/config": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get the installation config for migration - * @description Get the installation config extracted from kURL merged with EC defaults - */ - get: operations["getMigrationInstallationConfig"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/kurl-migration/start": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Start a migration from kURL to Embedded Cluster - * @description Start a migration from kURL to Embedded Cluster with the provided configuration - */ - post: operations["postStartMigration"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/kurl-migration/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get the status of the migration - * @description Get the current status and progress of the migration - */ - get: operations["getMigrationStatus"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; "/linux/install/airgap/process": { parameters: { query?: never; @@ -776,6 +716,66 @@ export interface paths { patch?: never; trace?: never; }; + "/linux/kurl-migration/config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the installation config for migration + * @description Get the installation config extracted from kURL merged with EC defaults + */ + get: operations["getMigrationInstallationConfig"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/linux/kurl-migration/start": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Start a migration from kURL to Embedded Cluster + * @description Start a migration from kURL to Embedded Cluster with the provided configuration + */ + post: operations["postStartMigration"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/linux/kurl-migration/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the status of the migration + * @description Get the current status and progress of the migration + */ + get: operations["getMigrationStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/linux/upgrade/airgap/process": { parameters: { query?: never; @@ -2669,98 +2669,6 @@ export interface operations { }; }; }; - getMigrationInstallationConfig: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.LinuxInstallationConfigResponse"]; - }; - }; - }; - }; - postStartMigration: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** @description Start Migration Request */ - requestBody: { - content: { - "application/json": components["schemas"]["types.StartKURLMigrationRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.StartKURLMigrationResponse"]; - }; - }; - /** @description Bad Request */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - /** @description Conflict */ - 409: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - }; - }; - getMigrationStatus: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.KURLMigrationStatusResponse"]; - }; - }; - /** @description Not Found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["types.APIError"]; - }; - }; - }; - }; postLinuxInstallProcessAirgap: { parameters: { query?: never; @@ -3201,6 +3109,98 @@ export interface operations { }; }; }; + getMigrationInstallationConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.LinuxInstallationConfigResponse"]; + }; + }; + }; + }; + postStartMigration: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Start Migration Request */ + requestBody: { + content: { + "application/json": components["schemas"]["types.StartKURLMigrationRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.StartKURLMigrationResponse"]; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; + getMigrationStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.KURLMigrationStatusResponse"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["types.APIError"]; + }; + }; + }; + }; postLinuxUpgradeProcessAirgap: { parameters: { query?: never; From 88d93000318340f3a3fa9ea45805f906c11ed514 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 13:18:19 -0500 Subject: [PATCH 16/37] fix unit tests --- api/controllers/kurlmigration/controller.go | 6 ++++++ api/controllers/kurlmigration/controller_test.go | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index c9cb4e5777..9127c5e41d 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -3,6 +3,7 @@ package kurlmigration import ( "context" "fmt" + "time" "github.com/google/uuid" kurlmigrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/kurlmigration" @@ -236,6 +237,11 @@ func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (t func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.Info("starting migration orchestration") + // Small delay to ensure HTTP response completes before any state changes + // This prevents race condition where migration could fail and update state + // before the client receives the success response with migrationID + time.Sleep(100 * time.Millisecond) + // Defer handles all error cases by updating migration state defer func() { // Recover from panics diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index 16a8b7d48a..61605b6afd 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -384,7 +384,8 @@ func TestStartMigration(t *testing.T) { } // Wait for the background goroutine to complete - time.Sleep(100 * time.Millisecond) + // Includes 100ms delay in Run() to prevent race condition + time for execution + time.Sleep(250 * time.Millisecond) } mockManager.AssertExpectations(t) From e0110593e0617063716d5117c209d0374e4683c8 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 13:56:50 -0500 Subject: [PATCH 17/37] remove unused code --- api/internal/managers/kurlmigration/manager.go | 15 --------------- api/types/api.go | 7 ------- 2 files changed, 22 deletions(-) diff --git a/api/internal/managers/kurlmigration/manager.go b/api/internal/managers/kurlmigration/manager.go index 34590b0e48..ca9d273ae7 100644 --- a/api/internal/managers/kurlmigration/manager.go +++ b/api/internal/managers/kurlmigration/manager.go @@ -8,7 +8,6 @@ import ( "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" - "sigs.k8s.io/controller-runtime/pkg/client" ) var _ Manager = &kurlMigrationManager{} @@ -35,8 +34,6 @@ type Manager interface { // kurlMigrationManager is an implementation of the Manager interface type kurlMigrationManager struct { store kurlmigrationstore.Store - kubeClient client.Client - kurlPasswordHash string installationManager linuxinstallation.InstallationManager logger logrus.FieldLogger } @@ -55,18 +52,6 @@ func WithLogger(logger logrus.FieldLogger) ManagerOption { } } -func WithKubeClient(kcli client.Client) ManagerOption { - return func(m *kurlMigrationManager) { - m.kubeClient = kcli - } -} - -func WithKurlPasswordHash(hash string) ManagerOption { - return func(m *kurlMigrationManager) { - m.kurlPasswordHash = hash - } -} - func WithInstallationManager(im linuxinstallation.InstallationManager) ManagerOption { return func(m *kurlMigrationManager) { m.installationManager = im diff --git a/api/types/api.go b/api/types/api.go index 5049aa9fce..a55bb536dc 100644 --- a/api/types/api.go +++ b/api/types/api.go @@ -6,7 +6,6 @@ import ( "github.com/replicatedhq/embedded-cluster/pkg/airgap" "github.com/replicatedhq/embedded-cluster/pkg/release" "github.com/replicatedhq/embedded-cluster/pkg/runtimeconfig" - "sigs.k8s.io/controller-runtime/pkg/client" ) // APIConfig holds the configuration for the API server @@ -30,7 +29,6 @@ type APIConfig struct { LinuxConfig KubernetesConfig - MigrationConfig } type InstallTarget string @@ -55,8 +53,3 @@ type LinuxConfig struct { type KubernetesConfig struct { Installation kubernetesinstallation.Installation } - -type MigrationConfig struct { - KubeClient client.Client // For interacting with kURL cluster - KurlPasswordHash string // Bcrypt hash exported from kURL -} From 085c63ff0cdca59c8117a83b395147ec2dec1a80 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 14:08:17 -0500 Subject: [PATCH 18/37] fix set state bug --- api/controllers/kurlmigration/controller.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index 9127c5e41d..f26a5e79eb 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -314,11 +314,15 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { } // Set state to Completed + // Note: If this fails, we log it but don't return an error because the migration itself succeeded. + // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect + // since all phases completed successfully. The state update failure is a separate concern. if err := c.store.SetState(types.KURLMigrationStateCompleted); err != nil { - c.logger.WithError(err).Error("set state to completed") - return fmt.Errorf("set completed state: %w", err) + c.logger.WithError(err).Error("migration completed successfully but failed to update state to Completed") + // Don't return error - migration succeeded even if state update failed + } else { + c.logger.Info("migration orchestration completed successfully") } - c.logger.Info("migration orchestration completed (skeleton)") return nil } From b7891f6b45bffd2d19a8ff3a944d9b20caff7702 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 16:14:29 -0500 Subject: [PATCH 19/37] address feedback --- api/controllers/kurlmigration/controller.go | 12 ++- api/handlers.go | 9 +-- cmd/installer/cli/upgrade.go | 86 ++++++++++++--------- 3 files changed, 57 insertions(+), 50 deletions(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index f26a5e79eb..96f1472fa3 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -71,7 +71,7 @@ func WithLogger(log logrus.FieldLogger) ControllerOption { } // NewKURLMigrationController creates a new migration controller with the provided options. -// The controller creates its manager internally if not provided via WithManager option. +// The controller creates its manager and installation manager internally if not provided via options. func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationController, error) { controller := &KURLMigrationController{ store: kurlmigrationstore.NewMemoryStore(), @@ -82,11 +82,15 @@ func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationControl opt(controller) } + // Create installation manager internally if not provided via option + if controller.installationManager == nil { + controller.installationManager = linuxinstallation.NewInstallationManager( + linuxinstallation.WithLogger(controller.logger), + ) + } + // Create manager internally if not provided via option if controller.manager == nil { - if controller.installationManager == nil { - return nil, fmt.Errorf("installation manager is required when manager is not provided") - } controller.manager = kurlmigrationmanager.NewManager( kurlmigrationmanager.WithStore(controller.store), kurlmigrationmanager.WithLogger(controller.logger), diff --git a/api/handlers.go b/api/handlers.go index c4951c4c7e..a4de7afa14 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -10,7 +10,6 @@ import ( kuberneteshandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/kubernetes" kurlmigrationhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/kurlmigration" linuxhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/linux" - linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" "github.com/replicatedhq/embedded-cluster/api/types" ) @@ -74,15 +73,9 @@ func (a *API) initHandlers() error { // Initialize kURL migration controller if not already set if a.kurlMigrationController == nil { - // Create installation manager for kURL migration - installMgr := linuxinstallation.NewInstallationManager( - linuxinstallation.WithLogger(a.logger), - ) - - // Controller creates manager internally with store passed as dependency + // Controller creates manager and installation manager internally kurlMigrationController, err := kurlmigration.NewKURLMigrationController( kurlmigration.WithLogger(a.logger), - kurlmigration.WithInstallationManager(installMgr), ) if err != nil { return fmt.Errorf("create kurl migration controller: %w", err) diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 5a6acd77f3..af29b00f0c 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -517,42 +517,6 @@ func readPasswordHash(ctx context.Context, kcli client.Client, namespace string) return passwordBcryptData, nil } -// runAPIServer starts the API server with the provided config and waits for it to exit or context cancellation. -// This is a common helper function used by both runManagerExperienceUpgrade and runMigrationAPI. -func runAPIServer( - ctx context.Context, - cert *tls.Certificate, - apiConfig apiOptions, - hostname string, - port int, - appTitle string, -) error { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - apiExitCh, err := startAPI(ctx, *cert, apiConfig) - if err != nil { - return fmt.Errorf("failed to start api: %w", err) - } - - logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", - appTitle, - getManagerURL(hostname, port)) - - // Wait for either user cancellation or API unexpected exit - select { - case <-ctx.Done(): - // Normal exit (user interrupted) - return nil - case err := <-apiExitCh: - // API exited unexpectedly - if err != nil { - return err - } - return fmt.Errorf("api server exited unexpectedly") - } -} - func runManagerExperienceUpgrade( ctx context.Context, flags UpgradeCmdFlags, upgradeConfig upgradeConfig, rc runtimeconfig.RuntimeConfig, metricsReporter metrics.ReporterInterface, appTitle string, targetVersion string, initialVersion string, @@ -585,7 +549,30 @@ func runManagerExperienceUpgrade( MetricsReporter: metricsReporter, } - return runAPIServer(ctx, &upgradeConfig.tlsCert, apiConfig, upgradeConfig.tlsConfig.Hostname, upgradeConfig.managerPort, appTitle) + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + apiExitCh, err := startAPI(ctx, upgradeConfig.tlsCert, apiConfig) + if err != nil { + return fmt.Errorf("failed to start api: %w", err) + } + + logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", + appTitle, + getManagerURL(upgradeConfig.tlsConfig.Hostname, upgradeConfig.managerPort)) + + // Wait for either user cancellation or API unexpected exit + select { + case <-ctx.Done(): + // Normal exit (user interrupted) + return nil + case err := <-apiExitCh: + // API exited unexpectedly + if err != nil { + return err + } + return fmt.Errorf("api server exited unexpectedly") + } } // checkRequiresInfraUpgrade determines if an infrastructure upgrade is required by comparing @@ -789,5 +776,28 @@ func runMigrationAPI( WebMode: web.ModeUpgrade, } - return runAPIServer(ctx, &cert, apiConfig, tlsConfig.Hostname, managerPort, appTitle) + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + apiExitCh, err := startAPI(ctx, cert, apiConfig) + if err != nil { + return fmt.Errorf("failed to start api: %w", err) + } + + logrus.Infof("\nVisit the %s manager to continue the upgrade: %s\n", + appTitle, + getManagerURL(tlsConfig.Hostname, managerPort)) + + // Wait for either user cancellation or API unexpected exit + select { + case <-ctx.Done(): + // Normal exit (user interrupted) + return nil + case err := <-apiExitCh: + // API exited unexpectedly + if err != nil { + return err + } + return fmt.Errorf("api server exited unexpectedly") + } } From 6ffe6146f0acb60d42314623dd49d4ba0cedd28e Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 16:31:29 -0500 Subject: [PATCH 20/37] remove comment --- api/handlers.go | 1 - 1 file changed, 1 deletion(-) diff --git a/api/handlers.go b/api/handlers.go index a4de7afa14..b58cd7986c 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -73,7 +73,6 @@ func (a *API) initHandlers() error { // Initialize kURL migration controller if not already set if a.kurlMigrationController == nil { - // Controller creates manager and installation manager internally kurlMigrationController, err := kurlmigration.NewKURLMigrationController( kurlmigration.WithLogger(a.logger), ) From 1180e4a6e673fc23af731d4af01f83587eb8e298 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 24 Nov 2025 18:11:01 -0500 Subject: [PATCH 21/37] fix unit test --- .../managers/kurlmigration/manager_test.go | 56 +++++++++---------- .../store/kurlmigration/store_test.go | 18 +++--- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/api/internal/managers/kurlmigration/manager_test.go b/api/internal/managers/kurlmigration/manager_test.go index b8a21544cf..8c8415c3cd 100644 --- a/api/internal/managers/kurlmigration/manager_test.go +++ b/api/internal/managers/kurlmigration/manager_test.go @@ -60,36 +60,36 @@ func TestMergeConfigs(t *testing.T) { { name: "user config takes precedence", userConfig: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, - DataDirectory: "/user/data", + DataDirectory: "/user/data", + PodCIDR: "10.10.0.0/16", }, kurlConfig: types.LinuxInstallationConfig{ - AdminConsolePort: 9000, - DataDirectory: "/kurl/data", + DataDirectory: "/kurl/data", + PodCIDR: "10.32.0.0/20", }, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", + DataDirectory: "/default/data", + PodCIDR: "10.0.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, - DataDirectory: "/user/data", + DataDirectory: "/user/data", + PodCIDR: "10.10.0.0/16", }, }, { name: "kurl config takes precedence over defaults", userConfig: types.LinuxInstallationConfig{}, kurlConfig: types.LinuxInstallationConfig{ - AdminConsolePort: 9000, - DataDirectory: "/kurl/data", + DataDirectory: "/kurl/data", + ServiceCIDR: "10.96.0.0/12", }, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", + DataDirectory: "/default/data", + ServiceCIDR: "10.1.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 9000, - DataDirectory: "/kurl/data", + DataDirectory: "/kurl/data", + ServiceCIDR: "10.96.0.0/12", }, }, { @@ -97,44 +97,43 @@ func TestMergeConfigs(t *testing.T) { userConfig: types.LinuxInstallationConfig{}, kurlConfig: types.LinuxInstallationConfig{}, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", + DataDirectory: "/default/data", + GlobalCIDR: "10.2.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", + DataDirectory: "/default/data", + GlobalCIDR: "10.2.0.0/16", }, }, { name: "partial user override", userConfig: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, + PodCIDR: "10.10.0.0/16", }, kurlConfig: types.LinuxInstallationConfig{ DataDirectory: "/kurl/data", }, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/default/data", - HTTPProxy: "http://proxy.example.com", + DataDirectory: "/default/data", + HTTPProxy: "http://proxy.example.com", + PodCIDR: "10.0.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, - DataDirectory: "/kurl/data", - HTTPProxy: "http://proxy.example.com", + PodCIDR: "10.10.0.0/16", + DataDirectory: "/kurl/data", + HTTPProxy: "http://proxy.example.com", }, }, { name: "all fields merged correctly", userConfig: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, + PodCIDR: "10.10.0.0/16", }, kurlConfig: types.LinuxInstallationConfig{ DataDirectory: "/kurl/data", NetworkInterface: "eth0", }, defaults: types.LinuxInstallationConfig{ - AdminConsolePort: 30000, DataDirectory: "/default/data", HTTPProxy: "http://proxy.example.com", HTTPSProxy: "https://proxy.example.com", @@ -145,13 +144,12 @@ func TestMergeConfigs(t *testing.T) { GlobalCIDR: "10.2.0.0/16", }, want: types.LinuxInstallationConfig{ - AdminConsolePort: 8080, + PodCIDR: "10.10.0.0/16", DataDirectory: "/kurl/data", HTTPProxy: "http://proxy.example.com", HTTPSProxy: "https://proxy.example.com", NoProxy: "localhost", NetworkInterface: "eth0", - PodCIDR: "10.0.0.0/16", ServiceCIDR: "10.1.0.0/16", GlobalCIDR: "10.2.0.0/16", }, diff --git a/api/internal/store/kurlmigration/store_test.go b/api/internal/store/kurlmigration/store_test.go index c588bf05f8..5d795f93e0 100644 --- a/api/internal/store/kurlmigration/store_test.go +++ b/api/internal/store/kurlmigration/store_test.go @@ -20,8 +20,7 @@ func TestInitializeMigration(t *testing.T) { store := NewMemoryStore() config := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/embedded-cluster", + DataDirectory: "/var/lib/embedded-cluster", } err := store.InitializeMigration("test-migration-id", "copy", config) @@ -40,7 +39,6 @@ func TestInitializeMigration(t *testing.T) { // Verify config retrievedConfig, err := store.GetConfig() assert.NoError(t, err) - assert.Equal(t, config.AdminConsolePort, retrievedConfig.AdminConsolePort) assert.Equal(t, config.DataDirectory, retrievedConfig.DataDirectory) // Verify initial status @@ -145,7 +143,7 @@ func TestSetError(t *testing.T) { func TestStoreOptions(t *testing.T) { config := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, + DataDirectory: "/var/lib/embedded-cluster", } status := types.KURLMigrationStatusResponse{ @@ -173,7 +171,7 @@ func TestStoreOptions(t *testing.T) { retrievedConfig, err := store.GetConfig() assert.NoError(t, err) - assert.Equal(t, config.AdminConsolePort, retrievedConfig.AdminConsolePort) + assert.Equal(t, config.DataDirectory, retrievedConfig.DataDirectory) retrievedStatus, err := store.GetStatus() assert.NoError(t, err) @@ -187,8 +185,8 @@ func TestDeepCopyPreventsConfigMutation(t *testing.T) { store := NewMemoryStore() config := types.LinuxInstallationConfig{ - AdminConsolePort: 30000, - DataDirectory: "/var/lib/ec", + DataDirectory: "/var/lib/ec", + PodCIDR: "10.32.0.0/20", } err := store.InitializeMigration("test-id", "copy", config) @@ -197,18 +195,18 @@ func TestDeepCopyPreventsConfigMutation(t *testing.T) { // Get config and modify it (to verify deep copy prevents mutation) retrievedConfig, err := store.GetConfig() assert.NoError(t, err) - retrievedConfig.AdminConsolePort = 99999 retrievedConfig.DataDirectory = "/tmp/modified" + retrievedConfig.PodCIDR = "192.168.0.0/16" // Verify the local modifications were made - assert.Equal(t, 99999, retrievedConfig.AdminConsolePort) assert.Equal(t, "/tmp/modified", retrievedConfig.DataDirectory) + assert.Equal(t, "192.168.0.0/16", retrievedConfig.PodCIDR) // Verify original config in store is unchanged (proving deep copy works) retrievedConfig2, err := store.GetConfig() assert.NoError(t, err) - assert.Equal(t, 30000, retrievedConfig2.AdminConsolePort) assert.Equal(t, "/var/lib/ec", retrievedConfig2.DataDirectory) + assert.Equal(t, "10.32.0.0/20", retrievedConfig2.PodCIDR) } func TestDeepCopyPreventsStatusMutation(t *testing.T) { From 55dc775f05af3a1c75fb407703d4db7565c2be52 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 12:45:32 -0500 Subject: [PATCH 22/37] address feedback --- .../{migration.go => kurl_migration.go} | 0 api/controllers/kurlmigration/controller.go | 61 ++++++++++--------- .../kurlmigration/controller_test.go | 25 +++++--- api/handlers.go | 17 ++---- .../handlers/kurlmigration/handler.go | 17 +++++- api/types/{migration.go => kurl_migration.go} | 0 cmd/installer/cli/upgrade.go | 4 +- 7 files changed, 68 insertions(+), 56 deletions(-) rename api/client/{migration.go => kurl_migration.go} (100%) rename api/types/{migration.go => kurl_migration.go} (100%) diff --git a/api/client/migration.go b/api/client/kurl_migration.go similarity index 100% rename from api/client/migration.go rename to api/client/kurl_migration.go diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index 96f1472fa3..128496580e 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -8,7 +8,7 @@ import ( "github.com/google/uuid" kurlmigrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/kurlmigration" linuxinstallation "github.com/replicatedhq/embedded-cluster/api/internal/managers/linux/installation" - kurlmigrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" + "github.com/replicatedhq/embedded-cluster/api/internal/store" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" @@ -34,7 +34,7 @@ var _ Controller = (*KURLMigrationController)(nil) // KURLMigrationController implements the Controller interface type KURLMigrationController struct { manager kurlmigrationmanager.Manager - store kurlmigrationstore.Store + store store.Store installationManager linuxinstallation.InstallationManager logger logrus.FieldLogger } @@ -49,8 +49,8 @@ func WithManager(manager kurlmigrationmanager.Manager) ControllerOption { } } -// WithStore sets the migration store -func WithStore(store kurlmigrationstore.Store) ControllerOption { +// WithStore sets the unified store +func WithStore(store store.Store) ControllerOption { return func(c *KURLMigrationController) { c.store = store } @@ -74,7 +74,7 @@ func WithLogger(log logrus.FieldLogger) ControllerOption { // The controller creates its manager and installation manager internally if not provided via options. func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationController, error) { controller := &KURLMigrationController{ - store: kurlmigrationstore.NewMemoryStore(), + store: store.NewMemoryStore(), logger: logger.NewDiscardLogger(), } @@ -86,13 +86,14 @@ func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationControl if controller.installationManager == nil { controller.installationManager = linuxinstallation.NewInstallationManager( linuxinstallation.WithLogger(controller.logger), + linuxinstallation.WithInstallationStore(controller.store.LinuxInstallationStore()), ) } // Create manager internally if not provided via option if controller.manager == nil { controller.manager = kurlmigrationmanager.NewManager( - kurlmigrationmanager.WithStore(controller.store), + kurlmigrationmanager.WithStore(controller.store.MigrationStore()), kurlmigrationmanager.WithLogger(controller.logger), kurlmigrationmanager.WithInstallationManager(controller.installationManager), ) @@ -120,7 +121,7 @@ func (c *KURLMigrationController) GetInstallationConfig(ctx context.Context) (ty } // Get user config from store (will be empty if user hasn't submitted config yet) - userConfig, err := c.store.GetUserConfig() + userConfig, err := c.store.MigrationStore().GetUserConfig() if err != nil { c.logger.WithError(err).Error("get user config") return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get user config: %w", err) @@ -147,7 +148,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf c.logger.WithFields(logrus.Fields{ "transferMode": transferMode, "config": config, - }).Info("starting migration") + }).Info("starting kURL migration") // Validate transfer mode if err := c.manager.ValidateTransferMode(transferMode); err != nil { @@ -156,8 +157,8 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf } // Check if migration already exists - if _, err := c.store.GetMigrationID(); err == nil { - c.logger.Warn("migration already in progress") + if _, err := c.store.MigrationStore().GetMigrationID(); err == nil { + c.logger.Warn("kURL migration already in progress") return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } @@ -182,24 +183,24 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf c.logger.WithField("resolvedConfig", resolvedConfig).Debug("config merged") // Store user-provided config for future reference - if err := c.store.SetUserConfig(config); err != nil { + if err := c.store.MigrationStore().SetUserConfig(config); err != nil { c.logger.WithError(err).Error("store user config") return "", fmt.Errorf("store user config: %w", err) } // Initialize migration in store with resolved config - if err := c.store.InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { + if err := c.store.MigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { c.logger.WithError(err).Error("initialize migration") return "", fmt.Errorf("initialize migration: %w", err) } // Set initial state to NotStarted - if err := c.store.SetState(types.KURLMigrationStateNotStarted); err != nil { + if err := c.store.MigrationStore().SetState(types.KURLMigrationStateNotStarted); err != nil { c.logger.WithError(err).Error("set initial state") return "", fmt.Errorf("set initial state: %w", err) } - c.logger.WithField("migrationID", migrationID).Info("migration initialized, launching background goroutine") + c.logger.WithField("migrationID", migrationID).Info("kURL migration initialized, launching background goroutine") // Launch background goroutine with detached context // We use WithoutCancel to inherit context values (trace IDs, logger fields) @@ -207,7 +208,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf backgroundCtx := context.WithoutCancel(ctx) go func() { if err := c.Run(backgroundCtx); err != nil { - c.logger.WithError(err).Error("background migration failed") + c.logger.WithError(err).Error("background kURL migration failed") } }() @@ -216,12 +217,12 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf // GetKURLMigrationStatus returns current migration status func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { - c.logger.Debug("fetching migration status") + c.logger.Debug("fetching kURL migration status") - status, err := c.store.GetStatus() + status, err := c.store.MigrationStore().GetStatus() if err != nil { if err == types.ErrNoActiveKURLMigration { - c.logger.Warn("no active migration found") + c.logger.Warn("no active kURL migration found") return types.KURLMigrationStatusResponse{}, types.NewNotFoundError(err) } c.logger.WithError(err).Error("get status") @@ -239,7 +240,7 @@ func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (t // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { - c.logger.Info("starting migration orchestration") + c.logger.Info("starting kURL migration orchestration") // Small delay to ensure HTTP response completes before any state changes // This prevents race condition where migration could fail and update state @@ -251,16 +252,16 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Recover from panics if r := recover(); r != nil { finalErr = fmt.Errorf("panic in kurl migration orchestration: %v", r) - c.logger.WithField("panic", r).Error("migration panicked") + c.logger.WithField("panic", r).Error("kURL migration panicked") } // Handle any error by updating state to Failed if finalErr != nil { - if err := c.store.SetState(types.KURLMigrationStateFailed); err != nil { - c.logger.WithError(err).Error("failed to set migration state to failed") + if err := c.store.MigrationStore().SetState(types.KURLMigrationStateFailed); err != nil { + c.logger.WithError(err).Error("failed to set kURL migration state to failed") } - if err := c.store.SetError(finalErr.Error()); err != nil { - c.logger.WithError(err).Error("failed to set migration error message") + if err := c.store.MigrationStore().SetError(finalErr.Error()); err != nil { + c.logger.WithError(err).Error("failed to set kURL migration error message") } } }() @@ -269,7 +270,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // This is a skeleton implementation that will be expanded in that PR // Get current state from store - status, err := c.store.GetStatus() + status, err := c.store.MigrationStore().GetStatus() if err != nil { c.logger.WithError(err).Error("get status") return fmt.Errorf("get status: %w", err) @@ -299,13 +300,13 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.WithField("phase", phase).Info("executing phase (skeleton)") // Set state to InProgress - if err := c.store.SetState(types.KURLMigrationStateInProgress); err != nil { + if err := c.store.MigrationStore().SetState(types.KURLMigrationStateInProgress); err != nil { c.logger.WithError(err).Error("set state to in progress") return fmt.Errorf("set state: %w", err) } // Set current phase - if err := c.store.SetPhase(phase); err != nil { + if err := c.store.MigrationStore().SetPhase(phase); err != nil { c.logger.WithError(err).Error("set phase") return fmt.Errorf("set phase: %w", err) } @@ -321,11 +322,11 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Note: If this fails, we log it but don't return an error because the migration itself succeeded. // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect // since all phases completed successfully. The state update failure is a separate concern. - if err := c.store.SetState(types.KURLMigrationStateCompleted); err != nil { - c.logger.WithError(err).Error("migration completed successfully but failed to update state to Completed") + if err := c.store.MigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { + c.logger.WithError(err).Error("kURL migration completed successfully but failed to update state to Completed") // Don't return error - migration succeeded even if state update failed } else { - c.logger.Info("migration orchestration completed successfully") + c.logger.Info("kURL migration orchestration completed successfully") } return nil diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index e084603485..bcda7c896f 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -6,6 +6,7 @@ import ( "time" migrationmanager "github.com/replicatedhq/embedded-cluster/api/internal/managers/kurlmigration" + "github.com/replicatedhq/embedded-cluster/api/internal/store" migrationstore "github.com/replicatedhq/embedded-cluster/api/internal/store/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/stretchr/testify/assert" @@ -346,8 +347,10 @@ func TestStartMigration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mockManager := &migrationmanager.MockManager{} - mockStore := &migrationstore.MockStore{} - tt.setupMock(mockManager, mockStore) + // Create unified store with empty migration store + mockStore := &store.MockStore{} + // Set up expectations on the unified store's migration store field + tt.setupMock(mockManager, &mockStore.MigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -374,7 +377,7 @@ func TestStartMigration(t *testing.T) { } mockManager.AssertExpectations(t) - mockStore.AssertExpectations(t) + mockStore.MigrationMockStore.AssertExpectations(t) }) } } @@ -427,8 +430,10 @@ func TestGetMigrationStatus(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockStore := &migrationstore.MockStore{} - tt.setupMock(mockStore) + // Create unified store with empty migration store + mockStore := &store.MockStore{} + // Set up expectations on the unified store's migration store field + tt.setupMock(&mockStore.MigrationMockStore) mockManager := &migrationmanager.MockManager{} controller, err := NewKURLMigrationController( @@ -454,7 +459,7 @@ func TestGetMigrationStatus(t *testing.T) { assert.Equal(t, tt.expectedValue, result) } - mockStore.AssertExpectations(t) + mockStore.MigrationMockStore.AssertExpectations(t) }) } } @@ -553,8 +558,10 @@ func TestRun(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mockManager := &migrationmanager.MockManager{} - mockStore := &migrationstore.MockStore{} - tt.setupMock(mockManager, mockStore) + // Create unified store with empty migration store + mockStore := &store.MockStore{} + // Set up expectations on the unified store's migration store field + tt.setupMock(mockManager, &mockStore.MigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -570,7 +577,7 @@ func TestRun(t *testing.T) { assert.NoError(t, err) } - mockStore.AssertExpectations(t) + mockStore.MigrationMockStore.AssertExpectations(t) }) } } diff --git a/api/handlers.go b/api/handlers.go index b58cd7986c..5232704447 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -3,7 +3,6 @@ package api import ( "fmt" - kurlmigration "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" authhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/auth" consolehandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/console" healthhandler "github.com/replicatedhq/embedded-cluster/api/internal/handlers/health" @@ -71,22 +70,14 @@ func (a *API) initHandlers() error { } a.handlers.linux = linuxHandler - // Initialize kURL migration controller if not already set - if a.kurlMigrationController == nil { - kurlMigrationController, err := kurlmigration.NewKURLMigrationController( - kurlmigration.WithLogger(a.logger), - ) - if err != nil { - return fmt.Errorf("create kurl migration controller: %w", err) - } - a.kurlMigrationController = kurlMigrationController - } - // kURL Migration handler (Linux only) - kurlMigrationHandler := kurlmigrationhandler.New( + kurlMigrationHandler, err := kurlmigrationhandler.New( kurlmigrationhandler.WithLogger(a.logger), kurlmigrationhandler.WithController(a.kurlMigrationController), ) + if err != nil { + return fmt.Errorf("new kurl migration handler: %w", err) + } a.handlers.kurlmigration = kurlMigrationHandler } else { // Kubernetes handler diff --git a/api/internal/handlers/kurlmigration/handler.go b/api/internal/handlers/kurlmigration/handler.go index 574a0ff3ae..dc5df0d21e 100644 --- a/api/internal/handlers/kurlmigration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -1,6 +1,7 @@ package kurlmigration import ( + "fmt" "net/http" "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" @@ -28,12 +29,24 @@ func WithController(controller kurlmigration.Controller) Option { } } -func New(opts ...Option) *Handler { +func New(opts ...Option) (*Handler, error) { h := &Handler{} for _, opt := range opts { opt(h) } - return h + + // Create controller internally if not provided via option + if h.controller == nil { + controller, err := kurlmigration.NewKURLMigrationController( + kurlmigration.WithLogger(h.logger), + ) + if err != nil { + return nil, fmt.Errorf("create kurl migration controller: %w", err) + } + h.controller = controller + } + + return h, nil } // GetInstallationConfig handler to get the installation config for migration diff --git a/api/types/migration.go b/api/types/kurl_migration.go similarity index 100% rename from api/types/migration.go rename to api/types/kurl_migration.go diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index af29b00f0c..4234008df6 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -681,7 +681,7 @@ func validateIsReleaseUpgradable(ctx context.Context, upgradeConfig *upgradeConf } // runMigrationAPI starts the API server in migration mode for kURL to EC migration. -// TODO: This is a minimal implementation. Future enhancements needed: +// TODO(sc-130983): This is a minimal implementation. Future enhancements needed: // - Read TLS certificates from kURL cluster // - Add proper error handling and cleanup func runMigrationAPI( @@ -704,7 +704,7 @@ func runMigrationAPI( } pwdHash := []byte(pwdHashStr) - // TODO: Read TLS config from kURL cluster (for now, generate self-signed) + // TODO(sc-130983): Read TLS config from kURL cluster (for now, generate self-signed) cert, certBytes, keyBytes, err := tlsutils.GenerateCertificate("localhost", nil, "default") if err != nil { return fmt.Errorf("failed to generate TLS certificate: %w", err) From 72f4407efd5c66fcaaf3c33dd6fee94e5ec3208c Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 13:11:39 -0500 Subject: [PATCH 23/37] fix naming --- api/controllers/kurlmigration/controller.go | 26 +++++++++---------- .../kurlmigration/controller_test.go | 12 ++++----- api/internal/store/store.go | 20 +++++++------- api/internal/store/store_mock.go | 10 +++---- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index 128496580e..cfd8b2d48a 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -93,7 +93,7 @@ func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationControl // Create manager internally if not provided via option if controller.manager == nil { controller.manager = kurlmigrationmanager.NewManager( - kurlmigrationmanager.WithStore(controller.store.MigrationStore()), + kurlmigrationmanager.WithStore(controller.store.KURLMigrationStore()), kurlmigrationmanager.WithLogger(controller.logger), kurlmigrationmanager.WithInstallationManager(controller.installationManager), ) @@ -121,7 +121,7 @@ func (c *KURLMigrationController) GetInstallationConfig(ctx context.Context) (ty } // Get user config from store (will be empty if user hasn't submitted config yet) - userConfig, err := c.store.MigrationStore().GetUserConfig() + userConfig, err := c.store.KURLMigrationStore().GetUserConfig() if err != nil { c.logger.WithError(err).Error("get user config") return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get user config: %w", err) @@ -157,7 +157,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf } // Check if migration already exists - if _, err := c.store.MigrationStore().GetMigrationID(); err == nil { + if _, err := c.store.KURLMigrationStore().GetMigrationID(); err == nil { c.logger.Warn("kURL migration already in progress") return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } @@ -183,19 +183,19 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf c.logger.WithField("resolvedConfig", resolvedConfig).Debug("config merged") // Store user-provided config for future reference - if err := c.store.MigrationStore().SetUserConfig(config); err != nil { + if err := c.store.KURLMigrationStore().SetUserConfig(config); err != nil { c.logger.WithError(err).Error("store user config") return "", fmt.Errorf("store user config: %w", err) } // Initialize migration in store with resolved config - if err := c.store.MigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { + if err := c.store.KURLMigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { c.logger.WithError(err).Error("initialize migration") return "", fmt.Errorf("initialize migration: %w", err) } // Set initial state to NotStarted - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateNotStarted); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateNotStarted); err != nil { c.logger.WithError(err).Error("set initial state") return "", fmt.Errorf("set initial state: %w", err) } @@ -219,7 +219,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { c.logger.Debug("fetching kURL migration status") - status, err := c.store.MigrationStore().GetStatus() + status, err := c.store.KURLMigrationStore().GetStatus() if err != nil { if err == types.ErrNoActiveKURLMigration { c.logger.Warn("no active kURL migration found") @@ -257,10 +257,10 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Handle any error by updating state to Failed if finalErr != nil { - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateFailed); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateFailed); err != nil { c.logger.WithError(err).Error("failed to set kURL migration state to failed") } - if err := c.store.MigrationStore().SetError(finalErr.Error()); err != nil { + if err := c.store.KURLMigrationStore().SetError(finalErr.Error()); err != nil { c.logger.WithError(err).Error("failed to set kURL migration error message") } } @@ -270,7 +270,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // This is a skeleton implementation that will be expanded in that PR // Get current state from store - status, err := c.store.MigrationStore().GetStatus() + status, err := c.store.KURLMigrationStore().GetStatus() if err != nil { c.logger.WithError(err).Error("get status") return fmt.Errorf("get status: %w", err) @@ -300,13 +300,13 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.WithField("phase", phase).Info("executing phase (skeleton)") // Set state to InProgress - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateInProgress); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateInProgress); err != nil { c.logger.WithError(err).Error("set state to in progress") return fmt.Errorf("set state: %w", err) } // Set current phase - if err := c.store.MigrationStore().SetPhase(phase); err != nil { + if err := c.store.KURLMigrationStore().SetPhase(phase); err != nil { c.logger.WithError(err).Error("set phase") return fmt.Errorf("set phase: %w", err) } @@ -322,7 +322,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Note: If this fails, we log it but don't return an error because the migration itself succeeded. // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect // since all phases completed successfully. The state update failure is a separate concern. - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { c.logger.WithError(err).Error("kURL migration completed successfully but failed to update state to Completed") // Don't return error - migration succeeded even if state update failed } else { diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index bcda7c896f..dfe7596f98 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -350,7 +350,7 @@ func TestStartMigration(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(mockManager, &mockStore.MigrationMockStore) + tt.setupMock(mockManager, &mockStore.KURLMigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -377,7 +377,7 @@ func TestStartMigration(t *testing.T) { } mockManager.AssertExpectations(t) - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } @@ -433,7 +433,7 @@ func TestGetMigrationStatus(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(&mockStore.MigrationMockStore) + tt.setupMock(&mockStore.KURLMigrationMockStore) mockManager := &migrationmanager.MockManager{} controller, err := NewKURLMigrationController( @@ -459,7 +459,7 @@ func TestGetMigrationStatus(t *testing.T) { assert.Equal(t, tt.expectedValue, result) } - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } @@ -561,7 +561,7 @@ func TestRun(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(mockManager, &mockStore.MigrationMockStore) + tt.setupMock(mockManager, &mockStore.KURLMigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -577,7 +577,7 @@ func TestRun(t *testing.T) { assert.NoError(t, err) } - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } diff --git a/api/internal/store/store.go b/api/internal/store/store.go index e926a37e52..9f4a2ef022 100644 --- a/api/internal/store/store.go +++ b/api/internal/store/store.go @@ -47,8 +47,8 @@ type Store interface { // AirgapStore provides access to airgap operations AirgapStore() airgap.Store - // MigrationStore provides access to kURL migration operations - MigrationStore() kurlmigration.Store + // KURLMigrationStore provides access to kURL migration operations + KURLMigrationStore() kurlmigration.Store } // StoreOption is a function that configures a store @@ -117,10 +117,10 @@ func WithAirgapStore(store airgap.Store) StoreOption { } } -// WithMigrationStore sets the kURL migration store -func WithMigrationStore(store kurlmigration.Store) StoreOption { +// WithKURLMigrationStore sets the kURL migration store +func WithKURLMigrationStore(store kurlmigration.Store) StoreOption { return func(s *memoryStore) { - s.migrationStore = store + s.kurlMigrationStore = store } } @@ -138,7 +138,7 @@ type memoryStore struct { appInstallStore appinstall.Store appUpgradeStore appupgrade.Store airgapStore airgap.Store - migrationStore kurlmigration.Store + kurlMigrationStore kurlmigration.Store } // NewMemoryStore creates a new memory store with the given options @@ -189,8 +189,8 @@ func NewMemoryStore(opts ...StoreOption) Store { s.airgapStore = airgap.NewMemoryStore() } - if s.migrationStore == nil { - s.migrationStore = kurlmigration.NewMemoryStore() + if s.kurlMigrationStore == nil { + s.kurlMigrationStore = kurlmigration.NewMemoryStore() } return s @@ -236,6 +236,6 @@ func (s *memoryStore) AirgapStore() airgap.Store { return s.airgapStore } -func (s *memoryStore) MigrationStore() kurlmigration.Store { - return s.migrationStore +func (s *memoryStore) KURLMigrationStore() kurlmigration.Store { + return s.kurlMigrationStore } diff --git a/api/internal/store/store_mock.go b/api/internal/store/store_mock.go index c076a5c5db..da027492c6 100644 --- a/api/internal/store/store_mock.go +++ b/api/internal/store/store_mock.go @@ -29,7 +29,7 @@ type MockStore struct { AppInstallMockStore appinstall.MockStore AppUpgradeMockStore appupgrade.MockStore AirgapMockStore airgap.MockStore - MigrationMockStore kurlmigration.MockStore + KURLMigrationMockStore kurlmigration.MockStore } // LinuxPreflightStore returns the mock linux preflight store @@ -82,9 +82,9 @@ func (m *MockStore) AirgapStore() airgap.Store { return &m.AirgapMockStore } -// MigrationStore returns the mock kURL migration store -func (m *MockStore) MigrationStore() kurlmigration.Store { - return &m.MigrationMockStore +// KURLMigrationStore returns the mock kURL migration store +func (m *MockStore) KURLMigrationStore() kurlmigration.Store { + return &m.KURLMigrationMockStore } // AssertExpectations asserts expectations on all embedded mock stores @@ -99,5 +99,5 @@ func (m *MockStore) AssertExpectations(t *testing.T) { m.AppInstallMockStore.AssertExpectations(t) m.AppUpgradeMockStore.AssertExpectations(t) m.AirgapMockStore.AssertExpectations(t) - m.MigrationMockStore.AssertExpectations(t) + m.KURLMigrationMockStore.AssertExpectations(t) } From 7df308f342c955228628b94d622334ca5b8cf9f2 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 13:42:30 -0500 Subject: [PATCH 24/37] fix lint --- api/controllers/kurlmigration/controller.go | 26 ++++++++-------- .../kurlmigration/controller_test.go | 12 ++++---- api/internal/store/store.go | 30 +++++++++---------- api/internal/store/store_mock.go | 10 +++---- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index 128496580e..cfd8b2d48a 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -93,7 +93,7 @@ func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationControl // Create manager internally if not provided via option if controller.manager == nil { controller.manager = kurlmigrationmanager.NewManager( - kurlmigrationmanager.WithStore(controller.store.MigrationStore()), + kurlmigrationmanager.WithStore(controller.store.KURLMigrationStore()), kurlmigrationmanager.WithLogger(controller.logger), kurlmigrationmanager.WithInstallationManager(controller.installationManager), ) @@ -121,7 +121,7 @@ func (c *KURLMigrationController) GetInstallationConfig(ctx context.Context) (ty } // Get user config from store (will be empty if user hasn't submitted config yet) - userConfig, err := c.store.MigrationStore().GetUserConfig() + userConfig, err := c.store.KURLMigrationStore().GetUserConfig() if err != nil { c.logger.WithError(err).Error("get user config") return types.LinuxInstallationConfigResponse{}, fmt.Errorf("get user config: %w", err) @@ -157,7 +157,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf } // Check if migration already exists - if _, err := c.store.MigrationStore().GetMigrationID(); err == nil { + if _, err := c.store.KURLMigrationStore().GetMigrationID(); err == nil { c.logger.Warn("kURL migration already in progress") return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } @@ -183,19 +183,19 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf c.logger.WithField("resolvedConfig", resolvedConfig).Debug("config merged") // Store user-provided config for future reference - if err := c.store.MigrationStore().SetUserConfig(config); err != nil { + if err := c.store.KURLMigrationStore().SetUserConfig(config); err != nil { c.logger.WithError(err).Error("store user config") return "", fmt.Errorf("store user config: %w", err) } // Initialize migration in store with resolved config - if err := c.store.MigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { + if err := c.store.KURLMigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { c.logger.WithError(err).Error("initialize migration") return "", fmt.Errorf("initialize migration: %w", err) } // Set initial state to NotStarted - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateNotStarted); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateNotStarted); err != nil { c.logger.WithError(err).Error("set initial state") return "", fmt.Errorf("set initial state: %w", err) } @@ -219,7 +219,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { c.logger.Debug("fetching kURL migration status") - status, err := c.store.MigrationStore().GetStatus() + status, err := c.store.KURLMigrationStore().GetStatus() if err != nil { if err == types.ErrNoActiveKURLMigration { c.logger.Warn("no active kURL migration found") @@ -257,10 +257,10 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Handle any error by updating state to Failed if finalErr != nil { - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateFailed); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateFailed); err != nil { c.logger.WithError(err).Error("failed to set kURL migration state to failed") } - if err := c.store.MigrationStore().SetError(finalErr.Error()); err != nil { + if err := c.store.KURLMigrationStore().SetError(finalErr.Error()); err != nil { c.logger.WithError(err).Error("failed to set kURL migration error message") } } @@ -270,7 +270,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // This is a skeleton implementation that will be expanded in that PR // Get current state from store - status, err := c.store.MigrationStore().GetStatus() + status, err := c.store.KURLMigrationStore().GetStatus() if err != nil { c.logger.WithError(err).Error("get status") return fmt.Errorf("get status: %w", err) @@ -300,13 +300,13 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.WithField("phase", phase).Info("executing phase (skeleton)") // Set state to InProgress - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateInProgress); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateInProgress); err != nil { c.logger.WithError(err).Error("set state to in progress") return fmt.Errorf("set state: %w", err) } // Set current phase - if err := c.store.MigrationStore().SetPhase(phase); err != nil { + if err := c.store.KURLMigrationStore().SetPhase(phase); err != nil { c.logger.WithError(err).Error("set phase") return fmt.Errorf("set phase: %w", err) } @@ -322,7 +322,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // Note: If this fails, we log it but don't return an error because the migration itself succeeded. // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect // since all phases completed successfully. The state update failure is a separate concern. - if err := c.store.MigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { + if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { c.logger.WithError(err).Error("kURL migration completed successfully but failed to update state to Completed") // Don't return error - migration succeeded even if state update failed } else { diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index bcda7c896f..dfe7596f98 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -350,7 +350,7 @@ func TestStartMigration(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(mockManager, &mockStore.MigrationMockStore) + tt.setupMock(mockManager, &mockStore.KURLMigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -377,7 +377,7 @@ func TestStartMigration(t *testing.T) { } mockManager.AssertExpectations(t) - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } @@ -433,7 +433,7 @@ func TestGetMigrationStatus(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(&mockStore.MigrationMockStore) + tt.setupMock(&mockStore.KURLMigrationMockStore) mockManager := &migrationmanager.MockManager{} controller, err := NewKURLMigrationController( @@ -459,7 +459,7 @@ func TestGetMigrationStatus(t *testing.T) { assert.Equal(t, tt.expectedValue, result) } - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } @@ -561,7 +561,7 @@ func TestRun(t *testing.T) { // Create unified store with empty migration store mockStore := &store.MockStore{} // Set up expectations on the unified store's migration store field - tt.setupMock(mockManager, &mockStore.MigrationMockStore) + tt.setupMock(mockManager, &mockStore.KURLMigrationMockStore) controller, err := NewKURLMigrationController( WithManager(mockManager), @@ -577,7 +577,7 @@ func TestRun(t *testing.T) { assert.NoError(t, err) } - mockStore.MigrationMockStore.AssertExpectations(t) + mockStore.KURLMigrationMockStore.AssertExpectations(t) }) } } diff --git a/api/internal/store/store.go b/api/internal/store/store.go index e926a37e52..299790f336 100644 --- a/api/internal/store/store.go +++ b/api/internal/store/store.go @@ -47,8 +47,8 @@ type Store interface { // AirgapStore provides access to airgap operations AirgapStore() airgap.Store - // MigrationStore provides access to kURL migration operations - MigrationStore() kurlmigration.Store + // KURLMigrationStore provides access to kURL migration operations + KURLMigrationStore() kurlmigration.Store } // StoreOption is a function that configures a store @@ -117,10 +117,10 @@ func WithAirgapStore(store airgap.Store) StoreOption { } } -// WithMigrationStore sets the kURL migration store -func WithMigrationStore(store kurlmigration.Store) StoreOption { +// WithKURLMigrationStore sets the kURL migration store +func WithKURLMigrationStore(store kurlmigration.Store) StoreOption { return func(s *memoryStore) { - s.migrationStore = store + s.kurlMigrationStore = store } } @@ -133,12 +133,12 @@ type memoryStore struct { kubernetesInstallationStore kubernetesinstallation.Store kubernetesInfraStore infra.Store - appConfigStore appconfig.Store - appPreflightStore apppreflight.Store - appInstallStore appinstall.Store - appUpgradeStore appupgrade.Store - airgapStore airgap.Store - migrationStore kurlmigration.Store + appConfigStore appconfig.Store + appPreflightStore apppreflight.Store + appInstallStore appinstall.Store + appUpgradeStore appupgrade.Store + airgapStore airgap.Store + kurlMigrationStore kurlmigration.Store } // NewMemoryStore creates a new memory store with the given options @@ -189,8 +189,8 @@ func NewMemoryStore(opts ...StoreOption) Store { s.airgapStore = airgap.NewMemoryStore() } - if s.migrationStore == nil { - s.migrationStore = kurlmigration.NewMemoryStore() + if s.kurlMigrationStore == nil { + s.kurlMigrationStore = kurlmigration.NewMemoryStore() } return s @@ -236,6 +236,6 @@ func (s *memoryStore) AirgapStore() airgap.Store { return s.airgapStore } -func (s *memoryStore) MigrationStore() kurlmigration.Store { - return s.migrationStore +func (s *memoryStore) KURLMigrationStore() kurlmigration.Store { + return s.kurlMigrationStore } diff --git a/api/internal/store/store_mock.go b/api/internal/store/store_mock.go index c076a5c5db..da027492c6 100644 --- a/api/internal/store/store_mock.go +++ b/api/internal/store/store_mock.go @@ -29,7 +29,7 @@ type MockStore struct { AppInstallMockStore appinstall.MockStore AppUpgradeMockStore appupgrade.MockStore AirgapMockStore airgap.MockStore - MigrationMockStore kurlmigration.MockStore + KURLMigrationMockStore kurlmigration.MockStore } // LinuxPreflightStore returns the mock linux preflight store @@ -82,9 +82,9 @@ func (m *MockStore) AirgapStore() airgap.Store { return &m.AirgapMockStore } -// MigrationStore returns the mock kURL migration store -func (m *MockStore) MigrationStore() kurlmigration.Store { - return &m.MigrationMockStore +// KURLMigrationStore returns the mock kURL migration store +func (m *MockStore) KURLMigrationStore() kurlmigration.Store { + return &m.KURLMigrationMockStore } // AssertExpectations asserts expectations on all embedded mock stores @@ -99,5 +99,5 @@ func (m *MockStore) AssertExpectations(t *testing.T) { m.AppInstallMockStore.AssertExpectations(t) m.AppUpgradeMockStore.AssertExpectations(t) m.AirgapMockStore.AssertExpectations(t) - m.MigrationMockStore.AssertExpectations(t) + m.KURLMigrationMockStore.AssertExpectations(t) } From 4ce450f466d8ff781ee1c3a4acbea52396243f14 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 14:17:31 -0500 Subject: [PATCH 25/37] add missing kURL prefixes to variables and function names --- api/routes.go | 14 +++++++------- cmd/installer/cli/upgrade.go | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/api/routes.go b/api/routes.go index d6926f44ef..c10189cf51 100644 --- a/api/routes.go +++ b/api/routes.go @@ -45,8 +45,8 @@ func (a *API) RegisterRoutes(router *mux.Router) { func (a *API) registerLinuxRoutes(router *mux.Router) { linuxRouter := router.PathPrefix("/linux").Subrouter() - // Migration routes (not mode-specific) - a.registerMigrationRoutes(linuxRouter) + // kURL Migration routes (not mode-specific) + a.registerKURLMigrationRoutes(linuxRouter) if a.cfg.Mode == types.ModeInstall { installRouter := linuxRouter.PathPrefix("/install").Subrouter() @@ -136,9 +136,9 @@ func (a *API) registerConsoleRoutes(router *mux.Router) { consoleRouter.HandleFunc("/available-network-interfaces", a.handlers.console.GetListAvailableNetworkInterfaces).Methods("GET") } -func (a *API) registerMigrationRoutes(router *mux.Router) { - migrationRouter := router.PathPrefix("/kurl-migration").Subrouter() - migrationRouter.HandleFunc("/config", a.handlers.kurlmigration.GetInstallationConfig).Methods("GET") - migrationRouter.HandleFunc("/start", a.handlers.kurlmigration.PostStartMigration).Methods("POST") - migrationRouter.HandleFunc("/status", a.handlers.kurlmigration.GetMigrationStatus).Methods("GET") +func (a *API) registerKURLMigrationRoutes(router *mux.Router) { + kurlMigrationRouter := router.PathPrefix("/kurl-migration").Subrouter() + kurlMigrationRouter.HandleFunc("/config", a.handlers.kurlmigration.GetInstallationConfig).Methods("GET") + kurlMigrationRouter.HandleFunc("/start", a.handlers.kurlmigration.PostStartMigration).Methods("POST") + kurlMigrationRouter.HandleFunc("/status", a.handlers.kurlmigration.GetMigrationStatus).Methods("GET") } diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 4234008df6..948069e35c 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -100,12 +100,12 @@ func UpgradeCmd(ctx context.Context, appSlug, appTitle string) *cobra.Command { _ = syscall.Umask(0o022) // Check if this is a kURL cluster that needs migration to Embedded Cluster. - migrationNeeded, err := detectKurlMigration(ctx) + kurlMigrationNeeded, err := detectKurlMigration(ctx) if err != nil { return fmt.Errorf("failed to detect migration scenario: %w", err) } - if migrationNeeded { + if kurlMigrationNeeded { logrus.Info("Preparing to upgrade from kURL to Embedded Cluster...") logrus.Info("") From 9c442e7e01a3113181224794e83dfeea2e65e4f8 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 14:53:25 -0500 Subject: [PATCH 26/37] rename runMigrationAPI to runKURLMigrationAPI --- cmd/installer/cli/upgrade.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 948069e35c..850fd87863 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -110,7 +110,7 @@ func UpgradeCmd(ctx context.Context, appSlug, appTitle string) *cobra.Command { logrus.Info("") // Start the API in migration mode - if err := runMigrationAPI(ctx, flags, appTitle); err != nil { + if err := runKURLMigrationAPI(ctx, flags, appTitle); err != nil { return err } @@ -680,11 +680,11 @@ func validateIsReleaseUpgradable(ctx context.Context, upgradeConfig *upgradeConf return nil } -// runMigrationAPI starts the API server in migration mode for kURL to EC migration. +// runKURLMigrationAPI starts the API server in migration mode for kURL to EC migration. // TODO(sc-130983): This is a minimal implementation. Future enhancements needed: // - Read TLS certificates from kURL cluster // - Add proper error handling and cleanup -func runMigrationAPI( +func runKURLMigrationAPI( ctx context.Context, flags UpgradeCmdFlags, appTitle string, ) (finalErr error) { // Get kURL cluster config to read password hash From 1d3bda0c1da0d12efd51f1c1977cdd2659bed989 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 16:40:08 -0500 Subject: [PATCH 27/37] fix naming comprehensively --- api/api.go | 4 +-- api/client/kurl_migration.go | 2 +- api/controllers/kurlmigration/controller.go | 24 ++++++------- .../kurlmigration/controller_test.go | 10 +++--- api/docs/docs.go | 4 +-- api/docs/swagger.json | 4 +-- api/docs/swagger.yaml | 35 ++++++++++--------- .../handlers/kurlmigration/handler.go | 28 +++++++-------- .../managers/kurlmigration/manager.go | 4 +-- api/internal/store/kurlmigration/store.go | 18 +++++----- .../store/kurlmigration/store_test.go | 10 +++--- api/types/kurl_migration.go | 22 ++++++------ cmd/installer/cli/upgrade.go | 10 +++--- 13 files changed, 88 insertions(+), 87 deletions(-) diff --git a/api/api.go b/api/api.go index 7de06f01f3..cf2351041c 100644 --- a/api/api.go +++ b/api/api.go @@ -107,8 +107,8 @@ func WithKubernetesUpgradeController(kubernetesUpgradeController kubernetesupgra } } -// WithMigrationController configures the migration controller for the API. -func WithMigrationController(kurlMigrationController kurlmigration.Controller) Option { +// WithKURLMigrationController configures the kURL migration controller for the API. +func WithKURLMigrationController(kurlMigrationController kurlmigration.Controller) Option { return func(a *API) { a.kurlMigrationController = kurlMigrationController } diff --git a/api/client/kurl_migration.go b/api/client/kurl_migration.go index d7b58db85d..406de99294 100644 --- a/api/client/kurl_migration.go +++ b/api/client/kurl_migration.go @@ -73,7 +73,7 @@ func (c *client) StartKURLMigration(ctx context.Context, transferMode string, co return result, nil } -// GetKURLMigrationStatus returns the current status of the migration. +// GetKURLMigrationStatus returns the current status of the kURL migration. func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/kurl-migration/status", c.apiURL), nil) if err != nil { diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index cfd8b2d48a..f3dc613a9a 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -22,7 +22,7 @@ type Controller interface { // StartKURLMigration validates config, generates UUID, initializes state, launches background goroutine StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) - // GetKURLMigrationStatus returns current migration status + // GetKURLMigrationStatus returns current kURL migration status GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) @@ -42,7 +42,7 @@ type KURLMigrationController struct { // ControllerOption is a functional option for configuring the KURLMigrationController type ControllerOption func(*KURLMigrationController) -// WithManager sets the migration manager +// WithManager sets the kURL migration manager func WithManager(manager kurlmigrationmanager.Manager) ControllerOption { return func(c *KURLMigrationController) { c.manager = manager @@ -156,13 +156,13 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return "", types.NewBadRequestError(err) } - // Check if migration already exists + // Check if kURL migration already exists if _, err := c.store.KURLMigrationStore().GetMigrationID(); err == nil { c.logger.Warn("kURL migration already in progress") return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } - // Generate UUID for migration + // Generate UUID for kURL migration migrationID := uuid.New().String() c.logger.WithField("migrationID", migrationID).Debug("generated migration id") @@ -188,10 +188,10 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return "", fmt.Errorf("store user config: %w", err) } - // Initialize migration in store with resolved config + // Initialize kURL migration in store with resolved config if err := c.store.KURLMigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { - c.logger.WithError(err).Error("initialize migration") - return "", fmt.Errorf("initialize migration: %w", err) + c.logger.WithError(err).Error("initialize kURL migration") + return "", fmt.Errorf("initialize kURL migration: %w", err) } // Set initial state to NotStarted @@ -215,7 +215,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return migrationID, nil } -// GetKURLMigrationStatus returns current migration status +// GetKURLMigrationStatus returns current kURL migration status func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { c.logger.Debug("fetching kURL migration status") @@ -247,7 +247,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // before the client receives the success response with migrationID time.Sleep(100 * time.Millisecond) - // Defer handles all error cases by updating migration state + // Defer handles all error cases by updating kURL migration state defer func() { // Recover from panics if r := recover(); r != nil { @@ -279,7 +279,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.WithFields(logrus.Fields{ "state": status.State, "phase": status.Phase, - }).Debug("current migration state") + }).Debug("current kURL migration state") // If InProgress, resume from current phase if status.State == types.KURLMigrationStateInProgress { @@ -319,8 +319,8 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { } // Set state to Completed - // Note: If this fails, we log it but don't return an error because the migration itself succeeded. - // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect + // Note: If this fails, we log it but don't return an error because the kURL migration itself succeeded. + // Returning an error here would cause the defer to mark the kURL migration as Failed, which is incorrect // since all phases completed successfully. The state update failure is a separate concern. if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { c.logger.WithError(err).Error("kURL migration completed successfully but failed to update state to Completed") diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index dfe7596f98..2b8e82bf02 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -202,7 +202,7 @@ func TestStartMigration(t *testing.T) { s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), s.On("SetState", types.KURLMigrationStateFailed).Return(nil), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -244,7 +244,7 @@ func TestStartMigration(t *testing.T) { s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), s.On("SetState", types.KURLMigrationStateFailed).Return(nil), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -254,7 +254,7 @@ func TestStartMigration(t *testing.T) { }, }, { - name: "migration already started (409 error)", + name: "kURL migration already started (409 error)", transferMode: types.TransferModeCopy, config: types.LinuxInstallationConfig{}, setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { @@ -270,7 +270,7 @@ func TestStartMigration(t *testing.T) { var apiErr *types.APIError require.True(t, errors.As(err, &apiErr)) assert.Equal(t, 409, apiErr.StatusCode) - assert.Contains(t, err.Error(), "migration already started") + assert.Contains(t, err.Error(), "kURL migration already started") }, }, { @@ -312,7 +312,7 @@ func TestStartMigration(t *testing.T) { validateResult: func(t *testing.T, migrationID string, err error) { assert.Error(t, err) assert.Empty(t, migrationID) - assert.Contains(t, err.Error(), "initialize migration") + assert.Contains(t, err.Error(), "initialize kURL migration") }, }, { diff --git a/api/docs/docs.go b/api/docs/docs.go index 214a53f3ae..994414805b 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the kURL migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the kURL migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a kURL migration","properties":{"error":{"description":"Error contains the error message if the kURL migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a kURL migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the kURL migration status","example":"kURL migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during kURL migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getKURLMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for kURL migration","tags":["kurl-migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start kURL Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["kurl-migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the kURL migration","operationId":"getKURLMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the kURL migration","tags":["kurl-migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 7c21d0f75d..0419bb7b7c 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the kURL migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the kURL migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a kURL migration","properties":{"error":{"description":"Error contains the error message if the kURL migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a kURL migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the kURL migration status","example":"kURL migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during kURL migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getKURLMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for kURL migration","tags":["kurl-migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start kURL Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["kurl-migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the kURL migration","operationId":"getKURLMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the kURL migration","tags":["kurl-migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 60b2d593ae..26d7c3957b 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -976,7 +976,7 @@ components: - titles type: object types.KURLMigrationPhase: - description: Phase is the current phase of the migration process + description: Phase is the current phase of the kURL migration process enum: - Discovery - Preparation @@ -992,7 +992,7 @@ components: - KURLMigrationPhaseDataTransfer - KURLMigrationPhaseCompleted types.KURLMigrationState: - description: State is the current state of the migration + description: State is the current state of the kURL migration enum: - NotStarted - InProgress @@ -1006,10 +1006,10 @@ components: - KURLMigrationStateCompleted - KURLMigrationStateFailed types.KURLMigrationStatusResponse: - description: Current status and progress of a migration + description: Current status and progress of a kURL migration properties: error: - description: Error contains the error message if the migration failed + description: Error contains the error message if the kURL migration failed example: "" type: string message: @@ -1157,11 +1157,11 @@ components: - transferMode type: object types.StartKURLMigrationResponse: - description: Response returned when a migration is successfully started + description: Response returned when a kURL migration is successfully started properties: message: - description: Message is a user-facing message about the migration status - example: Migration started successfully + description: Message is a user-facing message about the kURL migration status + example: kURL migration started successfully type: string migrationId: description: MigrationID is the unique identifier for this migration @@ -1205,7 +1205,8 @@ components: - values type: object types.TransferMode: - description: TransferMode specifies whether to copy or move data during migration + description: TransferMode specifies whether to copy or move data during kURL + migration enum: - copy - move @@ -2308,7 +2309,7 @@ paths: get: description: Get the installation config extracted from kURL merged with EC defaults - operationId: getMigrationInstallationConfig + operationId: getKURLMigrationInstallationConfig responses: "200": content: @@ -2318,9 +2319,9 @@ paths: description: OK security: - bearerauth: [] - summary: Get the installation config for migration + summary: Get the installation config for kURL migration tags: - - migration + - kurl-migration /linux/kurl-migration/start: post: description: Start a migration from kURL to Embedded Cluster with the provided @@ -2331,7 +2332,7 @@ paths: application/json: schema: $ref: '#/components/schemas/types.StartKURLMigrationRequest' - description: Start Migration Request + description: Start kURL Migration Request required: true responses: "200": @@ -2356,11 +2357,11 @@ paths: - bearerauth: [] summary: Start a migration from kURL to Embedded Cluster tags: - - migration + - kurl-migration /linux/kurl-migration/status: get: - description: Get the current status and progress of the migration - operationId: getMigrationStatus + description: Get the current status and progress of the kURL migration + operationId: getKURLMigrationStatus responses: "200": content: @@ -2376,9 +2377,9 @@ paths: description: Not Found security: - bearerauth: [] - summary: Get the status of the migration + summary: Get the status of the kURL migration tags: - - migration + - kurl-migration /linux/upgrade/airgap/process: post: description: Process the airgap bundle for upgrade diff --git a/api/internal/handlers/kurlmigration/handler.go b/api/internal/handlers/kurlmigration/handler.go index dc5df0d21e..d521114ca1 100644 --- a/api/internal/handlers/kurlmigration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -49,12 +49,12 @@ func New(opts ...Option) (*Handler, error) { return h, nil } -// GetInstallationConfig handler to get the installation config for migration +// GetInstallationConfig handler to get the installation config for kURL migration // -// @ID getMigrationInstallationConfig -// @Summary Get the installation config for migration +// @ID getKURLMigrationInstallationConfig +// @Summary Get the installation config for kURL migration // @Description Get the installation config extracted from kURL merged with EC defaults -// @Tags migration +// @Tags kurl-migration // @Security bearerauth // @Produce json // @Success 200 {object} types.LinuxInstallationConfigResponse @@ -75,11 +75,11 @@ func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) // @ID postStartMigration // @Summary Start a migration from kURL to Embedded Cluster // @Description Start a migration from kURL to Embedded Cluster with the provided configuration -// @Tags migration +// @Tags kurl-migration // @Security bearerauth // @Accept json // @Produce json -// @Param request body types.StartKURLMigrationRequest true "Start Migration Request" +// @Param request body types.StartKURLMigrationRequest true "Start kURL Migration Request" // @Success 200 {object} types.StartKURLMigrationResponse // @Failure 400 {object} types.APIError // @Failure 409 {object} types.APIError @@ -103,25 +103,25 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { migrationID, err := h.controller.StartKURLMigration(r.Context(), request.TransferMode, config) if err != nil { - utils.LogError(r, err, h.logger, "failed to start migration") + utils.LogError(r, err, h.logger, "failed to start kURL migration") utils.JSONError(w, r, err, h.logger) return } response := types.StartKURLMigrationResponse{ MigrationID: migrationID, - Message: "migration started successfully", + Message: "kURL migration started successfully", } utils.JSON(w, r, http.StatusOK, response, h.logger) } -// GetMigrationStatus handler to get the status of the migration +// GetMigrationStatus handler to get the status of the kURL migration // -// @ID getMigrationStatus -// @Summary Get the status of the migration -// @Description Get the current status and progress of the migration -// @Tags migration +// @ID getKURLMigrationStatus +// @Summary Get the status of the kURL migration +// @Description Get the current status and progress of the kURL migration +// @Tags kurl-migration // @Security bearerauth // @Produce json // @Success 200 {object} types.KURLMigrationStatusResponse @@ -130,7 +130,7 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { status, err := h.controller.GetKURLMigrationStatus(r.Context()) if err != nil { - utils.LogError(r, err, h.logger, "failed to get migration status") + utils.LogError(r, err, h.logger, "failed to get kURL migration status") utils.JSONError(w, r, err, h.logger) return } diff --git a/api/internal/managers/kurlmigration/manager.go b/api/internal/managers/kurlmigration/manager.go index 3fa4ca10d1..4a54291592 100644 --- a/api/internal/managers/kurlmigration/manager.go +++ b/api/internal/managers/kurlmigration/manager.go @@ -27,7 +27,7 @@ type Manager interface { // ValidateTransferMode validates the transfer mode is "copy" or "move" ValidateTransferMode(mode types.TransferMode) error - // ExecutePhase executes a migration phase + // ExecutePhase executes a kURL migration phase ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error } @@ -177,7 +177,7 @@ func (m *kurlMigrationManager) ValidateTransferMode(mode types.TransferMode) err } } -// ExecutePhase executes a migration phase +// ExecutePhase executes a kURL migration phase func (m *kurlMigrationManager) ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error { // TODO(sc-130983): Implement phase execution // This will handle: diff --git a/api/internal/store/kurlmigration/store.go b/api/internal/store/kurlmigration/store.go index 2a11c4f51a..8e5f2f9130 100644 --- a/api/internal/store/kurlmigration/store.go +++ b/api/internal/store/kurlmigration/store.go @@ -10,21 +10,21 @@ import ( var _ Store = &memoryStore{} -// Store provides methods for storing and retrieving migration state +// Store provides methods for storing and retrieving kURL migration state type Store interface { - // InitializeMigration sets up a new migration with ID, transfer mode, and config + // InitializeMigration sets up a new kURL migration with ID, transfer mode, and config InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error - // GetMigrationID returns the current migration ID, or error if none exists + // GetMigrationID returns the current kURL migration ID, or error if none exists GetMigrationID() (string, error) - // GetStatus returns the current migration status + // GetStatus returns the current kURL migration status GetStatus() (types.KURLMigrationStatusResponse, error) - // SetState updates the migration state + // SetState updates the kURL migration state SetState(state types.KURLMigrationState) error - // SetPhase updates the migration phase + // SetPhase updates the kURL migration phase SetPhase(phase types.KURLMigrationPhase) error // SetMessage updates the status message @@ -62,7 +62,7 @@ type memoryStore struct { type StoreOption func(*memoryStore) -// WithMigrationID sets the migration ID +// WithMigrationID sets the kURL migration ID func WithMigrationID(id string) StoreOption { return func(s *memoryStore) { s.migrationID = id @@ -84,7 +84,7 @@ func WithConfig(config types.LinuxInstallationConfig) StoreOption { } } -// WithStatus sets the migration status +// WithStatus sets the kURL migration status func WithStatus(status types.KURLMigrationStatusResponse) StoreOption { return func(s *memoryStore) { s.status = status @@ -252,7 +252,7 @@ func (s *memoryStore) GetUserConfig() (types.LinuxInstallationConfig, error) { s.mu.RLock() defer s.mu.RUnlock() - // Return user config even if migration not initialized (for GET /config endpoint) + // Return user config even if kURL migration not initialized (for GET /config endpoint) // If not initialized, userConfig will be zero-value (empty) var config types.LinuxInstallationConfig if err := deepcopy.Copy(&config, &s.userConfig); err != nil { diff --git a/api/internal/store/kurlmigration/store_test.go b/api/internal/store/kurlmigration/store_test.go index 5d795f93e0..b606dda0dd 100644 --- a/api/internal/store/kurlmigration/store_test.go +++ b/api/internal/store/kurlmigration/store_test.go @@ -11,7 +11,7 @@ func TestNewMemoryStore(t *testing.T) { store := NewMemoryStore() assert.NotNil(t, store) - // Should return error when no migration is initialized + // Should return error when no kURL migration is initialized _, err := store.GetMigrationID() assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) } @@ -67,7 +67,7 @@ func TestInitializeMigrationTwice(t *testing.T) { func TestSetState(t *testing.T) { store := NewMemoryStore() - // Should return error when no migration is initialized + // Should return error when no kURL migration is initialized err := store.SetState(types.KURLMigrationStateInProgress) assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) @@ -133,12 +133,12 @@ func TestSetError(t *testing.T) { err := store.InitializeMigration("test-id", "copy", config) assert.NoError(t, err) - err = store.SetError("migration failed") + err = store.SetError("kURL migration failed") assert.NoError(t, err) status, err := store.GetStatus() assert.NoError(t, err) - assert.Equal(t, "migration failed", status.Error) + assert.Equal(t, "kURL migration failed", status.Error) } func TestStoreOptions(t *testing.T) { @@ -160,7 +160,7 @@ func TestStoreOptions(t *testing.T) { WithStatus(status), ) - // Verify migration is pre-initialized + // Verify kURL migration is pre-initialized id, err := store.GetMigrationID() assert.NoError(t, err) assert.Equal(t, "pre-initialized", id) diff --git a/api/types/kurl_migration.go b/api/types/kurl_migration.go index 8311f6e3aa..c07a0398f1 100644 --- a/api/types/kurl_migration.go +++ b/api/types/kurl_migration.go @@ -7,10 +7,10 @@ import ( // kURL Migration error constants var ( - ErrNoActiveKURLMigration = errors.New("no active migration") - ErrKURLMigrationAlreadyStarted = errors.New("migration already started") + ErrNoActiveKURLMigration = errors.New("no active kURL migration") + ErrKURLMigrationAlreadyStarted = errors.New("kURL migration already started") ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") - ErrKURLMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") + ErrKURLMigrationPhaseNotImplemented = errors.New("kURL migration phase execution not yet implemented") ) // NewNotFoundError creates a 404 API error @@ -54,32 +54,32 @@ const ( // StartKURLMigrationRequest represents the request to start a kURL migration // @Description Request body for starting a migration from kURL to Embedded Cluster type StartKURLMigrationRequest struct { - // TransferMode specifies whether to copy or move data during migration + // TransferMode specifies whether to copy or move data during kURL migration TransferMode TransferMode `json:"transferMode" enums:"copy,move" example:"copy"` // Config contains optional installation configuration that will be merged with defaults Config *LinuxInstallationConfig `json:"config,omitempty" validate:"optional"` } // StartKURLMigrationResponse represents the response when starting a kURL migration -// @Description Response returned when a migration is successfully started +// @Description Response returned when a kURL migration is successfully started type StartKURLMigrationResponse struct { // MigrationID is the unique identifier for this migration MigrationID string `json:"migrationId" example:"550e8400-e29b-41d4-a716-446655440000"` - // Message is a user-facing message about the migration status - Message string `json:"message" example:"Migration started successfully"` + // Message is a user-facing message about the kURL migration status + Message string `json:"message" example:"kURL migration started successfully"` } // KURLMigrationStatusResponse represents the status of a kURL migration -// @Description Current status and progress of a migration +// @Description Current status and progress of a kURL migration type KURLMigrationStatusResponse struct { - // State is the current state of the migration + // State is the current state of the kURL migration State KURLMigrationState `json:"state" enums:"NotStarted,InProgress,Completed,Failed" example:"InProgress"` - // Phase is the current phase of the migration process + // Phase is the current phase of the kURL migration process Phase KURLMigrationPhase `json:"phase" enums:"Discovery,Preparation,ECInstall,DataTransfer,Completed" example:"Discovery"` // Message is a user-facing message describing the current status Message string `json:"message" example:"Discovering kURL cluster configuration"` // Progress is the completion percentage (0-100) Progress int `json:"progress" example:"25"` - // Error contains the error message if the migration failed + // Error contains the error message if the kURL migration failed Error string `json:"error,omitempty" validate:"optional" example:""` } diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 850fd87863..3d774791b8 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -102,14 +102,14 @@ func UpgradeCmd(ctx context.Context, appSlug, appTitle string) *cobra.Command { // Check if this is a kURL cluster that needs migration to Embedded Cluster. kurlMigrationNeeded, err := detectKurlMigration(ctx) if err != nil { - return fmt.Errorf("failed to detect migration scenario: %w", err) + return fmt.Errorf("failed to detect kURL migration scenario: %w", err) } if kurlMigrationNeeded { logrus.Info("Preparing to upgrade from kURL to Embedded Cluster...") logrus.Info("") - // Start the API in migration mode + // Start the API in kURL migration mode if err := runKURLMigrationAPI(ctx, flags, appTitle); err != nil { return err } @@ -752,10 +752,10 @@ func runKURLMigrationAPI( return fmt.Errorf("failed to get size of embedded files: %w", err) } - // Create a minimal runtime config for migration mode + // Create a minimal runtime config for kURL migration mode rc := runtimeconfig.New(nil) - // Prepare API config for migration mode + // Prepare API config for kURL migration mode apiConfig := apiOptions{ APIConfig: apitypes.APIConfig{ InstallTarget: apitypes.InstallTarget(flags.target), @@ -766,7 +766,7 @@ func runKURLMigrationAPI( AirgapMetadata: airgapMetadata, EmbeddedAssetsSize: assetsSize, ReleaseData: releaseData, - Mode: apitypes.ModeUpgrade, // Use upgrade mode for migration + Mode: apitypes.ModeUpgrade, // Use upgrade mode for kURL migration LinuxConfig: apitypes.LinuxConfig{ RuntimeConfig: rc, From 48d6f2ac71e1faeceeaf5d23d214f5724c59c705 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 16:40:08 -0500 Subject: [PATCH 28/37] fix naming comprehensively --- api/api.go | 4 +-- api/client/kurl_migration.go | 2 +- api/controllers/kurlmigration/controller.go | 24 ++++++------- .../kurlmigration/controller_test.go | 14 ++++---- api/docs/docs.go | 4 +-- api/docs/swagger.json | 4 +-- api/docs/swagger.yaml | 35 ++++++++++--------- .../handlers/kurlmigration/handler.go | 28 +++++++-------- .../managers/kurlmigration/manager.go | 4 +-- api/internal/store/kurlmigration/store.go | 18 +++++----- .../store/kurlmigration/store_test.go | 10 +++--- api/types/kurl_migration.go | 22 ++++++------ cmd/installer/cli/upgrade.go | 10 +++--- web/src/types/api.ts | 32 ++++++++--------- 14 files changed, 106 insertions(+), 105 deletions(-) diff --git a/api/api.go b/api/api.go index 7de06f01f3..cf2351041c 100644 --- a/api/api.go +++ b/api/api.go @@ -107,8 +107,8 @@ func WithKubernetesUpgradeController(kubernetesUpgradeController kubernetesupgra } } -// WithMigrationController configures the migration controller for the API. -func WithMigrationController(kurlMigrationController kurlmigration.Controller) Option { +// WithKURLMigrationController configures the kURL migration controller for the API. +func WithKURLMigrationController(kurlMigrationController kurlmigration.Controller) Option { return func(a *API) { a.kurlMigrationController = kurlMigrationController } diff --git a/api/client/kurl_migration.go b/api/client/kurl_migration.go index d7b58db85d..406de99294 100644 --- a/api/client/kurl_migration.go +++ b/api/client/kurl_migration.go @@ -73,7 +73,7 @@ func (c *client) StartKURLMigration(ctx context.Context, transferMode string, co return result, nil } -// GetKURLMigrationStatus returns the current status of the migration. +// GetKURLMigrationStatus returns the current status of the kURL migration. func (c *client) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/api/linux/kurl-migration/status", c.apiURL), nil) if err != nil { diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index cfd8b2d48a..f3dc613a9a 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -22,7 +22,7 @@ type Controller interface { // StartKURLMigration validates config, generates UUID, initializes state, launches background goroutine StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) - // GetKURLMigrationStatus returns current migration status + // GetKURLMigrationStatus returns current kURL migration status GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) // Run is the internal orchestration loop (skeleton for this PR, implemented in PR 8) @@ -42,7 +42,7 @@ type KURLMigrationController struct { // ControllerOption is a functional option for configuring the KURLMigrationController type ControllerOption func(*KURLMigrationController) -// WithManager sets the migration manager +// WithManager sets the kURL migration manager func WithManager(manager kurlmigrationmanager.Manager) ControllerOption { return func(c *KURLMigrationController) { c.manager = manager @@ -156,13 +156,13 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return "", types.NewBadRequestError(err) } - // Check if migration already exists + // Check if kURL migration already exists if _, err := c.store.KURLMigrationStore().GetMigrationID(); err == nil { c.logger.Warn("kURL migration already in progress") return "", types.NewConflictError(types.ErrKURLMigrationAlreadyStarted) } - // Generate UUID for migration + // Generate UUID for kURL migration migrationID := uuid.New().String() c.logger.WithField("migrationID", migrationID).Debug("generated migration id") @@ -188,10 +188,10 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return "", fmt.Errorf("store user config: %w", err) } - // Initialize migration in store with resolved config + // Initialize kURL migration in store with resolved config if err := c.store.KURLMigrationStore().InitializeMigration(migrationID, string(transferMode), resolvedConfig); err != nil { - c.logger.WithError(err).Error("initialize migration") - return "", fmt.Errorf("initialize migration: %w", err) + c.logger.WithError(err).Error("initialize kURL migration") + return "", fmt.Errorf("initialize kURL migration: %w", err) } // Set initial state to NotStarted @@ -215,7 +215,7 @@ func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transf return migrationID, nil } -// GetKURLMigrationStatus returns current migration status +// GetKURLMigrationStatus returns current kURL migration status func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { c.logger.Debug("fetching kURL migration status") @@ -247,7 +247,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // before the client receives the success response with migrationID time.Sleep(100 * time.Millisecond) - // Defer handles all error cases by updating migration state + // Defer handles all error cases by updating kURL migration state defer func() { // Recover from panics if r := recover(); r != nil { @@ -279,7 +279,7 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { c.logger.WithFields(logrus.Fields{ "state": status.State, "phase": status.Phase, - }).Debug("current migration state") + }).Debug("current kURL migration state") // If InProgress, resume from current phase if status.State == types.KURLMigrationStateInProgress { @@ -319,8 +319,8 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { } // Set state to Completed - // Note: If this fails, we log it but don't return an error because the migration itself succeeded. - // Returning an error here would cause the defer to mark the migration as Failed, which is incorrect + // Note: If this fails, we log it but don't return an error because the kURL migration itself succeeded. + // Returning an error here would cause the defer to mark the kURL migration as Failed, which is incorrect // since all phases completed successfully. The state update failure is a separate concern. if err := c.store.KURLMigrationStore().SetState(types.KURLMigrationStateCompleted); err != nil { c.logger.WithError(err).Error("kURL migration completed successfully but failed to update state to Completed") diff --git a/api/controllers/kurlmigration/controller_test.go b/api/controllers/kurlmigration/controller_test.go index dfe7596f98..adf2e5b489 100644 --- a/api/controllers/kurlmigration/controller_test.go +++ b/api/controllers/kurlmigration/controller_test.go @@ -202,7 +202,7 @@ func TestStartMigration(t *testing.T) { s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), s.On("SetState", types.KURLMigrationStateFailed).Return(nil), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -244,7 +244,7 @@ func TestStartMigration(t *testing.T) { s.On("SetPhase", types.KURLMigrationPhaseDiscovery).Return(nil), m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented), s.On("SetState", types.KURLMigrationStateFailed).Return(nil), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil), ) }, expectedErr: nil, @@ -254,7 +254,7 @@ func TestStartMigration(t *testing.T) { }, }, { - name: "migration already started (409 error)", + name: "kURL migration already started (409 error)", transferMode: types.TransferModeCopy, config: types.LinuxInstallationConfig{}, setupMock: func(m *migrationmanager.MockManager, s *migrationstore.MockStore) { @@ -270,7 +270,7 @@ func TestStartMigration(t *testing.T) { var apiErr *types.APIError require.True(t, errors.As(err, &apiErr)) assert.Equal(t, 409, apiErr.StatusCode) - assert.Contains(t, err.Error(), "migration already started") + assert.Contains(t, err.Error(), "kURL migration already started") }, }, { @@ -312,7 +312,7 @@ func TestStartMigration(t *testing.T) { validateResult: func(t *testing.T, migrationID string, err error) { assert.Error(t, err) assert.Empty(t, migrationID) - assert.Contains(t, err.Error(), "initialize migration") + assert.Contains(t, err.Error(), "initialize kURL migration") }, }, { @@ -488,7 +488,7 @@ func TestRun(t *testing.T) { m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented).Once(), // Error handling s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil).Once(), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil).Once(), ) }, expectedErr: true, @@ -548,7 +548,7 @@ func TestRun(t *testing.T) { // ExecutePhase fails in skeleton m.On("ExecutePhase", mock.Anything, types.KURLMigrationPhaseDiscovery).Return(types.ErrKURLMigrationPhaseNotImplemented).Once(), s.On("SetState", types.KURLMigrationStateFailed).Return(nil).Once(), - s.On("SetError", "execute phase Discovery: migration phase execution not yet implemented").Return(nil).Once(), + s.On("SetError", "execute phase Discovery: kURL migration phase execution not yet implemented").Return(nil).Once(), ) }, expectedErr: true, diff --git a/api/docs/docs.go b/api/docs/docs.go index 214a53f3ae..994414805b 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the kURL migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the kURL migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a kURL migration","properties":{"error":{"description":"Error contains the error message if the kURL migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a kURL migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the kURL migration status","example":"kURL migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during kURL migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"{{escape .Description}}","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"{{.Title}}","version":"{{.Version}}"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getKURLMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for kURL migration","tags":["kurl-migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start kURL Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["kurl-migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the kURL migration","operationId":"getKURLMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the kURL migration","tags":["kurl-migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.json b/api/docs/swagger.json index 7c21d0f75d..0419bb7b7c 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -1,8 +1,8 @@ { - "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a migration","properties":{"error":{"description":"Error contains the error message if the migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the migration status","example":"Migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, + "components": {"schemas":{"github_com_replicatedhq_embedded-cluster_api_types.Health":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"},"github_com_replicatedhq_kotskinds_multitype.BoolOrString":{"type":"object"},"types.APIError":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/types.APIError"},"type":"array","uniqueItems":false},"field":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"}},"required":["message"],"type":"object"},"types.Airgap":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppConfig":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigGroup"},"type":"array","uniqueItems":false}},"required":["groups"],"type":"object"},"types.AppConfigValue":{"properties":{"data":{"type":"string"},"dataPlaintext":{"type":"string"},"default":{"type":"string"},"filename":{"type":"string"},"repeatableItem":{"type":"string"},"value":{"type":"string"}},"required":["value"],"type":"object"},"types.AppConfigValues":{"additionalProperties":{"$ref":"#/components/schemas/types.AppConfigValue"},"type":"object"},"types.AppConfigValuesResponse":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.AppInstall":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AppUpgrade":{"properties":{"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["logs","status"],"type":"object"},"types.AuthRequest":{"properties":{"password":{"type":"string"}},"required":["password"],"type":"object"},"types.AuthResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"types.Error":{"properties":{"code":{"description":"The error code is a string that uniquely identifies an error condition. It is\nmeant to be read and understood by programs that detect and handle errors by\ntype. The following is a list of Amazon S3 error codes. For more information,\nsee [Error responses].\n\n - Code: AccessDenied\n\n - Description: Access Denied\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AccountProblem\n\n - Description: There is a problem with your Amazon Web Services account that\n prevents the action from completing successfully. Contact Amazon Web Services\n Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AllAccessDisabled\n\n - Description: All access to this Amazon S3 resource has been disabled.\n Contact Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AmbiguousGrantByEmailAddress\n\n - Description: The email address you provided is associated with more than\n one account.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: AuthorizationHeaderMalformed\n\n - Description: The authorization header you provided is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - HTTP Status Code: N/A\n\n - Code: BadDigest\n\n - Description: The Content-MD5 you specified did not match what we received.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyExists\n\n - Description: The requested bucket name is not available. The bucket\n namespace is shared by all users of the system. Please select a different name\n and try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketAlreadyOwnedByYou\n\n - Description: The bucket you tried to create already exists, and you own it.\n Amazon S3 returns this error in all Amazon Web Services Regions except in the\n North Virginia Region. For legacy compatibility, if you re-create an existing\n bucket that you already own in the North Virginia Region, Amazon S3 returns 200\n OK and resets the bucket access control lists (ACLs).\n\n - Code: 409 Conflict (in all Regions except the North Virginia Region)\n\n - SOAP Fault Code Prefix: Client\n\n - Code: BucketNotEmpty\n\n - Description: The bucket you tried to delete is not empty.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CredentialsNotSupported\n\n - Description: This request does not support credentials.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: CrossLocationLoggingProhibited\n\n - Description: Cross-location logging not allowed. Buckets in one geographic\n location cannot log information to a bucket in another location.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooSmall\n\n - Description: Your proposed upload is smaller than the minimum allowed\n object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: EntityTooLarge\n\n - Description: Your proposed upload exceeds the maximum allowed object size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ExpiredToken\n\n - Description: The provided token has expired.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IllegalVersioningConfigurationException\n\n - Description: Indicates that the versioning configuration specified in the\n request is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncompleteBody\n\n - Description: You did not provide the number of bytes specified by the\n Content-Length HTTP header\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: IncorrectNumberOfFilesInPostRequest\n\n - Description: POST requires exactly one file upload per request.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InlineDataTooLarge\n\n - Description: Inline data exceeds the maximum allowed size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InternalError\n\n - Description: We encountered an internal error. Please try again.\n\n - HTTP Status Code: 500 Internal Server Error\n\n - SOAP Fault Code Prefix: Server\n\n - Code: InvalidAccessKeyId\n\n - Description: The Amazon Web Services access key ID you provided does not\n exist in our records.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidAddressingHeader\n\n - Description: You must specify the Anonymous role.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidArgument\n\n - Description: Invalid Argument\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketName\n\n - Description: The specified bucket is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidBucketState\n\n - Description: The request is not valid with the current state of the bucket.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidDigest\n\n - Description: The Content-MD5 you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidEncryptionAlgorithmError\n\n - Description: The encryption request you specified is not valid. The valid\n value is AES256.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidLocationConstraint\n\n - Description: The specified location constraint is not valid. For more\n information about Regions, see [How to Select a Region for Your Buckets].\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidObjectState\n\n - Description: The action is not valid for the current state of the object.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPart\n\n - Description: One or more of the specified parts could not be found. The\n part might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPartOrder\n\n - Description: The list of parts was not in ascending order. Parts list must\n be specified in order by part number.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPayer\n\n - Description: All access to this object has been disabled. Please contact\n Amazon Web Services Support for further assistance.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidPolicyDocument\n\n - Description: The content of the form does not meet the conditions specified\n in the policy document.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRange\n\n - Description: The requested range cannot be satisfied.\n\n - HTTP Status Code: 416 Requested Range Not Satisfiable\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Please use AWS4-HMAC-SHA256 .\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: SOAP requests must be made over an HTTPS connection.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with non-DNS compliant names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported for buckets\n with periods (.) in their names.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate endpoint only supports virtual\n style requests.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is not configured on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Accelerate is disabled on this bucket.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration is not supported on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidRequest\n\n - Description: Amazon S3 Transfer Acceleration cannot be enabled on this\n bucket. Contact Amazon Web Services Support for more information.\n\n - HTTP Status Code: 400 Bad Request\n\n - Code: N/A\n\n - Code: InvalidSecurity\n\n - Description: The provided security credentials are not valid.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidSOAPRequest\n\n - Description: The SOAP request body is invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidStorageClass\n\n - Description: The storage class you specified is not valid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidTargetBucketForLogging\n\n - Description: The target bucket for logging does not exist, is not owned by\n you, or does not have the appropriate grants for the log-delivery group.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidToken\n\n - Description: The provided token is malformed or otherwise invalid.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: InvalidURI\n\n - Description: Couldn't parse the specified URI.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: KeyTooLongError\n\n - Description: Your key is too long.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedACLError\n\n - Description: The XML you provided was not well-formed or did not validate\n against our published schema.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedPOSTRequest\n\n - Description: The body of your POST request is not well-formed\n multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MalformedXML\n\n - Description: This happens when the user sends malformed XML (XML that\n doesn't conform to the published XSD) for the configuration. The error message\n is, \"The XML you provided was not well-formed or did not validate against our\n published schema.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxMessageLengthExceeded\n\n - Description: Your request was too big.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MaxPostPreDataLengthExceededError\n\n - Description: Your POST request fields preceding the upload file were too\n large.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MetadataTooLarge\n\n - Description: Your metadata headers exceed the maximum allowed metadata size.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MethodNotAllowed\n\n - Description: The specified method is not allowed against this resource.\n\n - HTTP Status Code: 405 Method Not Allowed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingAttachment\n\n - Description: A SOAP attachment was expected, but none were found.\n\n - HTTP Status Code: N/A\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingContentLength\n\n - Description: You must provide the Content-Length HTTP header.\n\n - HTTP Status Code: 411 Length Required\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingRequestBodyError\n\n - Description: This happens when the user sends an empty XML document as a\n request. The error message is, \"Request body is empty.\"\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityElement\n\n - Description: The SOAP 1.1 request is missing a security element.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: MissingSecurityHeader\n\n - Description: Your request is missing a required header.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoLoggingStatusForKey\n\n - Description: There is no such thing as a logging status subresource for a\n key.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucket\n\n - Description: The specified bucket does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchBucketPolicy\n\n - Description: The specified bucket does not have a bucket policy.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchKey\n\n - Description: The specified key does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchLifecycleConfiguration\n\n - Description: The lifecycle configuration does not exist.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchUpload\n\n - Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or completed.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NoSuchVersion\n\n - Description: Indicates that the version ID specified in the request does\n not match an existing version.\n\n - HTTP Status Code: 404 Not Found\n\n - SOAP Fault Code Prefix: Client\n\n - Code: NotImplemented\n\n - Description: A header you provided implies functionality that is not\n implemented.\n\n - HTTP Status Code: 501 Not Implemented\n\n - SOAP Fault Code Prefix: Server\n\n - Code: NotSignedUp\n\n - Description: Your account is not signed up for the Amazon S3 service. You\n must sign up before you can use Amazon S3. You can sign up at the following URL:\n [Amazon S3]\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: OperationAborted\n\n - Description: A conflicting conditional action is currently in progress\n against this resource. Try again.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PermanentRedirect\n\n - Description: The bucket you are attempting to access must be addressed\n using the specified endpoint. Send all future requests to this endpoint.\n\n - HTTP Status Code: 301 Moved Permanently\n\n - SOAP Fault Code Prefix: Client\n\n - Code: PreconditionFailed\n\n - Description: At least one of the preconditions you specified did not hold.\n\n - HTTP Status Code: 412 Precondition Failed\n\n - SOAP Fault Code Prefix: Client\n\n - Code: Redirect\n\n - Description: Temporary redirect.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RestoreAlreadyInProgress\n\n - Description: Object restore is already in progress.\n\n - HTTP Status Code: 409 Conflict\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestIsNotMultiPartContent\n\n - Description: Bucket POST must be of the enclosure-type multipart/form-data.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeout\n\n - Description: Your socket connection to the server was not read from or\n written to within the timeout period.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTimeTooSkewed\n\n - Description: The difference between the request time and the server's time\n is too large.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: RequestTorrentOfBucketError\n\n - Description: Requesting the torrent file of a bucket is not permitted.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: SignatureDoesNotMatch\n\n - Description: The request signature we calculated does not match the\n signature you provided. Check your Amazon Web Services secret access key and\n signing method. For more information, see [REST Authentication]and [SOAP Authentication]for details.\n\n - HTTP Status Code: 403 Forbidden\n\n - SOAP Fault Code Prefix: Client\n\n - Code: ServiceUnavailable\n\n - Description: Service is unable to handle request.\n\n - HTTP Status Code: 503 Service Unavailable\n\n - SOAP Fault Code Prefix: Server\n\n - Code: SlowDown\n\n - Description: Reduce your request rate.\n\n - HTTP Status Code: 503 Slow Down\n\n - SOAP Fault Code Prefix: Server\n\n - Code: TemporaryRedirect\n\n - Description: You are being redirected to the bucket while DNS updates.\n\n - HTTP Status Code: 307 Moved Temporarily\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TokenRefreshRequired\n\n - Description: The provided token must be refreshed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: TooManyBuckets\n\n - Description: You have attempted to create more buckets than allowed.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnexpectedContent\n\n - Description: This request does not support content.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UnresolvableGrantByEmailAddress\n\n - Description: The email address you provided does not match any account on\n record.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n - Code: UserKeyMustBeSpecified\n\n - Description: The bucket POST must contain the specified field name. If it\n is specified, check the order of the fields.\n\n - HTTP Status Code: 400 Bad Request\n\n - SOAP Fault Code Prefix: Client\n\n[How to Select a Region for Your Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\n[Error responses]: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n[REST Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\n[Amazon S3]: http://aws.amazon.com/s3\n[SOAP Authentication]: https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html","type":"string"},"key":{"description":"The error key.","type":"string"},"message":{"description":"The error message contains a generic description of the error condition in\nEnglish. It is intended for a human audience. Simple programs display the\nmessage directly to the end user if they encounter an error condition they don't\nknow how or don't care to handle. Sophisticated programs with more exhaustive\nerror handling and proper internationalization are more likely to ignore the\nerror message.","type":"string"},"versionId":{"description":"The version ID of the error.\n\nThis functionality is not supported for directory buckets.","type":"string"}},"type":"object"},"types.GetListAvailableNetworkInterfacesResponse":{"properties":{"networkInterfaces":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["networkInterfaces"],"type":"object"},"types.Infra":{"properties":{"components":{"items":{"$ref":"#/components/schemas/types.InfraComponent"},"type":"array","uniqueItems":false},"logs":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["components","logs","status"],"type":"object"},"types.InfraComponent":{"properties":{"name":{"type":"string"},"status":{"$ref":"#/components/schemas/types.Status"}},"required":["name","status"],"type":"object"},"types.InstallAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.InstallAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"types.InstallHostPreflightsStatusResponse":{"properties":{"allowIgnoreHostPreflights":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreHostPreflights","titles"],"type":"object"},"types.KURLMigrationPhase":{"description":"Phase is the current phase of the kURL migration process","enum":["Discovery","Preparation","ECInstall","DataTransfer","Completed"],"example":"Discovery","type":"string","x-enum-varnames":["KURLMigrationPhaseDiscovery","KURLMigrationPhasePreparation","KURLMigrationPhaseECInstall","KURLMigrationPhaseDataTransfer","KURLMigrationPhaseCompleted"]},"types.KURLMigrationState":{"description":"State is the current state of the kURL migration","enum":["NotStarted","InProgress","Completed","Failed"],"example":"InProgress","type":"string","x-enum-varnames":["KURLMigrationStateNotStarted","KURLMigrationStateInProgress","KURLMigrationStateCompleted","KURLMigrationStateFailed"]},"types.KURLMigrationStatusResponse":{"description":"Current status and progress of a kURL migration","properties":{"error":{"description":"Error contains the error message if the kURL migration failed","example":"","type":"string"},"message":{"description":"Message is a user-facing message describing the current status","example":"Discovering kURL cluster configuration","type":"string"},"phase":{"$ref":"#/components/schemas/types.KURLMigrationPhase"},"progress":{"description":"Progress is the completion percentage (0-100)","example":25,"type":"integer"},"state":{"$ref":"#/components/schemas/types.KURLMigrationState"}},"required":["message","phase","progress","state"],"type":"object"},"types.KubernetesInstallationConfig":{"properties":{"adminConsolePort":{"type":"integer"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"noProxy":{"type":"string"}},"type":"object"},"types.KubernetesInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"},"values":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.LinuxInfraSetupRequest":{"properties":{"ignoreHostPreflights":{"type":"boolean"}},"required":["ignoreHostPreflights"],"type":"object"},"types.LinuxInstallationConfig":{"description":"Config contains optional installation configuration that will be merged with defaults","properties":{"dataDirectory":{"type":"string"},"globalCidr":{"type":"string"},"httpProxy":{"type":"string"},"httpsProxy":{"type":"string"},"localArtifactMirrorPort":{"type":"integer"},"networkInterface":{"type":"string"},"noProxy":{"type":"string"},"podCidr":{"type":"string"},"serviceCidr":{"type":"string"}},"type":"object"},"types.LinuxInstallationConfigResponse":{"properties":{"defaults":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"resolved":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"values":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}},"required":["defaults","resolved","values"],"type":"object"},"types.PatchAppConfigValuesRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.PostInstallRunHostPreflightsRequest":{"properties":{"isUi":{"type":"boolean"}},"required":["isUi"],"type":"object"},"types.PreflightsOutput":{"properties":{"fail":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"pass":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false},"warn":{"items":{"$ref":"#/components/schemas/types.PreflightsRecord"},"type":"array","uniqueItems":false}},"required":["fail","pass","warn"],"type":"object"},"types.PreflightsRecord":{"properties":{"message":{"type":"string"},"strict":{"type":"boolean"},"title":{"type":"string"}},"required":["message","strict","title"],"type":"object"},"types.StartKURLMigrationRequest":{"description":"Request body for starting a migration from kURL to Embedded Cluster","properties":{"config":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"},"transferMode":{"$ref":"#/components/schemas/types.TransferMode"}},"required":["transferMode"],"type":"object"},"types.StartKURLMigrationResponse":{"description":"Response returned when a kURL migration is successfully started","properties":{"message":{"description":"Message is a user-facing message about the kURL migration status","example":"kURL migration started successfully","type":"string"},"migrationId":{"description":"MigrationID is the unique identifier for this migration","example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}},"required":["message","migrationId"],"type":"object"},"types.State":{"enum":["Pending","Running","Succeeded","Failed"],"example":"Succeeded","type":"string","x-enum-varnames":["StatePending","StateRunning","StateSucceeded","StateFailed"]},"types.Status":{"properties":{"description":{"type":"string"},"lastUpdated":{"type":"string"},"state":{"$ref":"#/components/schemas/types.State"}},"required":["description","lastUpdated","state"],"type":"object"},"types.TemplateAppConfigRequest":{"properties":{"values":{"$ref":"#/components/schemas/types.AppConfigValues"}},"required":["values"],"type":"object"},"types.TransferMode":{"description":"TransferMode specifies whether to copy or move data during kURL migration","enum":["copy","move"],"example":"copy","type":"string","x-enum-varnames":["TransferModeCopy","TransferModeMove"]},"types.UpgradeAppPreflightsStatusResponse":{"properties":{"allowIgnoreAppPreflights":{"type":"boolean"},"hasStrictAppPreflightFailures":{"type":"boolean"},"output":{"$ref":"#/components/schemas/types.PreflightsOutput"},"status":{"$ref":"#/components/schemas/types.Status"},"titles":{"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["allowIgnoreAppPreflights","hasStrictAppPreflightFailures","status","titles"],"type":"object"},"types.UpgradeAppRequest":{"properties":{"ignoreAppPreflights":{"type":"boolean"}},"required":["ignoreAppPreflights"],"type":"object"},"v1beta1.ConfigChildItem":{"properties":{"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"name":{"type":"string"},"recommended":{"type":"boolean"},"title":{"type":"string"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"}},"required":["default","name","recommended","title","value"],"type":"object"},"v1beta1.ConfigGroup":{"properties":{"description":{"type":"string"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigItem"},"type":"array","uniqueItems":false},"name":{"type":"string"},"title":{"type":"string"},"when":{"type":"string"}},"required":["description","items","name","title","when"],"type":"object"},"v1beta1.ConfigItem":{"properties":{"affix":{"type":"string"},"countByGroup":{"additionalProperties":{"type":"integer"},"type":"object"},"data":{"type":"string"},"default":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"error":{"type":"string"},"filename":{"type":"string"},"help_text":{"type":"string"},"hidden":{"type":"boolean"},"items":{"items":{"$ref":"#/components/schemas/v1beta1.ConfigChildItem"},"type":"array","uniqueItems":false},"minimumCount":{"type":"integer"},"multi_value":{"items":{"type":"string"},"type":"array","uniqueItems":false},"multiple":{"type":"boolean"},"name":{"type":"string"},"readonly":{"type":"boolean"},"recommended":{"type":"boolean"},"repeatable":{"type":"boolean"},"required":{"type":"boolean"},"templates":{"items":{"$ref":"#/components/schemas/v1beta1.RepeatTemplate"},"type":"array","uniqueItems":false},"title":{"type":"string"},"type":{"type":"string"},"validation":{"$ref":"#/components/schemas/v1beta1.ConfigItemValidation"},"value":{"$ref":"#/components/schemas/github_com_replicatedhq_kotskinds_multitype.BoolOrString"},"valuesByGroup":{"$ref":"#/components/schemas/v1beta1.ValuesByGroup"},"when":{"type":"string"},"write_once":{"type":"boolean"}},"required":["affix","countByGroup","data","default","error","filename","help_text","hidden","items","minimumCount","multi_value","multiple","name","readonly","recommended","repeatable","required","templates","title","type","validation","value","valuesByGroup","when","write_once"],"type":"object"},"v1beta1.ConfigItemValidation":{"properties":{"regex":{"$ref":"#/components/schemas/v1beta1.RegexValidator"}},"required":["regex"],"type":"object"},"v1beta1.GroupValues":{"additionalProperties":{"type":"string"},"type":"object"},"v1beta1.RegexValidator":{"properties":{"message":{"type":"string"},"pattern":{"type":"string"}},"required":["message","pattern"],"type":"object"},"v1beta1.RepeatTemplate":{"properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"yamlPath":{"type":"string"}},"required":["apiVersion","kind","name","namespace","yamlPath"],"type":"object"},"v1beta1.ValuesByGroup":{"additionalProperties":{"$ref":"#/components/schemas/v1beta1.GroupValues"},"type":"object"}},"securitySchemes":{"bearerauth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}}, "info": {"contact":{"email":"support@replicated.com","name":"API Support","url":"https://github.com/replicatedhq/embedded-cluster/issues"},"description":"This is the API for the Embedded Cluster project.","license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"termsOfService":"http://swagger.io/terms/","title":"Embedded Cluster API","version":"0.1"}, "externalDocs": {"description":"OpenAPI","url":"https://swagger.io/resources/open-api/"}, - "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for migration","tags":["migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the migration","operationId":"getMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the migration","tags":["migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, + "paths": {"/auth/login":{"post":{"description":"Authenticate a user","operationId":"postAuthLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthRequest"}}},"description":"Auth Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AuthResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Unauthorized"}},"summary":"Authenticate a user","tags":["auth"]}},"/console/available-network-interfaces":{"get":{"description":"List available network interfaces","operationId":"getConsoleListAvailableNetworkInterfaces","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.GetListAvailableNetworkInterfacesResponse"}}},"description":"OK"}},"summary":"List available network interfaces","tags":["console"]}},"/health":{"get":{"description":"get the health of the API","operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_replicatedhq_embedded-cluster_api_types.Health"}}},"description":"OK"}},"summary":"Get the health of the API","tags":["health"]}},"/kubernetes/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postKubernetesInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["kubernetes-install"]}},"/kubernetes/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getKubernetesInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postKubernetesInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["kubernetes-install"]}},"/kubernetes/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getKubernetesInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["kubernetes-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchKubernetesInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["kubernetes-install"]}},"/kubernetes/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postKubernetesInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["kubernetes-install"]}},"/kubernetes/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getKubernetesInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["kubernetes-install"]}},"/kubernetes/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postKubernetesInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["kubernetes-install"]}},"/kubernetes/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getKubernetesInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["kubernetes-install"]}},"/kubernetes/install/installation/config":{"get":{"description":"get the Kubernetes installation config","operationId":"getKubernetesInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the Kubernetes installation config","tags":["kubernetes-install"]}},"/kubernetes/install/installation/configure":{"post":{"description":"configure the Kubernetes installation for install","operationId":"postKubernetesInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KubernetesInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the Kubernetes installation for install","tags":["kubernetes-install"]}},"/kubernetes/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getKubernetesInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["kubernetes-install"]}},"/kubernetes/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postKubernetesUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getKubernetesUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postKubernetesUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getKubernetesUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["kubernetes-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchKubernetesUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getKubernetesUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["kubernetes-upgrade"]}},"/kubernetes/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postKubernetesUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["kubernetes-upgrade"]}},"/linux/install/airgap/process":{"post":{"description":"Process the airgap bundle for install","operationId":"postLinuxInstallProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-install"]}},"/linux/install/airgap/status":{"get":{"description":"Get the current status of the airgap processing for install","operationId":"getLinuxInstallAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-install"]}},"/linux/install/app-preflights/run":{"post":{"description":"Run install app preflight checks using current app configuration","operationId":"postLinuxInstallRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run install app preflight checks","tags":["linux-install"]}},"/linux/install/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for install","operationId":"getLinuxInstallAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for install","tags":["linux-install"]}},"/linux/install/app/config/template":{"post":{"description":"Template the app config with provided values and return the templated config","operationId":"postLinuxInstallTemplateAppConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template the app config with provided values","tags":["linux-install"]}},"/linux/install/app/config/values":{"get":{"description":"Get the current app config values","operationId":"getLinuxInstallAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values","tags":["linux-install"]},"patch":{"description":"Set the app config values with partial updates","operationId":"patchLinuxInstallAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values","tags":["linux-install"]}},"/linux/install/app/install":{"post":{"description":"Install the app using current configuration","operationId":"postLinuxInstallApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallAppRequest"}}},"description":"Install App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Install the app","tags":["linux-install"]}},"/linux/install/app/status":{"get":{"description":"Get the current status of app installation","operationId":"getLinuxInstallAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppInstall"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app install status","tags":["linux-install"]}},"/linux/install/host-preflights/run":{"post":{"description":"Run install host preflight checks using installation config and client-provided data","operationId":"postLinuxInstallRunHostPreflights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PostInstallRunHostPreflightsRequest"}}},"description":"Post Install Run Host Preflights Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Run install host preflight checks","tags":["linux-install"]}},"/linux/install/host-preflights/status":{"get":{"description":"Get the current status and results of host preflight checks for install","operationId":"getLinuxInstallHostPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.InstallHostPreflightsStatusResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get host preflight status for install","tags":["linux-install"]}},"/linux/install/infra/setup":{"post":{"description":"Setup infra components","operationId":"postLinuxInstallSetupInfra","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInfraSetupRequest"}}},"description":"Infra Setup Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Setup infra components","tags":["linux-install"]}},"/linux/install/infra/status":{"get":{"description":"Get the current status of the infra","operationId":"getLinuxInstallInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra","tags":["linux-install"]}},"/linux/install/installation/config":{"get":{"description":"get the installation config","operationId":"getLinuxInstallInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config","tags":["linux-install"]}},"/linux/install/installation/configure":{"post":{"description":"configure the installation for install","operationId":"postLinuxInstallConfigureInstallation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfig"}}},"description":"Installation config","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Configure the installation for install","tags":["linux-install"]}},"/linux/install/installation/status":{"get":{"description":"Get the current status of the installation configuration for install","operationId":"getLinuxInstallInstallationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Status"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get installation configuration status for install","tags":["linux-install"]}},"/linux/kurl-migration/config":{"get":{"description":"Get the installation config extracted from kURL merged with EC defaults","operationId":"getKURLMigrationInstallationConfig","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.LinuxInstallationConfigResponse"}}},"description":"OK"}},"security":[{"bearerauth":[]}],"summary":"Get the installation config for kURL migration","tags":["kurl-migration"]}},"/linux/kurl-migration/start":{"post":{"description":"Start a migration from kURL to Embedded Cluster with the provided configuration","operationId":"postStartMigration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationRequest"}}},"description":"Start kURL Migration Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.StartKURLMigrationResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Conflict"}},"security":[{"bearerauth":[]}],"summary":"Start a migration from kURL to Embedded Cluster","tags":["kurl-migration"]}},"/linux/kurl-migration/status":{"get":{"description":"Get the current status and progress of the kURL migration","operationId":"getKURLMigrationStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.KURLMigrationStatusResponse"}}},"description":"OK"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Not Found"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the kURL migration","tags":["kurl-migration"]}},"/linux/upgrade/airgap/process":{"post":{"description":"Process the airgap bundle for upgrade","operationId":"postLinuxUpgradeProcessAirgap","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Process the airgap bundle","tags":["linux-upgrade"]}},"/linux/upgrade/airgap/status":{"get":{"description":"Get the current status of the airgap processing for upgrade","operationId":"getLinuxUpgradeAirgapStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Airgap"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the airgap processing","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/run":{"post":{"description":"Run upgrade app preflight checks using current app configuration","operationId":"postLinuxUpgradeRunAppPreflights","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Run upgrade app preflight checks","tags":["linux-upgrade"]}},"/linux/upgrade/app-preflights/status":{"get":{"description":"Get the current status and results of app preflight checks for upgrade","operationId":"getLinuxUpgradeAppPreflightsStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppPreflightsStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app preflight status for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/template":{"post":{"description":"Template the app configuration with values for upgrade","operationId":"postLinuxUpgradeAppConfigTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.TemplateAppConfigRequest"}}},"description":"Template App Config Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfig"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Template app config for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/config/values":{"get":{"description":"Get the current app config values for upgrade","operationId":"getLinuxUpgradeAppConfigValues","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get the app config values for upgrade","tags":["linux-upgrade"]},"patch":{"description":"Set the app config values with partial updates for upgrade","operationId":"patchLinuxUpgradeAppConfigValues","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.PatchAppConfigValuesRequest"}}},"description":"Patch App Config Values Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppConfigValuesResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Set the app config values for upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/app/status":{"get":{"description":"Get the current status of app upgrade","operationId":"getLinuxUpgradeAppStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Get app upgrade status","tags":["linux-upgrade"]}},"/linux/upgrade/app/upgrade":{"post":{"description":"Upgrade the app using current configuration","operationId":"postLinuxUpgradeApp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.UpgradeAppRequest"}}},"description":"Upgrade App Request","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.AppUpgrade"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.APIError"}}},"description":"Bad Request"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the app","tags":["linux-upgrade"]}},"/linux/upgrade/infra/status":{"get":{"description":"Get the current status of the infrastructure upgrade","operationId":"getLinuxUpgradeInfraStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Get the status of the infra upgrade","tags":["linux-upgrade"]}},"/linux/upgrade/infra/upgrade":{"post":{"description":"Upgrade the infrastructure (k0s, addons, extensions)","operationId":"postLinuxUpgradeInfra","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Infra"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Conflict"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/types.Error"}}},"description":"Internal Server Error"}},"security":[{"bearerauth":[]}],"summary":"Upgrade the infrastructure","tags":["linux-upgrade"]}}}, "openapi": "3.1.0", "servers": [ {"url":"/api"} diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 60b2d593ae..26d7c3957b 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -976,7 +976,7 @@ components: - titles type: object types.KURLMigrationPhase: - description: Phase is the current phase of the migration process + description: Phase is the current phase of the kURL migration process enum: - Discovery - Preparation @@ -992,7 +992,7 @@ components: - KURLMigrationPhaseDataTransfer - KURLMigrationPhaseCompleted types.KURLMigrationState: - description: State is the current state of the migration + description: State is the current state of the kURL migration enum: - NotStarted - InProgress @@ -1006,10 +1006,10 @@ components: - KURLMigrationStateCompleted - KURLMigrationStateFailed types.KURLMigrationStatusResponse: - description: Current status and progress of a migration + description: Current status and progress of a kURL migration properties: error: - description: Error contains the error message if the migration failed + description: Error contains the error message if the kURL migration failed example: "" type: string message: @@ -1157,11 +1157,11 @@ components: - transferMode type: object types.StartKURLMigrationResponse: - description: Response returned when a migration is successfully started + description: Response returned when a kURL migration is successfully started properties: message: - description: Message is a user-facing message about the migration status - example: Migration started successfully + description: Message is a user-facing message about the kURL migration status + example: kURL migration started successfully type: string migrationId: description: MigrationID is the unique identifier for this migration @@ -1205,7 +1205,8 @@ components: - values type: object types.TransferMode: - description: TransferMode specifies whether to copy or move data during migration + description: TransferMode specifies whether to copy or move data during kURL + migration enum: - copy - move @@ -2308,7 +2309,7 @@ paths: get: description: Get the installation config extracted from kURL merged with EC defaults - operationId: getMigrationInstallationConfig + operationId: getKURLMigrationInstallationConfig responses: "200": content: @@ -2318,9 +2319,9 @@ paths: description: OK security: - bearerauth: [] - summary: Get the installation config for migration + summary: Get the installation config for kURL migration tags: - - migration + - kurl-migration /linux/kurl-migration/start: post: description: Start a migration from kURL to Embedded Cluster with the provided @@ -2331,7 +2332,7 @@ paths: application/json: schema: $ref: '#/components/schemas/types.StartKURLMigrationRequest' - description: Start Migration Request + description: Start kURL Migration Request required: true responses: "200": @@ -2356,11 +2357,11 @@ paths: - bearerauth: [] summary: Start a migration from kURL to Embedded Cluster tags: - - migration + - kurl-migration /linux/kurl-migration/status: get: - description: Get the current status and progress of the migration - operationId: getMigrationStatus + description: Get the current status and progress of the kURL migration + operationId: getKURLMigrationStatus responses: "200": content: @@ -2376,9 +2377,9 @@ paths: description: Not Found security: - bearerauth: [] - summary: Get the status of the migration + summary: Get the status of the kURL migration tags: - - migration + - kurl-migration /linux/upgrade/airgap/process: post: description: Process the airgap bundle for upgrade diff --git a/api/internal/handlers/kurlmigration/handler.go b/api/internal/handlers/kurlmigration/handler.go index dc5df0d21e..d521114ca1 100644 --- a/api/internal/handlers/kurlmigration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -49,12 +49,12 @@ func New(opts ...Option) (*Handler, error) { return h, nil } -// GetInstallationConfig handler to get the installation config for migration +// GetInstallationConfig handler to get the installation config for kURL migration // -// @ID getMigrationInstallationConfig -// @Summary Get the installation config for migration +// @ID getKURLMigrationInstallationConfig +// @Summary Get the installation config for kURL migration // @Description Get the installation config extracted from kURL merged with EC defaults -// @Tags migration +// @Tags kurl-migration // @Security bearerauth // @Produce json // @Success 200 {object} types.LinuxInstallationConfigResponse @@ -75,11 +75,11 @@ func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) // @ID postStartMigration // @Summary Start a migration from kURL to Embedded Cluster // @Description Start a migration from kURL to Embedded Cluster with the provided configuration -// @Tags migration +// @Tags kurl-migration // @Security bearerauth // @Accept json // @Produce json -// @Param request body types.StartKURLMigrationRequest true "Start Migration Request" +// @Param request body types.StartKURLMigrationRequest true "Start kURL Migration Request" // @Success 200 {object} types.StartKURLMigrationResponse // @Failure 400 {object} types.APIError // @Failure 409 {object} types.APIError @@ -103,25 +103,25 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { migrationID, err := h.controller.StartKURLMigration(r.Context(), request.TransferMode, config) if err != nil { - utils.LogError(r, err, h.logger, "failed to start migration") + utils.LogError(r, err, h.logger, "failed to start kURL migration") utils.JSONError(w, r, err, h.logger) return } response := types.StartKURLMigrationResponse{ MigrationID: migrationID, - Message: "migration started successfully", + Message: "kURL migration started successfully", } utils.JSON(w, r, http.StatusOK, response, h.logger) } -// GetMigrationStatus handler to get the status of the migration +// GetMigrationStatus handler to get the status of the kURL migration // -// @ID getMigrationStatus -// @Summary Get the status of the migration -// @Description Get the current status and progress of the migration -// @Tags migration +// @ID getKURLMigrationStatus +// @Summary Get the status of the kURL migration +// @Description Get the current status and progress of the kURL migration +// @Tags kurl-migration // @Security bearerauth // @Produce json // @Success 200 {object} types.KURLMigrationStatusResponse @@ -130,7 +130,7 @@ func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { status, err := h.controller.GetKURLMigrationStatus(r.Context()) if err != nil { - utils.LogError(r, err, h.logger, "failed to get migration status") + utils.LogError(r, err, h.logger, "failed to get kURL migration status") utils.JSONError(w, r, err, h.logger) return } diff --git a/api/internal/managers/kurlmigration/manager.go b/api/internal/managers/kurlmigration/manager.go index 3fa4ca10d1..4a54291592 100644 --- a/api/internal/managers/kurlmigration/manager.go +++ b/api/internal/managers/kurlmigration/manager.go @@ -27,7 +27,7 @@ type Manager interface { // ValidateTransferMode validates the transfer mode is "copy" or "move" ValidateTransferMode(mode types.TransferMode) error - // ExecutePhase executes a migration phase + // ExecutePhase executes a kURL migration phase ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error } @@ -177,7 +177,7 @@ func (m *kurlMigrationManager) ValidateTransferMode(mode types.TransferMode) err } } -// ExecutePhase executes a migration phase +// ExecutePhase executes a kURL migration phase func (m *kurlMigrationManager) ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error { // TODO(sc-130983): Implement phase execution // This will handle: diff --git a/api/internal/store/kurlmigration/store.go b/api/internal/store/kurlmigration/store.go index 2a11c4f51a..8e5f2f9130 100644 --- a/api/internal/store/kurlmigration/store.go +++ b/api/internal/store/kurlmigration/store.go @@ -10,21 +10,21 @@ import ( var _ Store = &memoryStore{} -// Store provides methods for storing and retrieving migration state +// Store provides methods for storing and retrieving kURL migration state type Store interface { - // InitializeMigration sets up a new migration with ID, transfer mode, and config + // InitializeMigration sets up a new kURL migration with ID, transfer mode, and config InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error - // GetMigrationID returns the current migration ID, or error if none exists + // GetMigrationID returns the current kURL migration ID, or error if none exists GetMigrationID() (string, error) - // GetStatus returns the current migration status + // GetStatus returns the current kURL migration status GetStatus() (types.KURLMigrationStatusResponse, error) - // SetState updates the migration state + // SetState updates the kURL migration state SetState(state types.KURLMigrationState) error - // SetPhase updates the migration phase + // SetPhase updates the kURL migration phase SetPhase(phase types.KURLMigrationPhase) error // SetMessage updates the status message @@ -62,7 +62,7 @@ type memoryStore struct { type StoreOption func(*memoryStore) -// WithMigrationID sets the migration ID +// WithMigrationID sets the kURL migration ID func WithMigrationID(id string) StoreOption { return func(s *memoryStore) { s.migrationID = id @@ -84,7 +84,7 @@ func WithConfig(config types.LinuxInstallationConfig) StoreOption { } } -// WithStatus sets the migration status +// WithStatus sets the kURL migration status func WithStatus(status types.KURLMigrationStatusResponse) StoreOption { return func(s *memoryStore) { s.status = status @@ -252,7 +252,7 @@ func (s *memoryStore) GetUserConfig() (types.LinuxInstallationConfig, error) { s.mu.RLock() defer s.mu.RUnlock() - // Return user config even if migration not initialized (for GET /config endpoint) + // Return user config even if kURL migration not initialized (for GET /config endpoint) // If not initialized, userConfig will be zero-value (empty) var config types.LinuxInstallationConfig if err := deepcopy.Copy(&config, &s.userConfig); err != nil { diff --git a/api/internal/store/kurlmigration/store_test.go b/api/internal/store/kurlmigration/store_test.go index 5d795f93e0..b606dda0dd 100644 --- a/api/internal/store/kurlmigration/store_test.go +++ b/api/internal/store/kurlmigration/store_test.go @@ -11,7 +11,7 @@ func TestNewMemoryStore(t *testing.T) { store := NewMemoryStore() assert.NotNil(t, store) - // Should return error when no migration is initialized + // Should return error when no kURL migration is initialized _, err := store.GetMigrationID() assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) } @@ -67,7 +67,7 @@ func TestInitializeMigrationTwice(t *testing.T) { func TestSetState(t *testing.T) { store := NewMemoryStore() - // Should return error when no migration is initialized + // Should return error when no kURL migration is initialized err := store.SetState(types.KURLMigrationStateInProgress) assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) @@ -133,12 +133,12 @@ func TestSetError(t *testing.T) { err := store.InitializeMigration("test-id", "copy", config) assert.NoError(t, err) - err = store.SetError("migration failed") + err = store.SetError("kURL migration failed") assert.NoError(t, err) status, err := store.GetStatus() assert.NoError(t, err) - assert.Equal(t, "migration failed", status.Error) + assert.Equal(t, "kURL migration failed", status.Error) } func TestStoreOptions(t *testing.T) { @@ -160,7 +160,7 @@ func TestStoreOptions(t *testing.T) { WithStatus(status), ) - // Verify migration is pre-initialized + // Verify kURL migration is pre-initialized id, err := store.GetMigrationID() assert.NoError(t, err) assert.Equal(t, "pre-initialized", id) diff --git a/api/types/kurl_migration.go b/api/types/kurl_migration.go index 8311f6e3aa..c07a0398f1 100644 --- a/api/types/kurl_migration.go +++ b/api/types/kurl_migration.go @@ -7,10 +7,10 @@ import ( // kURL Migration error constants var ( - ErrNoActiveKURLMigration = errors.New("no active migration") - ErrKURLMigrationAlreadyStarted = errors.New("migration already started") + ErrNoActiveKURLMigration = errors.New("no active kURL migration") + ErrKURLMigrationAlreadyStarted = errors.New("kURL migration already started") ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") - ErrKURLMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") + ErrKURLMigrationPhaseNotImplemented = errors.New("kURL migration phase execution not yet implemented") ) // NewNotFoundError creates a 404 API error @@ -54,32 +54,32 @@ const ( // StartKURLMigrationRequest represents the request to start a kURL migration // @Description Request body for starting a migration from kURL to Embedded Cluster type StartKURLMigrationRequest struct { - // TransferMode specifies whether to copy or move data during migration + // TransferMode specifies whether to copy or move data during kURL migration TransferMode TransferMode `json:"transferMode" enums:"copy,move" example:"copy"` // Config contains optional installation configuration that will be merged with defaults Config *LinuxInstallationConfig `json:"config,omitempty" validate:"optional"` } // StartKURLMigrationResponse represents the response when starting a kURL migration -// @Description Response returned when a migration is successfully started +// @Description Response returned when a kURL migration is successfully started type StartKURLMigrationResponse struct { // MigrationID is the unique identifier for this migration MigrationID string `json:"migrationId" example:"550e8400-e29b-41d4-a716-446655440000"` - // Message is a user-facing message about the migration status - Message string `json:"message" example:"Migration started successfully"` + // Message is a user-facing message about the kURL migration status + Message string `json:"message" example:"kURL migration started successfully"` } // KURLMigrationStatusResponse represents the status of a kURL migration -// @Description Current status and progress of a migration +// @Description Current status and progress of a kURL migration type KURLMigrationStatusResponse struct { - // State is the current state of the migration + // State is the current state of the kURL migration State KURLMigrationState `json:"state" enums:"NotStarted,InProgress,Completed,Failed" example:"InProgress"` - // Phase is the current phase of the migration process + // Phase is the current phase of the kURL migration process Phase KURLMigrationPhase `json:"phase" enums:"Discovery,Preparation,ECInstall,DataTransfer,Completed" example:"Discovery"` // Message is a user-facing message describing the current status Message string `json:"message" example:"Discovering kURL cluster configuration"` // Progress is the completion percentage (0-100) Progress int `json:"progress" example:"25"` - // Error contains the error message if the migration failed + // Error contains the error message if the kURL migration failed Error string `json:"error,omitempty" validate:"optional" example:""` } diff --git a/cmd/installer/cli/upgrade.go b/cmd/installer/cli/upgrade.go index 850fd87863..3d774791b8 100644 --- a/cmd/installer/cli/upgrade.go +++ b/cmd/installer/cli/upgrade.go @@ -102,14 +102,14 @@ func UpgradeCmd(ctx context.Context, appSlug, appTitle string) *cobra.Command { // Check if this is a kURL cluster that needs migration to Embedded Cluster. kurlMigrationNeeded, err := detectKurlMigration(ctx) if err != nil { - return fmt.Errorf("failed to detect migration scenario: %w", err) + return fmt.Errorf("failed to detect kURL migration scenario: %w", err) } if kurlMigrationNeeded { logrus.Info("Preparing to upgrade from kURL to Embedded Cluster...") logrus.Info("") - // Start the API in migration mode + // Start the API in kURL migration mode if err := runKURLMigrationAPI(ctx, flags, appTitle); err != nil { return err } @@ -752,10 +752,10 @@ func runKURLMigrationAPI( return fmt.Errorf("failed to get size of embedded files: %w", err) } - // Create a minimal runtime config for migration mode + // Create a minimal runtime config for kURL migration mode rc := runtimeconfig.New(nil) - // Prepare API config for migration mode + // Prepare API config for kURL migration mode apiConfig := apiOptions{ APIConfig: apitypes.APIConfig{ InstallTarget: apitypes.InstallTarget(flags.target), @@ -766,7 +766,7 @@ func runKURLMigrationAPI( AirgapMetadata: airgapMetadata, EmbeddedAssetsSize: assetsSize, ReleaseData: releaseData, - Mode: apitypes.ModeUpgrade, // Use upgrade mode for migration + Mode: apitypes.ModeUpgrade, // Use upgrade mode for kURL migration LinuxConfig: apitypes.LinuxConfig{ RuntimeConfig: rc, diff --git a/web/src/types/api.ts b/web/src/types/api.ts index 4f5f49cfcd..376316c3e8 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -724,10 +724,10 @@ export interface paths { cookie?: never; }; /** - * Get the installation config for migration + * Get the installation config for kURL migration * @description Get the installation config extracted from kURL merged with EC defaults */ - get: operations["getMigrationInstallationConfig"]; + get: operations["getKURLMigrationInstallationConfig"]; put?: never; post?: never; delete?: never; @@ -764,10 +764,10 @@ export interface paths { cookie?: never; }; /** - * Get the status of the migration - * @description Get the current status and progress of the migration + * Get the status of the kURL migration + * @description Get the current status and progress of the kURL migration */ - get: operations["getMigrationStatus"]; + get: operations["getKURLMigrationStatus"]; put?: never; post?: never; delete?: never; @@ -1843,21 +1843,21 @@ export interface components { titles: string[]; }; /** - * @description Phase is the current phase of the migration process + * @description Phase is the current phase of the kURL migration process * @example Discovery * @enum {string} */ "types.KURLMigrationPhase": "Discovery" | "Preparation" | "ECInstall" | "DataTransfer" | "Completed"; /** - * @description State is the current state of the migration + * @description State is the current state of the kURL migration * @example InProgress * @enum {string} */ "types.KURLMigrationState": "NotStarted" | "InProgress" | "Completed" | "Failed"; - /** @description Current status and progress of a migration */ + /** @description Current status and progress of a kURL migration */ "types.KURLMigrationStatusResponse": { /** - * @description Error contains the error message if the migration failed + * @description Error contains the error message if the kURL migration failed * @example */ error?: string; @@ -1926,11 +1926,11 @@ export interface components { config?: components["schemas"]["types.LinuxInstallationConfig"]; transferMode: components["schemas"]["types.TransferMode"]; }; - /** @description Response returned when a migration is successfully started */ + /** @description Response returned when a kURL migration is successfully started */ "types.StartKURLMigrationResponse": { /** - * @description Message is a user-facing message about the migration status - * @example Migration started successfully + * @description Message is a user-facing message about the kURL migration status + * @example kURL migration started successfully */ message: string; /** @@ -1953,7 +1953,7 @@ export interface components { values: components["schemas"]["types.AppConfigValues"]; }; /** - * @description TransferMode specifies whether to copy or move data during migration + * @description TransferMode specifies whether to copy or move data during kURL migration * @example copy * @enum {string} */ @@ -3108,7 +3108,7 @@ export interface operations { }; }; }; - getMigrationInstallationConfig: { + getKURLMigrationInstallationConfig: { parameters: { query?: never; header?: never; @@ -3135,7 +3135,7 @@ export interface operations { path?: never; cookie?: never; }; - /** @description Start Migration Request */ + /** @description Start kURL Migration Request */ requestBody: { content: { "application/json": components["schemas"]["types.StartKURLMigrationRequest"]; @@ -3171,7 +3171,7 @@ export interface operations { }; }; }; - getMigrationStatus: { + getKURLMigrationStatus: { parameters: { query?: never; header?: never; From 83e9833eee356665471606b27d4374a08423616c Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 25 Nov 2025 19:46:25 -0500 Subject: [PATCH 29/37] f --- api/controllers/kurlmigration/controller.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/controllers/kurlmigration/controller.go b/api/controllers/kurlmigration/controller.go index f3dc613a9a..7d1ba2eda5 100644 --- a/api/controllers/kurlmigration/controller.go +++ b/api/controllers/kurlmigration/controller.go @@ -287,13 +287,12 @@ func (c *KURLMigrationController) Run(ctx context.Context) (finalErr error) { // TODO(sc-130983): Resume logic will be implemented in the orchestration story } - // Execute phases: Discovery → Preparation → ECInstall → DataTransfer → Completed + // Execute phases: Discovery → Preparation → ECInstall → DataTransfer phases := []types.KURLMigrationPhase{ types.KURLMigrationPhaseDiscovery, types.KURLMigrationPhasePreparation, types.KURLMigrationPhaseECInstall, types.KURLMigrationPhaseDataTransfer, - types.KURLMigrationPhaseCompleted, } for _, phase := range phases { From 5ee27a93b2a50e4a7302bb6749564f48f0e1aeef Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 1 Dec 2025 10:33:32 -0500 Subject: [PATCH 30/37] f --- proposals/kurl-migration-api-foundation.md | 394 +++++++++++---------- 1 file changed, 201 insertions(+), 193 deletions(-) diff --git a/proposals/kurl-migration-api-foundation.md b/proposals/kurl-migration-api-foundation.md index bc78691f5f..e9ec491e70 100644 --- a/proposals/kurl-migration-api-foundation.md +++ b/proposals/kurl-migration-api-foundation.md @@ -2,18 +2,18 @@ ## TL;DR (solution in one paragraph) -Build REST API endpoints to enable Admin Console UI integration for migrating single-node kURL clusters to Embedded Cluster V3. The API provides three core endpoints: GET /api/kurl-migration/config for configuration discovery, POST /api/kurl-migration/start for initiating async migration, and GET /api/kurl-migration/status for progress monitoring. This foundation enables the UI to guide users through migration while the backend orchestrates the complex multi-phase process of transitioning from kURL to EC without data loss. +Build REST API endpoints to enable Admin Console UI integration for migrating single-node kURL clusters to Embedded Cluster V3. The API provides three core endpoints: GET /api/linux/kurl-migration/config for configuration discovery, POST /api/linux/kurl-migration/start for initiating async kURL migration, and GET /api/linux/kurl-migration/status for progress monitoring. This foundation enables the UI to guide users through kURL migration while the backend orchestrates the complex multi-phase process of transitioning from kURL to EC without data loss. ## The problem -kURL users need a path to migrate to Embedded Cluster V3, but the migration process is complex, requiring careful orchestration of configuration extraction, network planning, data transfer, and service transitions. Without API endpoints, there's no way for the Admin Console UI to provide a guided migration experience. Users are affected by the inability to modernize their infrastructure, and we know from customer feedback that manual migration attempts have resulted in data loss and extended downtime. Metrics show 40% of kURL installations are candidates for migration. +kURL users need a path to migrate to Embedded Cluster V3, but the kURL migration process is complex, requiring careful orchestration of configuration extraction, network planning, data transfer, and service transitions. Without API endpoints, there's no way for the Admin Console UI to provide a guided kURL migration experience. Users are affected by the inability to modernize their infrastructure, and we know from customer feedback that manual kURL migration attempts have resulted in data loss and extended downtime. Metrics show 40% of kURL installations are candidates for migration. ## Prototype / design ### API Flow Diagram ``` ┌─────────────┐ GET /config ┌─────────────┐ -│ Admin │ ◄──────────────────► │ Migration │ +│ Admin │ ◄──────────────────► │kURL Migration│ │ Console │ │ API │ │ UI │ POST /start ────────►│ │ │ │ │ ┌────────┐ │ @@ -30,16 +30,17 @@ kURL users need a path to migrate to Embedded Cluster V3, but the migration proc ### Data Flow 1. UI requests config → API extracts kURL config, merges with EC defaults -2. UI posts user preferences → API validates, generates migration ID, starts async process -3. UI polls status → API returns current phase, progress, messages +2. UI posts user preferences → API validates, generates kURL migration ID, starts async process +3. UI polls status → API returns current kURL migration phase, progress, messages 4. Background process executes phases: Discovery → Preparation → ECInstall → DataTransfer → Completed ### Key Interfaces ```go type Controller interface { GetInstallationConfig(ctx) (LinuxInstallationConfigResponse, error) - StartMigration(ctx, transferMode, config) (migrationID string, error) - GetMigrationStatus(ctx) (MigrationStatusResponse, error) + StartKURLMigration(ctx, transferMode, config) (migrationID string, error) + GetKURLMigrationStatus(ctx) (KURLMigrationStatusResponse, error) + Run(ctx) error } type Manager interface { @@ -49,6 +50,7 @@ type Manager interface { GetECDefaults(ctx) (LinuxInstallationConfig, error) MergeConfigs(user, kurl, defaults) LinuxInstallationConfig + ValidateTransferMode(mode) error ExecutePhase(ctx, phase) error } @@ -57,9 +59,13 @@ func CalculateNonOverlappingCIDRs(kurlPodCIDR, kurlServiceCIDR, globalCIDR strin type Store interface { InitializeMigration(id, mode, config) error - GetStatus() (MigrationStatusResponse, error) + GetMigrationID() (string, error) + GetStatus() (KURLMigrationStatusResponse, error) + GetUserConfig() (LinuxInstallationConfig, error) + SetUserConfig(config) error SetState(state) error SetPhase(phase) error + SetError(errorMsg) error } ``` @@ -79,179 +85,173 @@ No new subagents or commands will be created in this PR. The API foundation prov **`api/routes.go`** - Route registration ```go -// Register migration routes under /api/kurl-migration/ with auth middleware +// Register kURL migration routes under /api/linux/kurl-migration/ with auth middleware // GET /config - Get installation configuration -// POST /start - Start migration with transfer mode and optional config -// GET /status - Poll migration status +// POST /start - Start kURL migration with transfer mode and optional config +// GET /status - Poll kURL migration status ``` **`api/handlers.go`** - Handler initialization ```go -// Add Migration field to LinuxHandlers struct -// Initialize migration store, manager, controller in NewLinuxHandlers() +// Add KURLMigration field to LinuxHandlers struct +// Initialize kURL migration store, manager, controller in NewLinuxHandlers() // Wire up dependencies: store -> manager -> controller -> handler ``` -**`api/internal/handlers/migration/handler.go`** - HTTP handlers with Swagger docs +**`api/internal/handlers/kurlmigration/handler.go`** - HTTP handlers with Swagger docs ```go type Handler struct { - logger *logrus.Logger - migrationController Controller - migrationStore Store + logger *logrus.Logger + kurlMigrationController Controller } -func NewHandler(controller Controller, store Store, logger *logrus.Logger) *Handler +func NewHandler(controller Controller, logger *logrus.Logger) *Handler // GetInstallationConfig returns kURL config merged with EC defaults (values/defaults/resolved) -// @Router /api/kurl-migration/config [get] +// @Router /api/linux/kurl-migration/config [get] func (h *Handler) GetInstallationConfig(w http.ResponseWriter, r *http.Request) { // Call controller.GetInstallationConfig(r.Context()) // Use utils.JSON() to return LinuxInstallationConfigResponse with 200 // Use utils.JSONError() to handle errors (controller returns typed errors) } -// PostStartMigration initiates migration with transfer mode and optional config overrides -// @Router /api/kurl-migration/start [post] -func (h *Handler) PostStartMigration(w http.ResponseWriter, r *http.Request) { - // Use utils.BindJSON() to parse StartMigrationRequest body - // Call controller.StartMigration(r.Context(), req.TransferMode, req.Config) - // Use utils.JSON() to return StartMigrationResponse with 200 +// PostStartKURLMigration initiates kURL migration with transfer mode and optional config overrides +// @Router /api/linux/kurl-migration/start [post] +func (h *Handler) PostStartKURLMigration(w http.ResponseWriter, r *http.Request) { + // Use utils.BindJSON() to parse StartKURLMigrationRequest body + // Call controller.StartKURLMigration(r.Context(), req.TransferMode, req.Config) + // Use utils.JSON() to return StartKURLMigrationResponse with 200 // Use utils.JSONError() to handle errors (controller returns typed errors like BadRequest/Conflict) } -// GetMigrationStatus returns current state, phase, progress, and errors -// @Router /api/kurl-migration/status [get] -func (h *Handler) GetMigrationStatus(w http.ResponseWriter, r *http.Request) { - // Call controller.GetMigrationStatus(r.Context()) - // Use utils.JSON() to return MigrationStatusResponse with 200 +// GetKURLMigrationStatus returns current state, phase, progress, and errors +// @Router /api/linux/kurl-migration/status [get] +func (h *Handler) GetKURLMigrationStatus(w http.ResponseWriter, r *http.Request) { + // Call controller.GetKURLMigrationStatus(r.Context()) + // Use utils.JSON() to return KURLMigrationStatusResponse with 200 // Use utils.JSONError() to handle errors (controller returns typed errors) } ``` -**`api/types/migration.go`** - Type definitions and errors +**`api/types/kurl_migration.go`** - Type definitions and errors ```go // Error constants var ( - ErrNoActiveMigration = errors.New("no active migration") - ErrMigrationAlreadyStarted = errors.New("migration already started") - ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") - ErrMigrationPhaseNotImplemented = errors.New("migration phase execution not yet implemented") + ErrNoActiveKURLMigration = errors.New("no active kURL migration") + ErrKURLMigrationAlreadyStarted = errors.New("kURL migration already started") + ErrInvalidTransferMode = errors.New("invalid transfer mode: must be 'copy' or 'move'") + ErrKURLMigrationPhaseNotImplemented = errors.New("kURL migration phase execution not yet implemented") ) -// MigrationState: NotStarted, InProgress, Completed, Failed -// MigrationPhase: Discovery, Preparation, ECInstall, DataTransfer, Completed +// KURLMigrationState: NotStarted, InProgress, Completed, Failed +// KURLMigrationPhase: Discovery, Preparation, ECInstall, DataTransfer, Completed -type StartMigrationRequest struct { +type StartKURLMigrationRequest struct { TransferMode string `json:"transferMode,omitempty"` // "copy" or "move", defaults to "copy" Config *LinuxInstallationConfig `json:"config,omitempty"` // Optional config overrides } -type StartMigrationResponse struct { +type StartKURLMigrationResponse struct { MigrationID string `json:"migrationId"` Message string `json:"message"` } -type MigrationStatusResponse struct { - State MigrationState `json:"state"` - Phase MigrationPhase `json:"phase"` - Message string `json:"message"` - Progress int `json:"progress"` // 0-100 - Error string `json:"error,omitempty"` - StartedAt string `json:"startedAt,omitempty"` // RFC3339 - CompletedAt string `json:"completedAt,omitempty"` // RFC3339 +type KURLMigrationStatusResponse struct { + State KURLMigrationState `json:"state"` + Phase KURLMigrationPhase `json:"phase"` + Message string `json:"message"` + Progress int `json:"progress"` // 0-100 + Error string `json:"error,omitempty"` + StartedAt string `json:"startedAt,omitempty"` // RFC3339 + CompletedAt string `json:"completedAt,omitempty"` // RFC3339 } ``` -**`api/controllers/migration/controller.go`** - Business logic orchestration +**`api/controllers/kurlmigration/controller.go`** - Business logic orchestration ```go type Controller interface { - GetInstallationConfig(ctx context.Context) (*types.LinuxInstallationConfigResponse, error) - StartMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (string, error) - GetMigrationStatus(ctx context.Context) (*types.MigrationStatusResponse, error) + GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) + StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) + GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) + Run(ctx context.Context) error } -// InstallationManager interface from api/internal/managers/linux/installation -type InstallationManager interface { - GetDefaults(rc runtimeconfig.RuntimeConfig) (types.LinuxInstallationConfig, error) - ValidateConfig(config types.LinuxInstallationConfig, managerPort int) error +type KURLMigrationController struct { + manager kurlmigrationmanager.Manager + store store.Store + installationManager linuxinstallation.InstallationManager + logger logrus.FieldLogger } -type MigrationController struct { - logger *logrus.Logger - store Store - manager Manager - installationManager InstallationManager // Reuses existing validation and defaults -} - -func NewController(store Store, manager Manager, installationMgr InstallationManager, logger *logrus.Logger) *MigrationController +func NewKURLMigrationController(opts ...ControllerOption) (*KURLMigrationController, error) // GetInstallationConfig retrieves and merges installation configuration -func (mc *MigrationController) GetInstallationConfig(ctx context.Context) (*types.LinuxInstallationConfigResponse, error) { +func (c *KURLMigrationController) GetInstallationConfig(ctx context.Context) (types.LinuxInstallationConfigResponse, error) { // Call manager.GetKurlConfig() to extract kURL config with non-overlapping CIDRs // Call manager.GetECDefaults() to get EC defaults - // Merge configs (kURL > defaults) + // Get user config from store (empty if not set yet) + // Merge configs (user > kURL > defaults) // Return response with values/defaults/resolved } -// StartMigration initializes and starts the migration process -func (mc *MigrationController) StartMigration(ctx context.Context, transferMode string, config *types.LinuxInstallationConfig) (string, error) { - // Check if migration already exists (return types.NewConflictError(ErrMigrationAlreadyStarted)) - // Default transferMode to "copy" if empty +// StartKURLMigration initializes and starts the kURL migration process +func (c *KURLMigrationController) StartKURLMigration(ctx context.Context, transferMode types.TransferMode, config types.LinuxInstallationConfig) (string, error) { // Validate transfer mode using manager.ValidateTransferMode() (return types.NewBadRequestError(err) if invalid) - // Get base config (kURL + defaults) using mc.GetInstallationConfig() - // Merge with user config (user > kURL > defaults) using manager.MergeConfigs() - // Validate final config using installationManager.ValidateConfig() (return types.NewBadRequestError(err) if invalid) - // Generate migration ID (uuid) - // Initialize migration in store - // Launch background goroutine mc.runMigration() - // Return migration ID immediately + // Check if kURL migration already exists (return types.NewConflictError(ErrKURLMigrationAlreadyStarted)) + // Generate UUID for kURL migration + // Get defaults and merge with user config (resolved = user > kURL > defaults) + // Store user-provided config for future reference + // Initialize kURL migration in store with resolved config + // Set initial state to NotStarted + // Launch background goroutine with detached context + // Return kURL migration ID immediately } -// GetMigrationStatus retrieves the current migration status -func (mc *MigrationController) GetMigrationStatus(ctx context.Context) (*types.MigrationStatusResponse, error) { - // Get migration from store - // Calculate progress based on phase (Discovery: 10%, Preparation: 30%, ECInstall: 50%, DataTransfer: 75%, Completed: 100%) - // Build and return MigrationStatusResponse +// GetKURLMigrationStatus retrieves the current kURL migration status +func (c *KURLMigrationController) GetKURLMigrationStatus(ctx context.Context) (types.KURLMigrationStatusResponse, error) { + // Get status from store + // Return types.NewNotFoundError(err) if ErrNoActiveKURLMigration + // Return status } -// runMigration executes migration phases in background (SKELETON ONLY in this PR) -func (mc *MigrationController) runMigration(ctx context.Context, migrationID string) { - // Set state to InProgress - // Set phase to Discovery - // Return ErrMigrationPhaseNotImplemented error (for dryrun testing) - // Set error in store - // Set state to Failed - // TODO (PR 8): Execute phases: Discovery, Preparation, ECInstall, DataTransfer, Completed +// Run is the internal orchestration loop (SKELETON ONLY in this PR) +func (c *KURLMigrationController) Run(ctx context.Context) error { + // Small delay to ensure HTTP response completes + // Defer handles all error cases by updating kURL migration state + // Get current state from store + // If InProgress, resume from current phase + // Execute phases: Discovery, Preparation, ECInstall, DataTransfer + // Set state to Completed + // TODO (PR sc-130983): Full phase implementations } - -func (mc *MigrationController) calculateProgress(phase types.MigrationPhase) int ``` -**`api/internal/managers/migration/manager.go`** - Core operations interface +**`api/internal/managers/kurlmigration/manager.go`** - Core operations interface ```go type Manager interface { - GetKurlConfig(ctx context.Context) (*types.LinuxInstallationConfig, error) - GetECDefaults(ctx context.Context) (*types.LinuxInstallationConfig, error) - MergeConfigs(user, kurl, defaults *types.LinuxInstallationConfig) *types.LinuxInstallationConfig - ValidateTransferMode(mode string) error + GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) + GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) + MergeConfigs(user, kurl, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig + ValidateTransferMode(mode types.TransferMode) error + ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error } -type manager struct { - logger *logrus.Logger - kubeClient client.Client - installationManager InstallationManager // For reusing existing validation +type kurlMigrationManager struct { + store kurlmigrationstore.Store + installationManager linuxinstallation.InstallationManager + logger logrus.FieldLogger } -func NewManager(kubeClient client.Client, installationMgr InstallationManager, logger *logrus.Logger) Manager +func NewManager(opts ...ManagerOption) Manager // GetECDefaults delegates to installationManager.GetDefaults() to reuse existing defaults logic -func (m *manager) GetECDefaults(ctx context.Context) (*types.LinuxInstallationConfig, error) { +func (m *kurlMigrationManager) GetECDefaults(ctx context.Context) (types.LinuxInstallationConfig, error) { // Call installationManager.GetDefaults(runtimeConfig) // Returns: AdminConsolePort: 30000, DataDirectory: /var/lib/embedded-cluster, GlobalCIDR, proxy defaults, etc. } // MergeConfigs merges configs with precedence: user > kURL > defaults -func (m *manager) MergeConfigs(user, kurl, defaults *types.LinuxInstallationConfig) *types.LinuxInstallationConfig { +func (m *kurlMigrationManager) MergeConfigs(user, kurl, defaults types.LinuxInstallationConfig) types.LinuxInstallationConfig { // Start with defaults // Override with kURL values (includes non-overlapping CIDRs) // Override with user values (highest precedence) @@ -259,83 +259,85 @@ func (m *manager) MergeConfigs(user, kurl, defaults *types.LinuxInstallationConf } // ValidateTransferMode checks mode is "copy" or "move" -func (m *manager) ValidateTransferMode(mode string) error +func (m *kurlMigrationManager) ValidateTransferMode(mode types.TransferMode) error + +// ExecutePhase executes a kURL migration phase (SKELETON ONLY in this PR) +func (m *kurlMigrationManager) ExecutePhase(ctx context.Context, phase types.KURLMigrationPhase) error { + // Returns ErrKURLMigrationPhaseNotImplemented for all phases in this PR + // TODO (PR sc-130983): Implement phase execution logic +} // NOTE: Config validation reuses installationManager.ValidateConfig() instead of duplicating validation logic // Validates: globalCIDR, podCIDR, serviceCIDR, networkInterface, adminConsolePort, localArtifactMirrorPort, dataDirectory ``` -**`api/internal/store/migration/store.go`** - In-memory state storage +**`api/internal/store/kurlmigration/store.go`** - In-memory state storage ```go +// Store provides methods for storing and retrieving kURL migration state type Store interface { - GetMigration() (*Migration, error) - InitializeMigration(migrationID, transferMode string, config *types.LinuxInstallationConfig) error - SetState(state types.MigrationState) error - SetPhase(phase types.MigrationPhase) error - SetMessage(message string) error + InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error + GetMigrationID() (string, error) + GetStatus() (types.KURLMigrationStatusResponse, error) + GetUserConfig() (types.LinuxInstallationConfig, error) + SetUserConfig(config types.LinuxInstallationConfig) error + SetState(state types.KURLMigrationState) error + SetPhase(phase types.KURLMigrationPhase) error SetError(errorMsg string) error } -type Migration struct { - MigrationID string - State types.MigrationState - Phase types.MigrationPhase - Message string - Error string - TransferMode string - Config *types.LinuxInstallationConfig - StartedAt time.Time - CompletedAt *time.Time +type memoryStore struct { + mu sync.RWMutex + migrationID string + state types.KURLMigrationState + phase types.KURLMigrationPhase + transferMode string + config types.LinuxInstallationConfig + userConfig types.LinuxInstallationConfig + errorMsg string + startedAt time.Time + completedAt *time.Time } -type inMemoryStore struct { - mu sync.RWMutex - migration *Migration -} - -type StoreOption func(*inMemoryStore) +func NewMemoryStore() Store -func WithMigration(migration Migration) StoreOption +// InitializeMigration creates new kURL migration, returns ErrKURLMigrationAlreadyStarted if exists +func (s *memoryStore) InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error -// NewInMemoryStore creates a new in-memory migration store with optional initialization -func NewInMemoryStore(opts ...StoreOption) Store { - // Initialize empty store - // Apply options (e.g., WithMigration for testing) - // Return store -} +// GetMigrationID returns current kURL migration ID, or ErrNoActiveKURLMigration if none exists +func (s *memoryStore) GetMigrationID() (string, error) -// GetMigration returns current migration with deep copy, or ErrNoActiveMigration if none exists -func (s *inMemoryStore) GetMigration() (*Migration, error) +// GetStatus returns current kURL migration status with all fields +func (s *memoryStore) GetStatus() (types.KURLMigrationStatusResponse, error) -// InitializeMigration creates new migration, returns ErrMigrationAlreadyStarted if exists -func (s *inMemoryStore) InitializeMigration(migrationID, transferMode string, config *types.LinuxInstallationConfig) error +// GetUserConfig returns user-provided config (empty if not set) +func (s *memoryStore) GetUserConfig() (types.LinuxInstallationConfig, error) -// SetState updates state, sets CompletedAt for Completed/Failed states -func (s *inMemoryStore) SetState(state types.MigrationState) error +// SetUserConfig stores user-provided config for reference +func (s *memoryStore) SetUserConfig(config types.LinuxInstallationConfig) error -// SetPhase updates current phase -func (s *inMemoryStore) SetPhase(phase types.MigrationPhase) error +// SetState updates kURL migration state, sets CompletedAt for Completed/Failed states +func (s *memoryStore) SetState(state types.KURLMigrationState) error -// SetMessage updates status message -func (s *inMemoryStore) SetMessage(message string) error +// SetPhase updates current kURL migration phase +func (s *memoryStore) SetPhase(phase types.KURLMigrationPhase) error -// SetError sets error message and Failed state -func (s *inMemoryStore) SetError(errorMsg string) error +// SetError sets error message (state is updated separately via SetState) +func (s *memoryStore) SetError(errorMsg string) error ``` **To Be Implemented:** **CLI-API Integration Pattern:** -The API leverages existing kURL detection utilities from the `pkg-new/kurl` package (implemented in story sc-130962). The CLI handles password export via `exportKurlPasswordHash()`, while the API focuses on configuration extraction and migration orchestration. This separation ensures the API doesn't duplicate CLI detection logic. +The API leverages existing kURL detection utilities from the `pkg-new/kurl` package (implemented in story sc-130962). The CLI handles password export via `exportKurlPasswordHash()`, while the API focuses on configuration extraction and kURL migration orchestration. This separation ensures the API doesn't duplicate CLI detection logic. -**`api/internal/managers/migration/kurl_config.go`** - Extract kURL configuration +**`api/internal/managers/kurlmigration/kurl_config.go`** - Extract kURL configuration ```go import ( "github.com/replicatedhq/embedded-cluster/pkg-new/kurl" ) // GetKurlConfig extracts configuration from kURL cluster and returns EC-ready config with non-overlapping CIDRs -func (m *Manager) GetKurlConfig(ctx context.Context) (*types.LinuxInstallationConfig, error) { +func (m *kurlMigrationManager) GetKurlConfig(ctx context.Context) (types.LinuxInstallationConfig, error) { // Use existing pkg-new/kurl.GetConfig() to get base kURL configuration // Extract kURL's pod/service CIDRs from kube-controller-manager // Extract admin console port, proxy settings from kotsadm resources @@ -365,7 +367,7 @@ func extractProxySettings(ctx context.Context, kurlClient client.Client) (*Proxy func extractNetworkInterface(ctx context.Context, kurlClient client.Client) (string, error) ``` -**`api/internal/managers/migration/network.go`** - CIDR calculation logic +**`api/internal/managers/kurlmigration/network.go`** - CIDR calculation logic ```go // calculateNonOverlappingCIDRs finds new CIDRs that don't overlap with kURL's existing ranges func calculateNonOverlappingCIDRs(kurlPodCIDR, kurlServiceCIDR, globalCIDR string) (newPodCIDR, newServiceCIDR string, err error) { @@ -390,9 +392,9 @@ func incrementCIDR(cidr string) (string, error) ### Handlers/Controllers -- Migration handlers are Linux-only (not available for Kubernetes target) -- Registered under authenticated routes with logging middleware -- No new Swagger/OpenAPI definitions needed (already annotated) +- kURL migration handlers are Linux-only (not available for Kubernetes target) +- Registered under authenticated routes with logging middleware at `/api/linux/kurl-migration/` +- Swagger/OpenAPI definitions included via handler annotations ### Toggle Strategy - Feature flag: None required (Linux-only feature) @@ -410,38 +412,40 @@ func incrementCIDR(cidr string) (string, error) ## Testing ### Unit Tests -**Controller Tests** (`api/controllers/migration/controller_test.go`): +**Controller Tests** (`api/controllers/kurlmigration/controller_test.go`): - GetInstallationConfig with various config combinations -- StartMigration with different transfer modes (copy/move) -- Migration already in progress returns 409 conflict (ErrMigrationAlreadyStarted) +- StartKURLMigration with different transfer modes (copy/move) +- kURL migration already in progress returns 409 conflict (ErrKURLMigrationAlreadyStarted) - Invalid transfer mode returns 400 bad request -- GetMigrationStatus with active/inactive migrations +- GetKURLMigrationStatus with active/inactive kURL migrations - Background goroutine execution and state transitions -**Manager Tests** (`api/internal/managers/migration/manager_test.go`): +**Manager Tests** (`api/internal/managers/kurlmigration/manager_test.go`): - Config merging precedence (user > kURL > defaults) - Transfer mode validation (copy/move only) - GetECDefaults delegates to InstallationManager.GetDefaults() - MergeConfigs properly overrides with correct precedence +- ExecutePhase returns ErrKURLMigrationPhaseNotImplemented (skeleton in this PR) -**Network Tests** (`api/internal/managers/migration/network_test.go` - CRITICAL): +**Network Tests** (`api/internal/managers/kurlmigration/network_test.go` - CRITICAL): - `TestCalculateNonOverlappingCIDRs_ExcludesKurlRanges()` - Verify EC ranges don't overlap kURL - `TestCalculateNonOverlappingCIDRs_MultipleExclusions()` - Test with multiple excluded ranges - `TestCalculateNonOverlappingCIDRs_WithinGlobalCIDR()` - Verify calculated ranges respect global CIDR - `TestCalculateNonOverlappingCIDRs_NoAvailableRange()` - Handle exhaustion scenarios -**kURL Config Tests** (`api/internal/managers/migration/kurl_config_test.go`): +**kURL Config Tests** (`api/internal/managers/kurlmigration/kurl_config_test.go`): - discoverKotsadmNamespace finds Service in default namespace first - discoverKotsadmNamespace falls back to searching all namespaces - extractAdminConsolePort reads NodePort from discovered Service - extractProxySettings reads env vars from kotsadm Deployment -**Store Tests** (`api/internal/store/migration/store_test.go`): -- NewInMemoryStore with WithMigration option for test initialization +**Store Tests** (`api/internal/store/kurlmigration/store_test.go`): +- NewMemoryStore initialization - Thread-safe concurrent access (multiple goroutines reading/writing) - State transitions (NotStarted → InProgress → Completed/Failed) -- Deep copy verification (GetMigration returns copy, not reference) -- InitializeMigration returns ErrMigrationAlreadyStarted when exists +- InitializeMigration returns ErrKURLMigrationAlreadyStarted when exists +- GetMigrationID returns ErrNoActiveKURLMigration when no kURL migration exists +- GetUserConfig/SetUserConfig for storing user-provided configuration ### Integration Tests - End-to-end API flow simulation @@ -451,23 +455,27 @@ func incrementCIDR(cidr string) (string, error) ### Dryrun Tests **Extend existing test:** `tests/dryrun/upgrade_kurl_migration_test.go::TestUpgradeKURLMigration` -The existing test validates CLI migration detection. Extend it to test the migration API foundation: +The existing test validates CLI kURL migration detection. Extend it to test the kURL migration API foundation: ```go func TestUpgradeKURLMigration(t *testing.T) { // Existing setup: ENABLE_V3=1, mock kURL kubeconfig, dryrun.KubeUtils // Existing setup: Create kurl-config ConfigMap in kube-system namespace - // Existing test: Verify CLI upgrade detection and messaging + // Existing setup: Create kotsadm Service and kotsadm-password Secret in default namespace - // NEW: Test Migration API endpoints + // Test kURL Migration API endpoints t.Run("migration API skeleton", func(t *testing.T) { - // Start the API server with migration mode - // POST /api/kurl-migration/start with transferMode="copy" + // Start the upgrade command in non-headless mode so API stays up + // Build API client and authenticate with password + + // POST /api/linux/kurl-migration/start with transferMode="copy" // Verify response: migrationID returned with 200 + // Verify response message: "kURL migration started successfully" - // GET /api/kurl-migration/status - // Verify response: state=Failed, error contains "migration phase execution not yet implemented" - // This validates ErrMigrationPhaseNotImplemented is properly returned + // GET /api/linux/kurl-migration/status (with polling) + // Verify kURL migration eventually reaches Failed state + // Verify error contains "kURL migration phase execution not yet implemented" + // This validates ErrKURLMigrationPhaseNotImplemented is properly returned }) } ``` @@ -476,9 +484,10 @@ func TestUpgradeKURLMigration(t *testing.T) { - Uses `dryrun.KubeUtils{}` for mock Kubernetes clients - Creates kURL kubeconfig at `kubeutils.KURLKubeconfigPath` - Creates `kurl-config` ConfigMap: `Data["kurl_install_directory"] = "/var/lib/kurl"` +- Creates `kotsadm` Service and `kotsadm-password` Secret for authentication - Uses `embedReleaseData()` helper for release artifacts -- Captures logrus output for assertion -- Runs actual CLI commands with flags +- Runs upgrade command with `--yes` flag in goroutine +- Waits for API to be ready, then tests endpoints **CIDR Exclusion Test** (critical validation): ```go @@ -519,27 +528,27 @@ No special deployment handling required. The API endpoints will be available imm ## Trade-offs **Chosen Approach: Async Background Processing** -- Optimizing for: UI responsiveness, handling long-running operations +- Optimizing for: UI responsiveness, handling long-running kURL migration operations - Trade-off: Complexity of status polling vs simplicity of synchronous calls -- Rationale: Migration can take 30+ minutes, sync calls would timeout +- Rationale: kURL migration can take 30+ minutes, sync calls would timeout **Chosen Approach: In-Memory Store (this PR)** - Optimizing for: Simplicity, fast iteration -- Trade-off: No persistence across restarts (added in PR 7) -- Rationale: Allows testing API flow before adding persistence complexity +- Trade-off: No persistence across restarts (added in PR sc-130972) +- Rationale: Allows testing kURL migration API flow before adding persistence complexity **Chosen Approach: Three-Endpoint Design** - Optimizing for: Clear separation of concerns, RESTful design - Trade-off: More endpoints vs single GraphQL-style endpoint -- Rationale: Follows existing API patterns, easier to test/document +- Rationale: Follows existing API patterns at `/api/linux/kurl-migration/`, easier to test/document ## Alternative solutions considered 1. **Single /migrate Endpoint with WebSocket** - Rejected: Adds WebSocket complexity, inconsistent with existing patterns -2. **Synchronous Migration Execution** - - Rejected: Would timeout on long migrations, poor UX +2. **Synchronous kURL Migration Execution** + - Rejected: Would timeout on long kURL migrations, poor UX 3. **Direct UI to Controller Communication** - Rejected: Breaks architectural layers, harder to test @@ -547,7 +556,7 @@ No special deployment handling required. The API endpoints will be available imm 4. **GraphQL API** - Rejected: Inconsistent with REST-based architecture -5. **Separate Migration Service** +5. **Separate kURL Migration Service** - Rejected: Adds deployment complexity, harder to maintain ## Research @@ -567,17 +576,16 @@ See detailed research document: [kurl-migration-api-foundation_research.md](./ku ## Checkpoints (PR plan) -**This PR (sc-130971): API Foundation** -- Complete handler implementation with Swagger docs -- Controller with async execution -- Manager skeleton with config merging -- In-memory store implementation -- Comprehensive unit tests -- Sets foundation for subsequent PRs +**This PR (sc-130971): kURL Migration API Foundation** +- Complete handler implementation with Swagger docs at `/api/linux/kurl-migration/` +- Controller with async execution (background goroutine with Run method) +- Manager with config merging and validation +- In-memory store implementation (memoryStore) +- Skeleton phase execution (returns ErrKURLMigrationPhaseNotImplemented) +- Comprehensive unit tests and dryrun tests +- Sets foundation for subsequent kURL migration PRs **Future PRs (not in this PR):** -- PR 7 (sc-130972): Add persistent file-based store -- PR 8 (sc-130983): Implement phase orchestration -- PR 9: Add kURL config extraction -- PR 10: Implement CIDR calculation -- PR 11: Add metrics reporting \ No newline at end of file +- PR sc-130972: Add persistent file-based store at `/var/lib/embedded-cluster/migration-state.json` +- PR sc-130983: Implement kURL migration phase orchestration (Discovery, Preparation, ECInstall, DataTransfer) +- Future PRs: Add kURL config extraction, CIDR calculation, metrics reporting \ No newline at end of file From 42a66be28de60a65af77ccf06e1643b9a5d40271 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Mon, 1 Dec 2025 11:18:20 -0500 Subject: [PATCH 31/37] migration status persistence --- api/api.go | 15 + .../store/kurlmigration/file_store.go | 342 ++++++++++ .../store/kurlmigration/file_store_test.go | 626 ++++++++++++++++++ api/internal/store/store.go | 12 + tests/dryrun/upgrade_kurl_migration_test.go | 30 +- 5 files changed, 1020 insertions(+), 5 deletions(-) create mode 100644 api/internal/store/kurlmigration/file_store.go create mode 100644 api/internal/store/kurlmigration/file_store_test.go diff --git a/api/api.go b/api/api.go index cf2351041c..08fba5b3b9 100644 --- a/api/api.go +++ b/api/api.go @@ -10,6 +10,7 @@ import ( kurlmigration "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" linuxinstall "github.com/replicatedhq/embedded-cluster/api/controllers/linux/install" linuxupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/linux/upgrade" + "github.com/replicatedhq/embedded-cluster/api/internal/store" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/replicatedhq/embedded-cluster/pkg-new/preflights" @@ -182,6 +183,20 @@ func New(cfg types.APIConfig, opts ...Option) (*API, error) { api.logger = l } + // Create kURL migration controller with file-based persistence if not provided + if api.kurlMigrationController == nil && cfg.InstallTarget == types.InstallTargetLinux { + dataDir := api.cfg.RuntimeConfig.EmbeddedClusterHomeDirectory() + store := store.NewStoreWithDataDir(dataDir) + controller, err := kurlmigration.NewKURLMigrationController( + kurlmigration.WithStore(store), + kurlmigration.WithLogger(api.logger), + ) + if err != nil { + return nil, fmt.Errorf("create kurl migration controller: %w", err) + } + api.kurlMigrationController = controller + } + if err := api.initClients(); err != nil { return nil, fmt.Errorf("init clients: %w", err) } diff --git a/api/internal/store/kurlmigration/file_store.go b/api/internal/store/kurlmigration/file_store.go new file mode 100644 index 0000000000..f343d2f9e0 --- /dev/null +++ b/api/internal/store/kurlmigration/file_store.go @@ -0,0 +1,342 @@ +// Package kurlmigration provides a store implementation for managing kURL to Embedded Cluster migration state. +// +// This package provides two implementations of the Store interface: +// - memoryStore: In-memory storage for testing and development +// - fileStore: File-based persistent storage for production use +// +// The fileStore implementation provides: +// - Atomic writes using temp file + os.Rename pattern +// - Thread-safe operations using sync.RWMutex +// - Data isolation via deep copy +// - Persistence across process restarts +package kurlmigration + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "sync" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/tiendc/go-deepcopy" +) + +var _ Store = &fileStore{} + +// fileStore implements Store interface with file-based persistence +type fileStore struct { + dataDir string // Base directory (e.g., /var/lib/embedded-cluster) + mu sync.RWMutex + pendingUserConfig *types.LinuxInstallationConfig // Temporary storage for user config set before initialization +} + +// persistedState represents the structure saved to migration-state.json +type persistedState struct { + MigrationID string `json:"migrationId"` + TransferMode string `json:"transferMode"` + Config types.LinuxInstallationConfig `json:"config"` // resolved/merged config + UserConfig types.LinuxInstallationConfig `json:"userConfig"` // user-provided config + Status types.KURLMigrationStatusResponse `json:"status"` +} + +// NewFileStore creates a new file-based store +// dataDir is the base directory where migration-state.json will be stored +func NewFileStore(dataDir string) Store { + return &fileStore{ + dataDir: dataDir, + } +} + +// statePath returns the full path to the migration state file +func (f *fileStore) statePath() string { + return filepath.Join(f.dataDir, "migration-state.json") +} + +// readState reads and unmarshals state from file +// Returns ErrNoActiveKURLMigration if file doesn't exist +func (f *fileStore) readState() (*persistedState, error) { + data, err := os.ReadFile(f.statePath()) + if err != nil { + if os.IsNotExist(err) { + return nil, types.ErrNoActiveKURLMigration + } + return nil, fmt.Errorf("read migration state file: %w", err) + } + + var state persistedState + if err := json.Unmarshal(data, &state); err != nil { + return nil, fmt.Errorf("unmarshal migration state: %w", err) + } + + return &state, nil +} + +// writeState writes state to file atomically using temp file + rename pattern +func (f *fileStore) writeState(state *persistedState) error { + data, err := json.MarshalIndent(state, "", " ") + if err != nil { + return fmt.Errorf("marshal migration state: %w", err) + } + + // Create temp file in same directory for atomic rename + tmpPath := f.statePath() + ".tmp" + if err := os.WriteFile(tmpPath, data, 0644); err != nil { + return fmt.Errorf("write temp migration state file: %w", err) + } + + // Atomic rename + if err := os.Rename(tmpPath, f.statePath()); err != nil { + // Clean up temp file on error + _ = os.Remove(tmpPath) + return fmt.Errorf("rename temp migration state file: %w", err) + } + + return nil +} + +func (f *fileStore) InitializeMigration(migrationID string, transferMode string, config types.LinuxInstallationConfig) error { + f.mu.Lock() + defer f.mu.Unlock() + + // Check if file already exists + if _, err := os.Stat(f.statePath()); err == nil { + return types.ErrKURLMigrationAlreadyStarted + } + + // Use pending user config if it was set before initialization + userConfig := types.LinuxInstallationConfig{} + if f.pendingUserConfig != nil { + if err := deepcopy.Copy(&userConfig, f.pendingUserConfig); err != nil { + return fmt.Errorf("copy pending user config: %w", err) + } + f.pendingUserConfig = nil // Clear pending config after using it + } + + // Create new state + state := &persistedState{ + MigrationID: migrationID, + TransferMode: transferMode, + Config: config, + UserConfig: userConfig, + Status: types.KURLMigrationStatusResponse{ + State: types.KURLMigrationStateNotStarted, + Phase: types.KURLMigrationPhaseDiscovery, + Message: "", + Progress: 0, + Error: "", + }, + } + + if err := f.writeState(state); err != nil { + return fmt.Errorf("initialize migration: %w", err) + } + + return nil +} + +func (f *fileStore) GetMigrationID() (string, error) { + f.mu.RLock() + defer f.mu.RUnlock() + + state, err := f.readState() + if err != nil { + return "", err + } + + return state.MigrationID, nil +} + +func (f *fileStore) GetStatus() (types.KURLMigrationStatusResponse, error) { + f.mu.RLock() + defer f.mu.RUnlock() + + state, err := f.readState() + if err != nil { + return types.KURLMigrationStatusResponse{}, err + } + + var status types.KURLMigrationStatusResponse + if err := deepcopy.Copy(&status, &state.Status); err != nil { + return types.KURLMigrationStatusResponse{}, fmt.Errorf("deep copy status: %w", err) + } + + return status, nil +} + +func (f *fileStore) SetState(newState types.KURLMigrationState) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + return err + } + + state.Status.State = newState + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set state: %w", err) + } + + return nil +} + +func (f *fileStore) SetPhase(phase types.KURLMigrationPhase) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + return err + } + + state.Status.Phase = phase + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set phase: %w", err) + } + + return nil +} + +func (f *fileStore) SetMessage(message string) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + return err + } + + state.Status.Message = message + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set message: %w", err) + } + + return nil +} + +func (f *fileStore) SetProgress(progress int) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + return err + } + + state.Status.Progress = progress + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set progress: %w", err) + } + + return nil +} + +func (f *fileStore) SetError(errMsg string) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + return err + } + + state.Status.Error = errMsg + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set error: %w", err) + } + + return nil +} + +func (f *fileStore) GetTransferMode() (string, error) { + f.mu.RLock() + defer f.mu.RUnlock() + + state, err := f.readState() + if err != nil { + return "", err + } + + return state.TransferMode, nil +} + +func (f *fileStore) GetConfig() (types.LinuxInstallationConfig, error) { + f.mu.RLock() + defer f.mu.RUnlock() + + state, err := f.readState() + if err != nil { + return types.LinuxInstallationConfig{}, err + } + + var config types.LinuxInstallationConfig + if err := deepcopy.Copy(&config, &state.Config); err != nil { + return types.LinuxInstallationConfig{}, fmt.Errorf("deep copy config: %w", err) + } + + return config, nil +} + +func (f *fileStore) GetUserConfig() (types.LinuxInstallationConfig, error) { + f.mu.RLock() + defer f.mu.RUnlock() + + state, err := f.readState() + if err != nil { + // Return empty config even if no migration exists (matches memoryStore behavior) + if err == types.ErrNoActiveKURLMigration { + // If there's a pending user config, return that instead of empty + if f.pendingUserConfig != nil { + var config types.LinuxInstallationConfig + if err := deepcopy.Copy(&config, f.pendingUserConfig); err != nil { + return types.LinuxInstallationConfig{}, fmt.Errorf("deep copy pending user config: %w", err) + } + return config, nil + } + return types.LinuxInstallationConfig{}, nil + } + return types.LinuxInstallationConfig{}, err + } + + var config types.LinuxInstallationConfig + if err := deepcopy.Copy(&config, &state.UserConfig); err != nil { + return types.LinuxInstallationConfig{}, fmt.Errorf("deep copy user config: %w", err) + } + + return config, nil +} + +func (f *fileStore) SetUserConfig(config types.LinuxInstallationConfig) error { + f.mu.Lock() + defer f.mu.Unlock() + + state, err := f.readState() + if err != nil { + // If no migration exists yet, store config in memory temporarily + // It will be persisted when InitializeMigration is called + if err == types.ErrNoActiveKURLMigration { + f.pendingUserConfig = &types.LinuxInstallationConfig{} + if err := deepcopy.Copy(f.pendingUserConfig, &config); err != nil { + return fmt.Errorf("deep copy pending user config: %w", err) + } + return nil + } + return err + } + + if err := deepcopy.Copy(&state.UserConfig, &config); err != nil { + return fmt.Errorf("deep copy user config: %w", err) + } + + if err := f.writeState(state); err != nil { + return fmt.Errorf("set user config: %w", err) + } + + return nil +} diff --git a/api/internal/store/kurlmigration/file_store_test.go b/api/internal/store/kurlmigration/file_store_test.go new file mode 100644 index 0000000000..4e60a82def --- /dev/null +++ b/api/internal/store/kurlmigration/file_store_test.go @@ -0,0 +1,626 @@ +package kurlmigration + +import ( + "encoding/json" + "os" + "path/filepath" + "sync" + "testing" + + "github.com/replicatedhq/embedded-cluster/api/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewFileStore(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + assert.NotNil(t, store) + + // Should return error when no kURL migration is initialized + _, err := store.GetMigrationID() + assert.ErrorIs(t, err, types.ErrNoActiveKURLMigration) +} + +func TestFileStore_InitializeMigration(t *testing.T) { + tests := []struct { + name string + setup func(Store) // Optional setup before test + migrationID string + transferMode string + config types.LinuxInstallationConfig + wantErr error + validate func(*testing.T, Store) // Optional additional validation + }{ + { + name: "success - creates file and initializes state", + migrationID: "test-migration-id", + transferMode: "copy", + config: types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/embedded-cluster", + }, + wantErr: nil, + validate: func(t *testing.T, s Store) { + // Verify migration ID + id, err := s.GetMigrationID() + require.NoError(t, err) + assert.Equal(t, "test-migration-id", id) + + // Verify transfer mode + mode, err := s.GetTransferMode() + require.NoError(t, err) + assert.Equal(t, "copy", mode) + + // Verify config + cfg, err := s.GetConfig() + require.NoError(t, err) + assert.Equal(t, "/var/lib/embedded-cluster", cfg.DataDirectory) + + // Verify initial status + status, err := s.GetStatus() + require.NoError(t, err) + assert.Equal(t, types.KURLMigrationStateNotStarted, status.State) + assert.Equal(t, types.KURLMigrationPhaseDiscovery, status.Phase) + assert.Equal(t, "", status.Message) + assert.Equal(t, 0, status.Progress) + assert.Equal(t, "", status.Error) + }, + }, + { + name: "error - already initialized", + migrationID: "second-id", + transferMode: "move", + config: types.LinuxInstallationConfig{}, + setup: func(s Store) { + _ = s.InitializeMigration("first-id", "copy", types.LinuxInstallationConfig{}) + }, + wantErr: types.ErrKURLMigrationAlreadyStarted, + }, + { + name: "success - includes pending user config", + migrationID: "test-id", + transferMode: "copy", + config: types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/ec", + }, + setup: func(s Store) { + // Set user config before initialization + _ = s.SetUserConfig(types.LinuxInstallationConfig{ + HTTPProxy: "http://proxy.example.com:8080", + }) + }, + wantErr: nil, + validate: func(t *testing.T, s Store) { + // Verify user config was persisted + userCfg, err := s.GetUserConfig() + require.NoError(t, err) + assert.Equal(t, "http://proxy.example.com:8080", userCfg.HTTPProxy) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + if tt.setup != nil { + tt.setup(store) + } + + err := store.InitializeMigration(tt.migrationID, tt.transferMode, tt.config) + + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + + // Verify file was created + statePath := filepath.Join(tmpDir, "migration-state.json") + _, err = os.Stat(statePath) + assert.NoError(t, err) + + if tt.validate != nil { + tt.validate(t, store) + } + }) + } +} + +func TestFileStore_SetState(t *testing.T) { + tests := []struct { + name string + setup func(Store) + newState types.KURLMigrationState + wantErr error + wantState types.KURLMigrationState + }{ + { + name: "error - no migration initialized", + newState: types.KURLMigrationStateInProgress, + wantErr: types.ErrNoActiveKURLMigration, + }, + { + name: "success - updates state", + setup: func(s Store) { + _ = s.InitializeMigration("test-id", "copy", types.LinuxInstallationConfig{}) + }, + newState: types.KURLMigrationStateInProgress, + wantErr: nil, + wantState: types.KURLMigrationStateInProgress, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + if tt.setup != nil { + tt.setup(store) + } + + err := store.SetState(tt.newState) + + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + + status, err := store.GetStatus() + require.NoError(t, err) + assert.Equal(t, tt.wantState, status.State) + + // Verify persistence across instances + store2 := NewFileStore(tmpDir) + status2, err := store2.GetStatus() + require.NoError(t, err) + assert.Equal(t, tt.wantState, status2.State) + }) + } +} + +func TestFileStore_SetPhase(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + err = store.SetPhase(types.KURLMigrationPhasePreparation) + require.NoError(t, err) + + status, err := store.GetStatus() + require.NoError(t, err) + assert.Equal(t, types.KURLMigrationPhasePreparation, status.Phase) + + // Verify persistence + store2 := NewFileStore(tmpDir) + status2, err := store2.GetStatus() + require.NoError(t, err) + assert.Equal(t, types.KURLMigrationPhasePreparation, status2.Phase) +} + +func TestFileStore_SetMessage(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + err = store.SetMessage("Preparing migration") + require.NoError(t, err) + + status, err := store.GetStatus() + require.NoError(t, err) + assert.Equal(t, "Preparing migration", status.Message) +} + +func TestFileStore_SetProgress(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + err = store.SetProgress(50) + require.NoError(t, err) + + status, err := store.GetStatus() + require.NoError(t, err) + assert.Equal(t, 50, status.Progress) +} + +func TestFileStore_SetError(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + err = store.SetError("kURL migration failed") + require.NoError(t, err) + + status, err := store.GetStatus() + require.NoError(t, err) + assert.Equal(t, "kURL migration failed", status.Error) +} + +func TestFileStore_GetConfig(t *testing.T) { + tests := []struct { + name string + setup func(Store) + wantErr error + validate func(*testing.T, types.LinuxInstallationConfig) + }{ + { + name: "success - returns deep copy preventing mutation", + setup: func(s Store) { + cfg := types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/ec", + PodCIDR: "10.32.0.0/20", + } + _ = s.InitializeMigration("test-id", "copy", cfg) + }, + wantErr: nil, + validate: func(t *testing.T, cfg types.LinuxInstallationConfig) { + assert.Equal(t, "/var/lib/ec", cfg.DataDirectory) + assert.Equal(t, "10.32.0.0/20", cfg.PodCIDR) + + // Mutate returned config + cfg.DataDirectory = "/tmp/modified" + cfg.PodCIDR = "192.168.0.0/16" + + // Verify mutations don't affect store + tmpDir := t.TempDir() + store2 := NewFileStore(tmpDir) + _ = store2.InitializeMigration("test", "copy", types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/ec", + PodCIDR: "10.32.0.0/20", + }) + cfg2, _ := store2.GetConfig() + assert.Equal(t, "/var/lib/ec", cfg2.DataDirectory) + assert.Equal(t, "10.32.0.0/20", cfg2.PodCIDR) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + if tt.setup != nil { + tt.setup(store) + } + + cfg, err := store.GetConfig() + + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + + if tt.validate != nil { + tt.validate(t, cfg) + } + }) + } +} + +func TestFileStore_GetUserConfig(t *testing.T) { + tests := []struct { + name string + setup func(Store) + wantErr error + validate func(*testing.T, types.LinuxInstallationConfig) + }{ + { + name: "success - returns empty when no migration", + wantErr: nil, + validate: func(t *testing.T, cfg types.LinuxInstallationConfig) { + assert.Equal(t, types.LinuxInstallationConfig{}, cfg) + }, + }, + { + name: "success - returns pending user config before initialization", + setup: func(s Store) { + _ = s.SetUserConfig(types.LinuxInstallationConfig{ + HTTPProxy: "http://proxy.example.com:8080", + }) + }, + wantErr: nil, + validate: func(t *testing.T, cfg types.LinuxInstallationConfig) { + assert.Equal(t, "http://proxy.example.com:8080", cfg.HTTPProxy) + }, + }, + { + name: "success - returns persisted user config after initialization", + setup: func(s Store) { + _ = s.SetUserConfig(types.LinuxInstallationConfig{ + HTTPProxy: "http://proxy.example.com:8080", + }) + _ = s.InitializeMigration("test-id", "copy", types.LinuxInstallationConfig{}) + }, + wantErr: nil, + validate: func(t *testing.T, cfg types.LinuxInstallationConfig) { + assert.Equal(t, "http://proxy.example.com:8080", cfg.HTTPProxy) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + if tt.setup != nil { + tt.setup(store) + } + + cfg, err := store.GetUserConfig() + + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + + if tt.validate != nil { + tt.validate(t, cfg) + } + }) + } +} + +func TestFileStore_SetUserConfig(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + // Set user config before initialization + userCfg := types.LinuxInstallationConfig{ + HTTPProxy: "http://proxy.example.com:8080", + } + err := store.SetUserConfig(userCfg) + require.NoError(t, err) + + // Verify it's stored in memory temporarily + retrievedCfg, err := store.GetUserConfig() + require.NoError(t, err) + assert.Equal(t, userCfg.HTTPProxy, retrievedCfg.HTTPProxy) + + // Initialize migration + err = store.InitializeMigration("test-id", "copy", types.LinuxInstallationConfig{}) + require.NoError(t, err) + + // Verify user config was persisted to file + store2 := NewFileStore(tmpDir) + retrievedCfg2, err := store2.GetUserConfig() + require.NoError(t, err) + assert.Equal(t, userCfg.HTTPProxy, retrievedCfg2.HTTPProxy) +} + +func TestFileStore_GetStatus(t *testing.T) { + tests := []struct { + name string + setup func(Store) + wantErr error + validate func(*testing.T, types.KURLMigrationStatusResponse) + }{ + { + name: "success - returns deep copy preventing mutation", + setup: func(s Store) { + _ = s.InitializeMigration("test-id", "copy", types.LinuxInstallationConfig{}) + _ = s.SetMessage("Original message") + _ = s.SetProgress(75) + }, + wantErr: nil, + validate: func(t *testing.T, status types.KURLMigrationStatusResponse) { + assert.Equal(t, "Original message", status.Message) + assert.Equal(t, 75, status.Progress) + + // Mutate returned status + status.Message = "Modified message" + status.Progress = 100 + + // Verify mutations don't affect store (test in separate instance) + tmpDir := t.TempDir() + store2 := NewFileStore(tmpDir) + _ = store2.InitializeMigration("test", "copy", types.LinuxInstallationConfig{}) + _ = store2.SetMessage("Original message") + _ = store2.SetProgress(75) + status2, _ := store2.GetStatus() + assert.Equal(t, "Original message", status2.Message) + assert.Equal(t, 75, status2.Progress) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + if tt.setup != nil { + tt.setup(store) + } + + status, err := store.GetStatus() + + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + + if tt.validate != nil { + tt.validate(t, status) + } + }) + } +} + +func TestFileStore_PersistenceAcrossInstances(t *testing.T) { + tmpDir := t.TempDir() + + // Create migration in first instance + store1 := NewFileStore(tmpDir) + config := types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/embedded-cluster", + } + err := store1.InitializeMigration("test-migration-id", "copy", config) + require.NoError(t, err) + + err = store1.SetState(types.KURLMigrationStateInProgress) + require.NoError(t, err) + + err = store1.SetPhase(types.KURLMigrationPhaseDataTransfer) + require.NoError(t, err) + + // Create second instance and verify data persists + store2 := NewFileStore(tmpDir) + + id, err := store2.GetMigrationID() + require.NoError(t, err) + assert.Equal(t, "test-migration-id", id) + + status, err := store2.GetStatus() + require.NoError(t, err) + assert.Equal(t, types.KURLMigrationStateInProgress, status.State) + assert.Equal(t, types.KURLMigrationPhaseDataTransfer, status.Phase) +} + +func TestFileStore_AtomicWriteWithTempFile(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + // Verify temp file doesn't exist after successful write + tempPath := filepath.Join(tmpDir, "migration-state.json.tmp") + _, err = os.Stat(tempPath) + assert.True(t, os.IsNotExist(err), "temp file should be cleaned up") + + // Verify final file exists + finalPath := filepath.Join(tmpDir, "migration-state.json") + _, err = os.Stat(finalPath) + assert.NoError(t, err) +} + +func TestFileStore_FilePermissions(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + statePath := filepath.Join(tmpDir, "migration-state.json") + info, err := os.Stat(statePath) + require.NoError(t, err) + + // Verify file permissions are 0644 + assert.Equal(t, os.FileMode(0644), info.Mode().Perm()) +} + +func TestFileStore_JSONFormatting(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{ + DataDirectory: "/var/lib/embedded-cluster", + } + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + // Read file and verify it's valid, pretty-printed JSON + statePath := filepath.Join(tmpDir, "migration-state.json") + data, err := os.ReadFile(statePath) + require.NoError(t, err) + + // Verify it's valid JSON + var jsonData map[string]interface{} + err = json.Unmarshal(data, &jsonData) + require.NoError(t, err) + + // Verify pretty-printing (should contain newlines and indentation) + assert.Contains(t, string(data), "\n") + assert.Contains(t, string(data), " ") +} + +func TestFileStore_CorruptedFile(t *testing.T) { + tmpDir := t.TempDir() + + // Write corrupted JSON file + statePath := filepath.Join(tmpDir, "migration-state.json") + err := os.WriteFile(statePath, []byte("corrupted json {{{"), 0644) + require.NoError(t, err) + + // Try to read from store + store := NewFileStore(tmpDir) + _, err = store.GetMigrationID() + assert.Error(t, err) + assert.Contains(t, err.Error(), "unmarshal migration state") +} + +func TestFileStore_ConcurrentReads(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + // Perform concurrent reads + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + _, err := store.GetStatus() + assert.NoError(t, err) + }() + } + wg.Wait() +} + +func TestFileStore_ConcurrentWrites(t *testing.T) { + tmpDir := t.TempDir() + store := NewFileStore(tmpDir) + + config := types.LinuxInstallationConfig{} + err := store.InitializeMigration("test-id", "copy", config) + require.NoError(t, err) + + // Perform concurrent writes + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func(progress int) { + defer wg.Done() + err := store.SetProgress(progress) + assert.NoError(t, err) + }(i * 10) + } + wg.Wait() + + // Verify final state is valid + status, err := store.GetStatus() + require.NoError(t, err) + assert.GreaterOrEqual(t, status.Progress, 0) + assert.LessOrEqual(t, status.Progress, 100) +} diff --git a/api/internal/store/store.go b/api/internal/store/store.go index 299790f336..19f17357c2 100644 --- a/api/internal/store/store.go +++ b/api/internal/store/store.go @@ -196,6 +196,18 @@ func NewMemoryStore(opts ...StoreOption) Store { return s } +// NewStoreWithDataDir creates a new store with file-based kURL migration persistence. +// dataDir is the base directory where kURL migration state will be persisted (e.g., /var/lib/embedded-cluster). +func NewStoreWithDataDir(dataDir string, opts ...StoreOption) Store { + // Prepend the file-based kURL migration store to the options list + // This allows users to override it if needed while still providing the file-based default + fileStoreOpts := append([]StoreOption{ + WithKURLMigrationStore(kurlmigration.NewFileStore(dataDir)), + }, opts...) + + return NewMemoryStore(fileStoreOpts...) +} + func (s *memoryStore) LinuxPreflightStore() linuxpreflight.Store { return s.linuxPreflightStore } diff --git a/tests/dryrun/upgrade_kurl_migration_test.go b/tests/dryrun/upgrade_kurl_migration_test.go index 5a7776bda9..ce905d8afc 100644 --- a/tests/dryrun/upgrade_kurl_migration_test.go +++ b/tests/dryrun/upgrade_kurl_migration_test.go @@ -125,9 +125,9 @@ func TestUpgradeKURLMigration(t *testing.T) { licenseFile := filepath.Join(tempDir, "license.yaml") require.NoError(t, os.WriteFile(licenseFile, []byte(licenseData), 0644)) - // Test Migration API endpoints - t.Run("migration API skeleton", func(t *testing.T) { - testMigrationAPIEndpoints(t, tempDir, licenseFile) + // Test Migration API endpoints and state persistence + t.Run("migration API with file persistence", func(t *testing.T) { + testMigrationAPIWithFilePersistence(t, tempDir, licenseFile) }) } @@ -156,8 +156,12 @@ func assertEventuallyMigrationState(t *testing.T, contextMsg string, expectedSta } } -// testMigrationAPIEndpoints tests the migration API endpoints return expected skeleton responses -func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) { +// testMigrationAPIWithFilePersistence tests the migration API endpoints and verifies state persistence to disk +func testMigrationAPIWithFilePersistence(t *testing.T, tempDir string, licenseFile string) { + // Clean up any existing migration state file from previous tests + statePath := filepath.Join("/var/lib/embedded-cluster", "migration-state.json") + os.Remove(statePath) + // Start the upgrade command in non-headless mode so API stays up // Use --yes to bypass prompts go func() { @@ -210,4 +214,20 @@ func testMigrationAPIEndpoints(t *testing.T, tempDir string, licenseFile string) require.Equal(t, apitypes.KURLMigrationStateFailed, finalStatus.State, "migration should be in Failed state") require.Contains(t, finalStatus.Error, "kURL migration phase execution not yet implemented", "expected skeleton error message in status") + + // Verify migration-state.json exists and contains the migration state + // statePath already declared at the beginning of the function + require.FileExists(t, statePath, "migration-state.json should exist") + + // Read and verify file contents + data, err := os.ReadFile(statePath) + require.NoError(t, err, "should be able to read migration-state.json") + + // Verify critical fields are persisted + require.Contains(t, string(data), startResp.MigrationID, "migration ID should be in file") + require.Contains(t, string(data), "\"state\":", "state field should be in JSON") + require.Contains(t, string(data), "\"phase\":", "phase field should be in JSON") + require.Contains(t, string(data), "Failed", "Failed state should be persisted") + + t.Logf("Successfully verified migration state persistence to %s", statePath) } From ef83d139a45d4912785c624cc68614106806d11b Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 12:09:51 -0500 Subject: [PATCH 32/37] f --- api/internal/store/kurlmigration/file_store_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api/internal/store/kurlmigration/file_store_test.go b/api/internal/store/kurlmigration/file_store_test.go index 4e60a82def..3b3b94941d 100644 --- a/api/internal/store/kurlmigration/file_store_test.go +++ b/api/internal/store/kurlmigration/file_store_test.go @@ -24,13 +24,13 @@ func TestNewFileStore(t *testing.T) { func TestFileStore_InitializeMigration(t *testing.T) { tests := []struct { - name string - setup func(Store) // Optional setup before test - migrationID string + name string + setup func(Store) // Optional setup before test + migrationID string transferMode string - config types.LinuxInstallationConfig - wantErr error - validate func(*testing.T, Store) // Optional additional validation + config types.LinuxInstallationConfig + wantErr error + validate func(*testing.T, Store) // Optional additional validation }{ { name: "success - creates file and initializes state", From 1c3c099b59cc1fc4de2ee24d4ec87aca9212183e Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 12:31:37 -0500 Subject: [PATCH 33/37] initialize controller in handler --- api/api.go | 15 ------------ api/handlers.go | 1 + .../handlers/kurlmigration/handler.go | 23 +++++++++++++++---- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/api/api.go b/api/api.go index 08fba5b3b9..cf2351041c 100644 --- a/api/api.go +++ b/api/api.go @@ -10,7 +10,6 @@ import ( kurlmigration "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" linuxinstall "github.com/replicatedhq/embedded-cluster/api/controllers/linux/install" linuxupgrade "github.com/replicatedhq/embedded-cluster/api/controllers/linux/upgrade" - "github.com/replicatedhq/embedded-cluster/api/internal/store" "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/replicatedhq/embedded-cluster/pkg-new/preflights" @@ -183,20 +182,6 @@ func New(cfg types.APIConfig, opts ...Option) (*API, error) { api.logger = l } - // Create kURL migration controller with file-based persistence if not provided - if api.kurlMigrationController == nil && cfg.InstallTarget == types.InstallTargetLinux { - dataDir := api.cfg.RuntimeConfig.EmbeddedClusterHomeDirectory() - store := store.NewStoreWithDataDir(dataDir) - controller, err := kurlmigration.NewKURLMigrationController( - kurlmigration.WithStore(store), - kurlmigration.WithLogger(api.logger), - ) - if err != nil { - return nil, fmt.Errorf("create kurl migration controller: %w", err) - } - api.kurlMigrationController = controller - } - if err := api.initClients(); err != nil { return nil, fmt.Errorf("init clients: %w", err) } diff --git a/api/handlers.go b/api/handlers.go index 5232704447..d66d6ee8b7 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -72,6 +72,7 @@ func (a *API) initHandlers() error { // kURL Migration handler (Linux only) kurlMigrationHandler, err := kurlmigrationhandler.New( + a.cfg, kurlmigrationhandler.WithLogger(a.logger), kurlmigrationhandler.WithController(a.kurlMigrationController), ) diff --git a/api/internal/handlers/kurlmigration/handler.go b/api/internal/handlers/kurlmigration/handler.go index d521114ca1..f6fafe20bf 100644 --- a/api/internal/handlers/kurlmigration/handler.go +++ b/api/internal/handlers/kurlmigration/handler.go @@ -6,20 +6,23 @@ import ( "github.com/replicatedhq/embedded-cluster/api/controllers/kurlmigration" "github.com/replicatedhq/embedded-cluster/api/internal/handlers/utils" + "github.com/replicatedhq/embedded-cluster/api/internal/store" + "github.com/replicatedhq/embedded-cluster/api/pkg/logger" "github.com/replicatedhq/embedded-cluster/api/types" "github.com/sirupsen/logrus" ) type Handler struct { + cfg types.APIConfig logger logrus.FieldLogger controller kurlmigration.Controller } type Option func(*Handler) -func WithLogger(logger logrus.FieldLogger) Option { +func WithLogger(log logrus.FieldLogger) Option { return func(h *Handler) { - h.logger = logger + h.logger = log } } @@ -29,15 +32,27 @@ func WithController(controller kurlmigration.Controller) Option { } } -func New(opts ...Option) (*Handler, error) { - h := &Handler{} +func New(cfg types.APIConfig, opts ...Option) (*Handler, error) { + h := &Handler{ + cfg: cfg, + } + for _, opt := range opts { opt(h) } + if h.logger == nil { + h.logger = logger.NewDiscardLogger() + } + // Create controller internally if not provided via option if h.controller == nil { + // Create file-based store for state persistence + dataDir := h.cfg.RuntimeConfig.EmbeddedClusterHomeDirectory() + s := store.NewStoreWithDataDir(dataDir) + controller, err := kurlmigration.NewKURLMigrationController( + kurlmigration.WithStore(s), kurlmigration.WithLogger(h.logger), ) if err != nil { From 6173adbc150d7c65754820e7aff8ada8f8e2a19c Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 13:04:10 -0500 Subject: [PATCH 34/37] address feedback --- .../store/kurlmigration/file_store.go | 7 +- .../store/kurlmigration/file_store_test.go | 92 ++++++++++++++++--- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/api/internal/store/kurlmigration/file_store.go b/api/internal/store/kurlmigration/file_store.go index f343d2f9e0..344d4edbc2 100644 --- a/api/internal/store/kurlmigration/file_store.go +++ b/api/internal/store/kurlmigration/file_store.go @@ -102,6 +102,9 @@ func (f *fileStore) InitializeMigration(migrationID string, transferMode string, // Check if file already exists if _, err := os.Stat(f.statePath()); err == nil { return types.ErrKURLMigrationAlreadyStarted + } else if !os.IsNotExist(err) { + // Other filesystem errors (permission denied, I/O errors, etc.) + return fmt.Errorf("check migration state file: %w", err) } // Use pending user config if it was set before initialization @@ -110,7 +113,6 @@ func (f *fileStore) InitializeMigration(migrationID string, transferMode string, if err := deepcopy.Copy(&userConfig, f.pendingUserConfig); err != nil { return fmt.Errorf("copy pending user config: %w", err) } - f.pendingUserConfig = nil // Clear pending config after using it } // Create new state @@ -132,6 +134,9 @@ func (f *fileStore) InitializeMigration(migrationID string, transferMode string, return fmt.Errorf("initialize migration: %w", err) } + // Clear pending config only after successful write + f.pendingUserConfig = nil + return nil } diff --git a/api/internal/store/kurlmigration/file_store_test.go b/api/internal/store/kurlmigration/file_store_test.go index 3b3b94941d..1c2ad14a46 100644 --- a/api/internal/store/kurlmigration/file_store_test.go +++ b/api/internal/store/kurlmigration/file_store_test.go @@ -24,13 +24,15 @@ func TestNewFileStore(t *testing.T) { func TestFileStore_InitializeMigration(t *testing.T) { tests := []struct { - name string - setup func(Store) // Optional setup before test - migrationID string - transferMode string - config types.LinuxInstallationConfig - wantErr error - validate func(*testing.T, Store) // Optional additional validation + name string + setup func(Store) // Optional setup before test + storeFactory func(*testing.T) Store + migrationID string + transferMode string + config types.LinuxInstallationConfig + wantErr error + wantErrContains string + validate func(*testing.T, Store) // Optional additional validation }{ { name: "success - creates file and initializes state", @@ -97,12 +99,62 @@ func TestFileStore_InitializeMigration(t *testing.T) { assert.Equal(t, "http://proxy.example.com:8080", userCfg.HTTPProxy) }, }, + { + name: "error - filesystem error on stat check", + storeFactory: func(t *testing.T) Store { + // Create a store with invalid dataDir to trigger filesystem errors + tmpDir := t.TempDir() + filePath := filepath.Join(tmpDir, "not-a-directory") + err := os.WriteFile(filePath, []byte("test"), 0644) + require.NoError(t, err) + return NewFileStore(filePath) + }, + migrationID: "test-id", + transferMode: "copy", + config: types.LinuxInstallationConfig{}, + wantErrContains: "check migration state file", + }, + { + name: "error - pending user config preserved on write failure", + storeFactory: func(t *testing.T) Store { + // Create a directory with read+execute but not write permissions + // This allows stat check to pass but write to fail + tmpDir := t.TempDir() + err := os.Chmod(tmpDir, 0555) // Read+execute, no write + require.NoError(t, err) + return NewFileStore(tmpDir) + }, + setup: func(s Store) { + // Set user config before initialization + _ = s.SetUserConfig(types.LinuxInstallationConfig{ + HTTPProxy: "http://proxy.example.com:8080", + }) + }, + migrationID: "test-id", + transferMode: "copy", + config: types.LinuxInstallationConfig{}, + wantErrContains: "initialize migration", + validate: func(t *testing.T, s Store) { + // Verify pending user config is still available after failed write + userCfg, err := s.GetUserConfig() + require.NoError(t, err) + assert.Equal(t, "http://proxy.example.com:8080", userCfg.HTTPProxy) + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tmpDir := t.TempDir() - store := NewFileStore(tmpDir) + var store Store + var tmpDir string + + // Use custom store factory if provided, otherwise create default + if tt.storeFactory != nil { + store = tt.storeFactory(t) + } else { + tmpDir = t.TempDir() + store = NewFileStore(tmpDir) + } if tt.setup != nil { tt.setup(store) @@ -112,15 +164,29 @@ func TestFileStore_InitializeMigration(t *testing.T) { if tt.wantErr != nil { assert.ErrorIs(t, err, tt.wantErr) + if tt.validate != nil { + tt.validate(t, store) + } + return + } + + if tt.wantErrContains != "" { + assert.Error(t, err) + assert.Contains(t, err.Error(), tt.wantErrContains) + if tt.validate != nil { + tt.validate(t, store) + } return } require.NoError(t, err) - // Verify file was created - statePath := filepath.Join(tmpDir, "migration-state.json") - _, err = os.Stat(statePath) - assert.NoError(t, err) + // Verify file was created (only check if we have tmpDir) + if tmpDir != "" { + statePath := filepath.Join(tmpDir, "migration-state.json") + _, err = os.Stat(statePath) + assert.NoError(t, err) + } if tt.validate != nil { tt.validate(t, store) From 852656ecf1a5b1426dcffb9d5fa50a4fb49513a2 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 13:10:01 -0500 Subject: [PATCH 35/37] fix test failure --- api/internal/store/kurlmigration/file_store.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/internal/store/kurlmigration/file_store.go b/api/internal/store/kurlmigration/file_store.go index 344d4edbc2..7b4a4f296e 100644 --- a/api/internal/store/kurlmigration/file_store.go +++ b/api/internal/store/kurlmigration/file_store.go @@ -79,6 +79,11 @@ func (f *fileStore) writeState(state *persistedState) error { return fmt.Errorf("marshal migration state: %w", err) } + // Ensure parent directory exists + if err := os.MkdirAll(f.dataDir, 0755); err != nil { + return fmt.Errorf("create data directory: %w", err) + } + // Create temp file in same directory for atomic rename tmpPath := f.statePath() + ".tmp" if err := os.WriteFile(tmpPath, data, 0644); err != nil { From 4ee5ceb5328d11b6ff277142c2c0d33af3d133d0 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 13:21:39 -0500 Subject: [PATCH 36/37] fix unit tests --- cmd/installer/cli/api_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/installer/cli/api_test.go b/cmd/installer/cli/api_test.go index 2d9384b28d..83d884fae1 100644 --- a/cmd/installer/cli/api_test.go +++ b/cmd/installer/cli/api_test.go @@ -268,9 +268,13 @@ func setupMockRuntimeConfig(t *testing.T) *runtimeconfig.MockRuntimeConfig { err := os.WriteFile(helmPath, []byte(mockK8sServer.URL), 0644) require.NoError(t, err) + // Create temp directory for embedded cluster home + dataDir := t.TempDir() + rc := &runtimeconfig.MockRuntimeConfig{} rc.On("GetKubernetesEnvSettings").Return(helmcli.New()) rc.On("PathToEmbeddedClusterBinary", "helm").Return(helmPath, nil) + rc.On("EmbeddedClusterHomeDirectory").Return(dataDir) return rc } From a77b58b61fda48e1d492f4d0f9652326d9ccf121 Mon Sep 17 00:00:00 2001 From: Diamon Wiggins Date: Tue, 2 Dec 2025 15:29:40 -0500 Subject: [PATCH 37/37] address feedback --- api/internal/store/kurlmigration/file_store.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api/internal/store/kurlmigration/file_store.go b/api/internal/store/kurlmigration/file_store.go index 7b4a4f296e..598967bc12 100644 --- a/api/internal/store/kurlmigration/file_store.go +++ b/api/internal/store/kurlmigration/file_store.go @@ -331,10 +331,12 @@ func (f *fileStore) SetUserConfig(config types.LinuxInstallationConfig) error { // If no migration exists yet, store config in memory temporarily // It will be persisted when InitializeMigration is called if err == types.ErrNoActiveKURLMigration { - f.pendingUserConfig = &types.LinuxInstallationConfig{} - if err := deepcopy.Copy(f.pendingUserConfig, &config); err != nil { + tempConfig := &types.LinuxInstallationConfig{} + if err := deepcopy.Copy(tempConfig, &config); err != nil { return fmt.Errorf("deep copy pending user config: %w", err) } + // Only assign after successful copy + f.pendingUserConfig = tempConfig return nil } return err