diff --git a/cmd/api/api/instances.go b/cmd/api/api/instances.go index ba5b448a..1e123ec5 100644 --- a/cmd/api/api/instances.go +++ b/cmd/api/api/instances.go @@ -798,6 +798,57 @@ func (s *ApiService) StatInstancePath(ctx context.Context, request oapi.StatInst return response, nil } +// UpdateEgressSecrets updates egress proxy secret env values on a running instance +// The id parameter can be an instance ID, name, or ID prefix +// Note: Resolution is handled by ResolveResource middleware +func (s *ApiService) UpdateEgressSecrets(ctx context.Context, request oapi.UpdateEgressSecretsRequestObject) (oapi.UpdateEgressSecretsResponseObject, error) { + inst := mw.GetResolvedInstance[instances.Instance](ctx) + if inst == nil { + return oapi.UpdateEgressSecrets500JSONResponse{ + Code: "internal_error", + Message: "resource not resolved", + }, nil + } + log := logger.FromContext(ctx) + + if request.Body == nil { + return oapi.UpdateEgressSecrets400JSONResponse{ + Code: "invalid_request", + Message: "request body is required", + }, nil + } + + env := make(map[string]string) + if request.Body.Env != nil { + env = request.Body.Env + } + + result, err := s.InstanceManager.UpdateEgressSecrets(ctx, inst.Id, instances.UpdateEgressSecretsRequest{ + Env: env, + }) + if err != nil { + switch { + case errors.Is(err, instances.ErrInvalidState): + return oapi.UpdateEgressSecrets409JSONResponse{ + Code: "invalid_state", + Message: err.Error(), + }, nil + case errors.Is(err, instances.ErrInvalidRequest): + return oapi.UpdateEgressSecrets400JSONResponse{ + Code: "invalid_request", + Message: err.Error(), + }, nil + default: + log.ErrorContext(ctx, "failed to update egress secrets", "error", err) + return oapi.UpdateEgressSecrets500JSONResponse{ + Code: "internal_error", + Message: "failed to update egress secrets", + }, nil + } + } + return oapi.UpdateEgressSecrets200JSONResponse(instanceToOAPI(*result)), nil +} + // AttachVolume attaches a volume to an instance (not yet implemented) func (s *ApiService) AttachVolume(ctx context.Context, request oapi.AttachVolumeRequestObject) (oapi.AttachVolumeResponseObject, error) { return oapi.AttachVolume500JSONResponse{ diff --git a/lib/builds/manager_test.go b/lib/builds/manager_test.go index a3765d5f..2bf117d4 100644 --- a/lib/builds/manager_test.go +++ b/lib/builds/manager_test.go @@ -163,6 +163,10 @@ func (m *mockInstanceManager) SetResourceValidator(v instances.ResourceValidator // no-op for mock } +func (m *mockInstanceManager) UpdateEgressSecrets(ctx context.Context, id string, req instances.UpdateEgressSecretsRequest) (*instances.Instance, error) { + return nil, nil +} + func (m *mockInstanceManager) GetVsockDialer(ctx context.Context, instanceID string) (hypervisor.VsockDialer, error) { return nil, nil } diff --git a/lib/egressproxy/service.go b/lib/egressproxy/service.go index 75cd2e7f..ca956186 100644 --- a/lib/egressproxy/service.go +++ b/lib/egressproxy/service.go @@ -217,6 +217,28 @@ func compileHeaderInjectRules(cfgRules []HeaderInjectRuleConfig) ([]headerInject return out, nil } +// UpdateHeaderInjectRules replaces the header injection rules for an already-registered +// instance. Unlike RegisterInstance this does NOT re-apply iptables enforcement — it +// only updates the in-memory policy used for MITM header rewriting. The instance must +// have been previously registered via RegisterInstance. +func (s *Service) UpdateHeaderInjectRules(instanceID string, rules []HeaderInjectRuleConfig) error { + s.mu.Lock() + defer s.mu.Unlock() + + sourceIP, ok := s.sourceIPByInstance[instanceID] + if !ok { + return fmt.Errorf("instance %s not registered with egress proxy", instanceID) + } + + compiled, err := compileHeaderInjectRules(rules) + if err != nil { + return err + } + + s.policiesBySourceIP[sourceIP] = sourcePolicy{headerInjectRules: compiled} + return nil +} + func (s *Service) UnregisterInstance(_ context.Context, instanceID string) { s.mu.Lock() sourceIP, ok := s.sourceIPByInstance[instanceID] diff --git a/lib/instances/egress_proxy_integration_test.go b/lib/instances/egress_proxy_integration_test.go index 96fdd86c..a398f828 100644 --- a/lib/instances/egress_proxy_integration_test.go +++ b/lib/instances/egress_proxy_integration_test.go @@ -128,6 +128,33 @@ func TestEgressProxyRewritesHTTPSHeaders(t *testing.T) { require.Equal(t, 0, blockedExitCode, "curl output: %s", blockedOutput) require.Equal(t, "", blockedOutput) + // --- Phase 2: Update egress proxy secrets (key rotation) --- + t.Log("Updating egress proxy secret to rotated key...") + updatedInst, err := manager.UpdateEgressSecrets(ctx, inst.Id, UpdateEgressSecretsRequest{ + Env: map[string]string{ + "OUTBOUND_OPENAI_KEY": "rotated-key-456", + }, + }) + require.NoError(t, err) + require.NotNil(t, updatedInst) + + // Verify the guest still sees the mock value (unchanged) + envOutput2, envExitCode2, err := execCommand(ctx, inst, "sh", "-lc", "printf '%s' \"$OUTBOUND_OPENAI_KEY\"") + require.NoError(t, err) + require.Equal(t, 0, envExitCode2) + require.Equal(t, "mock-OUTBOUND_OPENAI_KEY", envOutput2, "guest should still see mock value after secret rotation") + + // Verify the proxy now injects the rotated key + rotatedCmd := fmt.Sprintf( + "NO_PROXY= no_proxy= curl -k -sS https://%s:%s", + targetHost, targetPort, + ) + rotatedOutput, rotatedExitCode, err := execCommand(ctx, inst, "sh", "-lc", rotatedCmd) + require.NoError(t, err) + require.Equal(t, 0, rotatedExitCode, "curl output: %s", rotatedOutput) + require.Contains(t, rotatedOutput, "Bearer rotated-key-456", "proxy should inject rotated key") + require.NotContains(t, rotatedOutput, "real-openai-key-123", "proxy should no longer inject old key") + require.NoError(t, manager.DeleteInstance(ctx, inst.Id)) deleted = true } diff --git a/lib/instances/manager.go b/lib/instances/manager.go index 8305a0c5..21bb9a31 100644 --- a/lib/instances/manager.go +++ b/lib/instances/manager.go @@ -41,6 +41,7 @@ type Manager interface { StartInstance(ctx context.Context, id string, req StartInstanceRequest) (*Instance, error) StreamInstanceLogs(ctx context.Context, id string, tail int, follow bool, source LogSource) (<-chan string, error) RotateLogs(ctx context.Context, maxBytes int64, maxFiles int) error + UpdateEgressSecrets(ctx context.Context, id string, req UpdateEgressSecretsRequest) (*Instance, error) AttachVolume(ctx context.Context, id string, volumeId string, req AttachVolumeRequest) (*Instance, error) DetachVolume(ctx context.Context, id string, volumeId string) (*Instance, error) // ListInstanceAllocations returns resource allocations for all instances. @@ -441,6 +442,17 @@ func (m *manager) RotateLogs(ctx context.Context, maxBytes int64, maxFiles int) return lastErr } +// UpdateEgressSecrets updates the real credential values used by the egress proxy +// for header injection on a running instance. This enables key rotation without +// restarting the VM. The guest continues to see mock values — only the host-side +// proxy rules are updated. +func (m *manager) UpdateEgressSecrets(ctx context.Context, id string, req UpdateEgressSecretsRequest) (*Instance, error) { + lock := m.getInstanceLock(id) + lock.Lock() + defer lock.Unlock() + return m.updateEgressSecrets(ctx, id, req) +} + // AttachVolume attaches a volume to an instance (not yet implemented) func (m *manager) AttachVolume(ctx context.Context, id string, volumeId string, req AttachVolumeRequest) (*Instance, error) { return nil, fmt.Errorf("attach volume not yet implemented") diff --git a/lib/instances/types.go b/lib/instances/types.go index 8dc48837..4ad2144c 100644 --- a/lib/instances/types.go +++ b/lib/instances/types.go @@ -267,6 +267,11 @@ type ForkSnapshotRequest struct { TargetHypervisor hypervisor.Type // Optional, allowed only for Stopped snapshots } +// UpdateEgressSecretsRequest is the domain request for updating egress proxy credential env values. +type UpdateEgressSecretsRequest struct { + Env map[string]string // Map of env var names to new secret values +} + // AttachVolumeRequest is the domain request for attaching a volume (used for API compatibility) type AttachVolumeRequest struct { MountPath string diff --git a/lib/instances/update_egress_secrets.go b/lib/instances/update_egress_secrets.go new file mode 100644 index 00000000..6443bae1 --- /dev/null +++ b/lib/instances/update_egress_secrets.go @@ -0,0 +1,89 @@ +package instances + +import ( + "context" + "fmt" + "strings" + + "github.com/kernel/hypeman/lib/logger" +) + +// updateEgressSecrets performs the actual update of egress proxy secret env values. +// Caller must hold the instance write lock. +func (m *manager) updateEgressSecrets(ctx context.Context, id string, req UpdateEgressSecretsRequest) (*Instance, error) { + log := logger.FromContext(ctx) + log.InfoContext(ctx, "updating egress proxy secrets", "instance_id", id) + + // 1. Load and validate instance state + meta, err := m.loadMetadata(id) + if err != nil { + return nil, err + } + inst := m.toInstance(ctx, meta) + stored := &meta.StoredMetadata + + if inst.State != StateRunning && inst.State != StateInitializing { + return nil, fmt.Errorf("%w: instance must be running (current state: %s)", ErrInvalidState, inst.State) + } + + // 2. Validate egress proxy is enabled + if stored.NetworkEgress == nil || !stored.NetworkEgress.Enabled { + return nil, fmt.Errorf("%w: egress proxy is not enabled on this instance", ErrInvalidState) + } + if len(stored.Credentials) == 0 { + return nil, fmt.Errorf("%w: no credential policies configured on this instance", ErrInvalidRequest) + } + + // 3. Validate the request env vars + if len(req.Env) == 0 { + return nil, fmt.Errorf("%w: env must contain at least one entry", ErrInvalidRequest) + } + + // Build set of env var names referenced by credential policies + referencedEnvVars := make(map[string]bool) + for _, policy := range stored.Credentials { + referencedEnvVars[policy.Source.Env] = true + } + + for envName, envValue := range req.Env { + if !referencedEnvVars[envName] { + return nil, fmt.Errorf("%w: env var %q is not referenced by any credential policy", ErrInvalidRequest, envName) + } + if strings.TrimSpace(envValue) == "" { + return nil, fmt.Errorf("%w: env var %q must be non-empty", ErrInvalidRequest, envName) + } + } + + // 4. Update the stored env values + for envName, envValue := range req.Env { + stored.Env[envName] = envValue + } + + // 5. Rebuild and update the proxy inject rules + newRules := buildEgressProxyInjectRules(stored.NetworkEgress, stored.Credentials, stored.Env) + + m.egressProxyMu.Lock() + svc := m.egressProxy + m.egressProxyMu.Unlock() + + if svc == nil { + return nil, fmt.Errorf("egress proxy service is not running") + } + + if err := svc.UpdateHeaderInjectRules(id, newRules); err != nil { + return nil, fmt.Errorf("update egress proxy rules: %w", err) + } + + // 6. Persist updated metadata + meta = &metadata{StoredMetadata: *stored} + if err := m.saveMetadata(meta); err != nil { + log.ErrorContext(ctx, "failed to save metadata after egress secrets update", "instance_id", id, "error", err) + return nil, fmt.Errorf("save metadata: %w", err) + } + + log.InfoContext(ctx, "egress proxy secrets updated", "instance_id", id, "updated_vars", len(req.Env)) + + // 7. Return current instance state + finalInst := m.toInstanceWithoutHydration(ctx, meta) + return &finalInst, nil +} diff --git a/lib/instances/update_egress_secrets_test.go b/lib/instances/update_egress_secrets_test.go new file mode 100644 index 00000000..1a812ccc --- /dev/null +++ b/lib/instances/update_egress_secrets_test.go @@ -0,0 +1,65 @@ +package instances + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestBuildEgressProxyInjectRules_AfterSecretUpdate(t *testing.T) { + t.Parallel() + + egressPolicy := &NetworkEgressPolicy{Enabled: true} + credentials := map[string]CredentialPolicy{ + "API_KEY": { + Source: CredentialSource{Env: "API_KEY"}, + Inject: []CredentialInjectRule{ + { + Hosts: []string{"api.example.com"}, + As: CredentialInjectAs{ + Header: "Authorization", + Format: "Bearer ${value}", + }, + }, + }, + }, + } + + // Initial env + env := map[string]string{"API_KEY": "original-secret"} + rules := buildEgressProxyInjectRules(egressPolicy, credentials, env) + require.Len(t, rules, 1) + assert.Equal(t, "Bearer original-secret", rules[0].HeaderValue) + + // After rotation + env["API_KEY"] = "rotated-secret" + rules = buildEgressProxyInjectRules(egressPolicy, credentials, env) + require.Len(t, rules, 1) + assert.Equal(t, "Bearer rotated-secret", rules[0].HeaderValue) +} + +func TestValidateCredentialEnvBindings_AfterUpdate(t *testing.T) { + t.Parallel() + + credentials := map[string]CredentialPolicy{ + "API_KEY": { + Source: CredentialSource{Env: "API_KEY"}, + Inject: []CredentialInjectRule{ + {As: CredentialInjectAs{Header: "X-Key", Format: "${value}"}}, + }, + }, + } + + // Valid update + env := map[string]string{"API_KEY": "new-key"} + assert.NoError(t, validateCredentialEnvBindings(credentials, env)) + + // Empty value + env["API_KEY"] = " " + assert.Error(t, validateCredentialEnvBindings(credentials, env)) + + // Missing key + delete(env, "API_KEY") + assert.Error(t, validateCredentialEnvBindings(credentials, env)) +} diff --git a/lib/oapi/oapi.go b/lib/oapi/oapi.go index 161067ad..69b30e00 100644 --- a/lib/oapi/oapi.go +++ b/lib/oapi/oapi.go @@ -1,6 +1,6 @@ // Package oapi provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.6.0 DO NOT EDIT. package oapi import ( @@ -36,6 +36,20 @@ const ( Status BuildEventType = "status" ) +// Valid indicates whether the value is a known member of the BuildEventType enum. +func (e BuildEventType) Valid() bool { + switch e { + case Heartbeat: + return true + case Log: + return true + case Status: + return true + default: + return false + } +} + // Defines values for BuildStatus. const ( BuildStatusBuilding BuildStatus = "building" @@ -46,6 +60,26 @@ const ( BuildStatusReady BuildStatus = "ready" ) +// Valid indicates whether the value is a known member of the BuildStatus enum. +func (e BuildStatus) Valid() bool { + switch e { + case BuildStatusBuilding: + return true + case BuildStatusCancelled: + return true + case BuildStatusFailed: + return true + case BuildStatusPushing: + return true + case BuildStatusQueued: + return true + case BuildStatusReady: + return true + default: + return false + } +} + // Defines values for CreateInstanceRequestHypervisor. const ( CreateInstanceRequestHypervisorCloudHypervisor CreateInstanceRequestHypervisor = "cloud-hypervisor" @@ -54,18 +88,58 @@ const ( CreateInstanceRequestHypervisorVz CreateInstanceRequestHypervisor = "vz" ) +// Valid indicates whether the value is a known member of the CreateInstanceRequestHypervisor enum. +func (e CreateInstanceRequestHypervisor) Valid() bool { + switch e { + case CreateInstanceRequestHypervisorCloudHypervisor: + return true + case CreateInstanceRequestHypervisorFirecracker: + return true + case CreateInstanceRequestHypervisorQemu: + return true + case CreateInstanceRequestHypervisorVz: + return true + default: + return false + } +} + // Defines values for CreateInstanceRequestNetworkEgressEnforcementMode. const ( All CreateInstanceRequestNetworkEgressEnforcementMode = "all" HttpHttpsOnly CreateInstanceRequestNetworkEgressEnforcementMode = "http_https_only" ) +// Valid indicates whether the value is a known member of the CreateInstanceRequestNetworkEgressEnforcementMode enum. +func (e CreateInstanceRequestNetworkEgressEnforcementMode) Valid() bool { + switch e { + case All: + return true + case HttpHttpsOnly: + return true + default: + return false + } +} + // Defines values for DeviceType. const ( Gpu DeviceType = "gpu" Pci DeviceType = "pci" ) +// Valid indicates whether the value is a known member of the DeviceType enum. +func (e DeviceType) Valid() bool { + switch e { + case Gpu: + return true + case Pci: + return true + default: + return false + } +} + // Defines values for ForkSnapshotRequestTargetHypervisor. const ( ForkSnapshotRequestTargetHypervisorCloudHypervisor ForkSnapshotRequestTargetHypervisor = "cloud-hypervisor" @@ -74,6 +148,22 @@ const ( ForkSnapshotRequestTargetHypervisorVz ForkSnapshotRequestTargetHypervisor = "vz" ) +// Valid indicates whether the value is a known member of the ForkSnapshotRequestTargetHypervisor enum. +func (e ForkSnapshotRequestTargetHypervisor) Valid() bool { + switch e { + case ForkSnapshotRequestTargetHypervisorCloudHypervisor: + return true + case ForkSnapshotRequestTargetHypervisorFirecracker: + return true + case ForkSnapshotRequestTargetHypervisorQemu: + return true + case ForkSnapshotRequestTargetHypervisorVz: + return true + default: + return false + } +} + // Defines values for ForkTargetState. const ( ForkTargetStateRunning ForkTargetState = "Running" @@ -81,17 +171,53 @@ const ( ForkTargetStateStopped ForkTargetState = "Stopped" ) +// Valid indicates whether the value is a known member of the ForkTargetState enum. +func (e ForkTargetState) Valid() bool { + switch e { + case ForkTargetStateRunning: + return true + case ForkTargetStateStandby: + return true + case ForkTargetStateStopped: + return true + default: + return false + } +} + // Defines values for GPUResourceStatusMode. const ( Passthrough GPUResourceStatusMode = "passthrough" Vgpu GPUResourceStatusMode = "vgpu" ) +// Valid indicates whether the value is a known member of the GPUResourceStatusMode enum. +func (e GPUResourceStatusMode) Valid() bool { + switch e { + case Passthrough: + return true + case Vgpu: + return true + default: + return false + } +} + // Defines values for HealthStatus. const ( Ok HealthStatus = "ok" ) +// Valid indicates whether the value is a known member of the HealthStatus enum. +func (e HealthStatus) Valid() bool { + switch e { + case Ok: + return true + default: + return false + } +} + // Defines values for ImageStatus. const ( ImageStatusConverting ImageStatus = "converting" @@ -101,6 +227,24 @@ const ( ImageStatusReady ImageStatus = "ready" ) +// Valid indicates whether the value is a known member of the ImageStatus enum. +func (e ImageStatus) Valid() bool { + switch e { + case ImageStatusConverting: + return true + case ImageStatusFailed: + return true + case ImageStatusPending: + return true + case ImageStatusPulling: + return true + case ImageStatusReady: + return true + default: + return false + } +} + // Defines values for InstanceHypervisor. const ( InstanceHypervisorCloudHypervisor InstanceHypervisor = "cloud-hypervisor" @@ -109,6 +253,22 @@ const ( InstanceHypervisorVz InstanceHypervisor = "vz" ) +// Valid indicates whether the value is a known member of the InstanceHypervisor enum. +func (e InstanceHypervisor) Valid() bool { + switch e { + case InstanceHypervisorCloudHypervisor: + return true + case InstanceHypervisorFirecracker: + return true + case InstanceHypervisorQemu: + return true + case InstanceHypervisorVz: + return true + default: + return false + } +} + // Defines values for InstanceState. const ( InstanceStateCreated InstanceState = "Created" @@ -121,6 +281,30 @@ const ( InstanceStateUnknown InstanceState = "Unknown" ) +// Valid indicates whether the value is a known member of the InstanceState enum. +func (e InstanceState) Valid() bool { + switch e { + case InstanceStateCreated: + return true + case InstanceStateInitializing: + return true + case InstanceStatePaused: + return true + case InstanceStateRunning: + return true + case InstanceStateShutdown: + return true + case InstanceStateStandby: + return true + case InstanceStateStopped: + return true + case InstanceStateUnknown: + return true + default: + return false + } +} + // Defines values for RestoreSnapshotRequestTargetHypervisor. const ( RestoreSnapshotRequestTargetHypervisorCloudHypervisor RestoreSnapshotRequestTargetHypervisor = "cloud-hypervisor" @@ -129,6 +313,22 @@ const ( RestoreSnapshotRequestTargetHypervisorVz RestoreSnapshotRequestTargetHypervisor = "vz" ) +// Valid indicates whether the value is a known member of the RestoreSnapshotRequestTargetHypervisor enum. +func (e RestoreSnapshotRequestTargetHypervisor) Valid() bool { + switch e { + case RestoreSnapshotRequestTargetHypervisorCloudHypervisor: + return true + case RestoreSnapshotRequestTargetHypervisorFirecracker: + return true + case RestoreSnapshotRequestTargetHypervisorQemu: + return true + case RestoreSnapshotRequestTargetHypervisorVz: + return true + default: + return false + } +} + // Defines values for SnapshotSourceHypervisor. const ( CloudHypervisor SnapshotSourceHypervisor = "cloud-hypervisor" @@ -137,12 +337,40 @@ const ( Vz SnapshotSourceHypervisor = "vz" ) +// Valid indicates whether the value is a known member of the SnapshotSourceHypervisor enum. +func (e SnapshotSourceHypervisor) Valid() bool { + switch e { + case CloudHypervisor: + return true + case Firecracker: + return true + case Qemu: + return true + case Vz: + return true + default: + return false + } +} + // Defines values for SnapshotKind. const ( SnapshotKindStandby SnapshotKind = "Standby" SnapshotKindStopped SnapshotKind = "Stopped" ) +// Valid indicates whether the value is a known member of the SnapshotKind enum. +func (e SnapshotKind) Valid() bool { + switch e { + case SnapshotKindStandby: + return true + case SnapshotKindStopped: + return true + default: + return false + } +} + // Defines values for SnapshotTargetState. const ( SnapshotTargetStateRunning SnapshotTargetState = "Running" @@ -150,6 +378,20 @@ const ( SnapshotTargetStateStopped SnapshotTargetState = "Stopped" ) +// Valid indicates whether the value is a known member of the SnapshotTargetState enum. +func (e SnapshotTargetState) Valid() bool { + switch e { + case SnapshotTargetStateRunning: + return true + case SnapshotTargetStateStandby: + return true + case SnapshotTargetStateStopped: + return true + default: + return false + } +} + // Defines values for GetInstanceLogsParamsSource. const ( App GetInstanceLogsParamsSource = "app" @@ -157,6 +399,20 @@ const ( Vmm GetInstanceLogsParamsSource = "vmm" ) +// Valid indicates whether the value is a known member of the GetInstanceLogsParamsSource enum. +func (e GetInstanceLogsParamsSource) Valid() bool { + switch e { + case App: + return true + case Hypeman: + return true + case Vmm: + return true + default: + return false + } +} + // AttachVolumeRequest defines model for AttachVolumeRequest. type AttachVolumeRequest struct { // MountPath Path where volume should be mounted @@ -169,7 +425,7 @@ type AttachVolumeRequest struct { // AvailableDevice defines model for AvailableDevice. type AvailableDevice struct { // CurrentDriver Currently bound driver (null if none) - CurrentDriver *string `json:"current_driver"` + CurrentDriver *string `json:"current_driver,omitempty"` // DeviceId PCI device ID (hex) DeviceId string `json:"device_id"` @@ -193,35 +449,35 @@ type AvailableDevice struct { // Build defines model for Build. type Build struct { // BuilderInstanceId Instance ID of the builder VM (for debugging) - BuilderInstanceId *string `json:"builder_instance_id"` + BuilderInstanceId *string `json:"builder_instance_id,omitempty"` // CompletedAt Build completion timestamp - CompletedAt *time.Time `json:"completed_at"` + CompletedAt *time.Time `json:"completed_at,omitempty"` // CreatedAt Build creation timestamp CreatedAt time.Time `json:"created_at"` // DurationMs Build duration in milliseconds - DurationMs *int64 `json:"duration_ms"` + DurationMs *int64 `json:"duration_ms,omitempty"` // Error Error message (only when status is failed) - Error *string `json:"error"` + Error *string `json:"error,omitempty"` // Id Build job identifier Id string `json:"id"` // ImageDigest Digest of built image (only when status is ready) - ImageDigest *string `json:"image_digest"` + ImageDigest *string `json:"image_digest,omitempty"` // ImageRef Full image reference (only when status is ready) - ImageRef *string `json:"image_ref"` + ImageRef *string `json:"image_ref,omitempty"` Provenance *BuildProvenance `json:"provenance,omitempty"` // QueuePosition Position in build queue (only when status is queued) - QueuePosition *int `json:"queue_position"` + QueuePosition *int `json:"queue_position,omitempty"` // StartedAt Build start timestamp - StartedAt *time.Time `json:"started_at"` + StartedAt *time.Time `json:"started_at,omitempty"` // Status Build job status Status BuildStatus `json:"status"` @@ -476,7 +732,7 @@ type CreateVolumeRequest struct { // Device defines model for Device. type Device struct { // AttachedTo Instance ID if attached - AttachedTo *string `json:"attached_to"` + AttachedTo *string `json:"attached_to,omitempty"` // BoundToVfio Whether the device is currently bound to the vfio-pci driver, which is required for VM passthrough. // - true: Device is bound to vfio-pci and ready for (or currently in use by) a VM. The device's native driver has been unloaded. @@ -634,7 +890,7 @@ type HealthStatus string // Image defines model for Image. type Image struct { // Cmd CMD from container metadata - Cmd *[]string `json:"cmd"` + Cmd *[]string `json:"cmd,omitempty"` // CreatedAt Creation timestamp (RFC3339) CreatedAt time.Time `json:"created_at"` @@ -643,22 +899,22 @@ type Image struct { Digest string `json:"digest"` // Entrypoint Entrypoint from container metadata - Entrypoint *[]string `json:"entrypoint"` + Entrypoint *[]string `json:"entrypoint,omitempty"` // Env Environment variables from container metadata Env *map[string]string `json:"env,omitempty"` // Error Error message if status is failed - Error *string `json:"error"` + Error *string `json:"error,omitempty"` // Name Normalized OCI image reference (tag or digest) Name string `json:"name"` // QueuePosition Position in build queue (null if not queued) - QueuePosition *int `json:"queue_position"` + QueuePosition *int `json:"queue_position,omitempty"` // SizeBytes Disk size in bytes (null until ready) - SizeBytes *int64 `json:"size_bytes"` + SizeBytes *int64 `json:"size_bytes,omitempty"` // Status Build status Status ImageStatus `json:"status"` @@ -667,7 +923,7 @@ type Image struct { Tags *Tags `json:"tags,omitempty"` // WorkingDir Working directory from container metadata - WorkingDir *string `json:"working_dir"` + WorkingDir *string `json:"working_dir,omitempty"` } // ImageStatus Build status @@ -743,7 +999,7 @@ type Instance struct { Env *map[string]string `json:"env,omitempty"` // ExitCode App exit code (null if VM hasn't exited) - ExitCode *int `json:"exit_code"` + ExitCode *int `json:"exit_code,omitempty"` // ExitMessage Human-readable description of exit (e.g., "command not found", "killed by signal 9 (SIGKILL) - OOM") ExitMessage *string `json:"exit_message,omitempty"` @@ -781,10 +1037,10 @@ type Instance struct { Enabled *bool `json:"enabled,omitempty"` // Ip Assigned IP address (null if no network) - Ip *string `json:"ip"` + Ip *string `json:"ip,omitempty"` // Mac Assigned MAC address (null if no network) - Mac *string `json:"mac"` + Mac *string `json:"mac,omitempty"` // Name Network name (always "default" when enabled) Name *string `json:"name,omitempty"` @@ -797,7 +1053,7 @@ type Instance struct { Size *string `json:"size,omitempty"` // StartedAt Start timestamp (RFC3339) - StartedAt *time.Time `json:"started_at"` + StartedAt *time.Time `json:"started_at,omitempty"` // State Instance state: // - Created: VMM created but not started (Cloud Hypervisor native) @@ -811,10 +1067,10 @@ type Instance struct { State InstanceState `json:"state"` // StateError Error message if state couldn't be determined (only set when state is Unknown) - StateError *string `json:"state_error"` + StateError *string `json:"state_error,omitempty"` // StoppedAt Stop timestamp (RFC3339) - StoppedAt *time.Time `json:"stopped_at"` + StoppedAt *time.Time `json:"stopped_at,omitempty"` // Tags User-defined key-value tags. Tags *Tags `json:"tags,omitempty"` @@ -870,7 +1126,7 @@ type InstanceStats struct { MemoryRssBytes int64 `json:"memory_rss_bytes"` // MemoryUtilizationRatio Memory utilization ratio (RSS / allocated memory). Only present when allocated_memory_bytes > 0. - MemoryUtilizationRatio *float64 `json:"memory_utilization_ratio"` + MemoryUtilizationRatio *float64 `json:"memory_utilization_ratio,omitempty"` // MemoryVmsBytes Virtual Memory Size - total virtual memory allocated in bytes MemoryVmsBytes int64 `json:"memory_vms_bytes"` @@ -894,7 +1150,7 @@ type PassthroughDevice struct { // PathInfo defines model for PathInfo. type PathInfo struct { // Error Error message if stat failed (e.g., permission denied). Only set when exists is false due to an error rather than the path not existing. - Error *string `json:"error"` + Error *string `json:"error,omitempty"` // Exists Whether the path exists Exists bool `json:"exists"` @@ -909,7 +1165,7 @@ type PathInfo struct { IsSymlink *bool `json:"is_symlink,omitempty"` // LinkTarget Symlink target path (only set when is_symlink=true) - LinkTarget *string `json:"link_target"` + LinkTarget *string `json:"link_target,omitempty"` // Mode File mode (Unix permissions) Mode *int `json:"mode,omitempty"` @@ -978,7 +1234,7 @@ type Resources struct { DiskIo *ResourceStatus `json:"disk_io,omitempty"` // Gpu GPU resource status. Null if no GPUs available. - Gpu *GPUResourceStatus `json:"gpu"` + Gpu *GPUResourceStatus `json:"gpu,omitempty"` Memory ResourceStatus `json:"memory"` Network ResourceStatus `json:"network"` } @@ -1009,7 +1265,7 @@ type Snapshot struct { Kind SnapshotKind `json:"kind"` // Name Optional human-readable snapshot name (unique per source instance) - Name *string `json:"name"` + Name *string `json:"name,omitempty"` // SizeBytes Total payload size in bytes SizeBytes int64 `json:"size_bytes"` @@ -1213,6 +1469,12 @@ type StatInstancePathParams struct { FollowLinks *bool `form:"follow_links,omitempty" json:"follow_links,omitempty"` } +// UpdateEgressSecretsJSONBody defines parameters for UpdateEgressSecrets. +type UpdateEgressSecretsJSONBody struct { + // Env Map of environment variable names to new secret values. Each key must be referenced by an existing credential policy. + Env map[string]string `json:"env"` +} + // ListSnapshotsParams defines parameters for ListSnapshots. type ListSnapshotsParams struct { // SourceInstanceId Filter snapshots by source instance ID @@ -1276,6 +1538,9 @@ type RestoreInstanceSnapshotJSONRequestBody = RestoreSnapshotRequest // StartInstanceJSONRequestBody defines body for StartInstance for application/json ContentType. type StartInstanceJSONRequestBody StartInstanceJSONBody +// UpdateEgressSecretsJSONRequestBody defines body for UpdateEgressSecrets for application/json ContentType. +type UpdateEgressSecretsJSONRequestBody UpdateEgressSecretsJSONBody + // AttachVolumeJSONRequestBody defines body for AttachVolume for application/json ContentType. type AttachVolumeJSONRequestBody = AttachVolumeRequest @@ -1473,6 +1738,11 @@ type ClientInterface interface { // StopInstance request StopInstance(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) + // UpdateEgressSecretsWithBody request with any body + UpdateEgressSecretsWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdateEgressSecrets(ctx context.Context, id string, body UpdateEgressSecretsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // DetachVolume request DetachVolume(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2008,6 +2278,30 @@ func (c *Client) StopInstance(ctx context.Context, id string, reqEditors ...Requ return c.Client.Do(req) } +func (c *Client) UpdateEgressSecretsWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateEgressSecretsRequestWithBody(c.Server, id, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) UpdateEgressSecrets(ctx context.Context, id string, body UpdateEgressSecretsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateEgressSecretsRequest(c.Server, id, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) DetachVolume(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewDetachVolumeRequest(c.Server, id, volumeId) if err != nil { @@ -2212,7 +2506,7 @@ func NewListBuildsRequest(server string, params *ListBuildsParams) (*http.Reques if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2272,7 +2566,7 @@ func NewCancelBuildRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2306,7 +2600,7 @@ func NewGetBuildRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2340,7 +2634,7 @@ func NewGetBuildEventsRequest(server string, id string, params *GetBuildEventsPa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2365,7 +2659,7 @@ func NewGetBuildEventsRequest(server string, id string, params *GetBuildEventsPa if params.Follow != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "follow", runtime.ParamLocationQuery, *params.Follow); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "follow", *params.Follow, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2414,7 +2708,7 @@ func NewListDevicesRequest(server string, params *ListDevicesParams) (*http.Requ if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2512,7 +2806,7 @@ func NewDeleteDeviceRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2546,7 +2840,7 @@ func NewGetDeviceRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2625,7 +2919,7 @@ func NewListImagesRequest(server string, params *ListImagesParams) (*http.Reques if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2696,7 +2990,7 @@ func NewDeleteImageRequest(server string, name string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2730,7 +3024,7 @@ func NewGetImageRequest(server string, name string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "name", name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2782,7 +3076,7 @@ func NewListIngressesRequest(server string, params *ListIngressesParams) (*http. if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2853,7 +3147,7 @@ func NewDeleteIngressRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2887,7 +3181,7 @@ func NewGetIngressRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -2939,7 +3233,7 @@ func NewListInstancesRequest(server string, params *ListInstancesParams) (*http. if params.State != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "state", runtime.ParamLocationQuery, *params.State); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "state", *params.State, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -2955,7 +3249,7 @@ func NewListInstancesRequest(server string, params *ListInstancesParams) (*http. if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3026,7 +3320,7 @@ func NewDeleteInstanceRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3060,7 +3354,7 @@ func NewGetInstanceRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3105,7 +3399,7 @@ func NewForkInstanceRequestWithBody(server string, id string, contentType string var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3141,7 +3435,7 @@ func NewGetInstanceLogsRequest(server string, id string, params *GetInstanceLogs var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3166,7 +3460,7 @@ func NewGetInstanceLogsRequest(server string, id string, params *GetInstanceLogs if params.Tail != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "tail", runtime.ParamLocationQuery, *params.Tail); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "tail", *params.Tail, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3182,7 +3476,7 @@ func NewGetInstanceLogsRequest(server string, id string, params *GetInstanceLogs if params.Follow != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "follow", runtime.ParamLocationQuery, *params.Follow); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "follow", *params.Follow, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3198,7 +3492,7 @@ func NewGetInstanceLogsRequest(server string, id string, params *GetInstanceLogs if params.Source != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source", runtime.ParamLocationQuery, *params.Source); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "source", *params.Source, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3229,7 +3523,7 @@ func NewRestoreInstanceRequest(server string, id string) (*http.Request, error) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3274,7 +3568,7 @@ func NewCreateInstanceSnapshotRequestWithBody(server string, id string, contentT var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3321,14 +3615,14 @@ func NewRestoreInstanceSnapshotRequestWithBody(server string, id string, snapsho var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "snapshotId", runtime.ParamLocationPath, snapshotId) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "snapshotId", snapshotId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3364,7 +3658,7 @@ func NewStandbyInstanceRequest(server string, id string) (*http.Request, error) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3409,7 +3703,7 @@ func NewStartInstanceRequestWithBody(server string, id string, contentType strin var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3445,7 +3739,7 @@ func NewStatInstancePathRequest(server string, id string, params *StatInstancePa var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3468,7 +3762,7 @@ func NewStatInstancePathRequest(server string, id string, params *StatInstancePa if params != nil { queryValues := queryURL.Query() - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "path", runtime.ParamLocationQuery, params.Path); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "path", params.Path, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3482,7 +3776,7 @@ func NewStatInstancePathRequest(server string, id string, params *StatInstancePa if params.FollowLinks != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "follow_links", runtime.ParamLocationQuery, *params.FollowLinks); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "follow_links", *params.FollowLinks, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "boolean", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3513,7 +3807,7 @@ func NewGetInstanceStatsRequest(server string, id string) (*http.Request, error) var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3547,7 +3841,7 @@ func NewStopInstanceRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3575,20 +3869,67 @@ func NewStopInstanceRequest(server string, id string) (*http.Request, error) { return req, nil } +// NewUpdateEgressSecretsRequest calls the generic UpdateEgressSecrets builder with application/json body +func NewUpdateEgressSecretsRequest(server string, id string, body UpdateEgressSecretsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdateEgressSecretsRequestWithBody(server, id, "application/json", bodyReader) +} + +// NewUpdateEgressSecretsRequestWithBody generates requests for UpdateEgressSecrets with any type of body +func NewUpdateEgressSecretsRequestWithBody(server string, id string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/instances/%s/update-egress-secrets", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewDetachVolumeRequest generates requests for DetachVolume func NewDetachVolumeRequest(server string, id string, volumeId string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "volumeId", runtime.ParamLocationPath, volumeId) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "volumeId", volumeId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3633,14 +3974,14 @@ func NewAttachVolumeRequestWithBody(server string, id string, volumeId string, c var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "volumeId", runtime.ParamLocationPath, volumeId) + pathParam1, err = runtime.StyleParamWithOptions("simple", false, "volumeId", volumeId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3721,7 +4062,7 @@ func NewListSnapshotsRequest(server string, params *ListSnapshotsParams) (*http. if params.SourceInstanceId != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "source_instance_id", runtime.ParamLocationQuery, *params.SourceInstanceId); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "source_instance_id", *params.SourceInstanceId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3737,7 +4078,7 @@ func NewListSnapshotsRequest(server string, params *ListSnapshotsParams) (*http. if params.Kind != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "kind", runtime.ParamLocationQuery, *params.Kind); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "kind", *params.Kind, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3753,7 +4094,7 @@ func NewListSnapshotsRequest(server string, params *ListSnapshotsParams) (*http. if params.Name != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, *params.Name); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "name", *params.Name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3769,7 +4110,7 @@ func NewListSnapshotsRequest(server string, params *ListSnapshotsParams) (*http. if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -3800,7 +4141,7 @@ func NewDeleteSnapshotRequest(server string, snapshotId string) (*http.Request, var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "snapshotId", runtime.ParamLocationPath, snapshotId) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "snapshotId", snapshotId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3834,7 +4175,7 @@ func NewGetSnapshotRequest(server string, snapshotId string) (*http.Request, err var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "snapshotId", runtime.ParamLocationPath, snapshotId) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "snapshotId", snapshotId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3879,7 +4220,7 @@ func NewForkSnapshotRequestWithBody(server string, snapshotId string, contentTyp var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "snapshotId", runtime.ParamLocationPath, snapshotId) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "snapshotId", snapshotId, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -3933,7 +4274,7 @@ func NewListVolumesRequest(server string, params *ListVolumesParams) (*http.Requ if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -4020,7 +4361,7 @@ func NewCreateVolumeFromArchiveRequestWithBody(server string, params *CreateVolu if params != nil { queryValues := queryURL.Query() - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "name", runtime.ParamLocationQuery, params.Name); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "name", params.Name, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -4032,7 +4373,7 @@ func NewCreateVolumeFromArchiveRequestWithBody(server string, params *CreateVolu } } - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "size_gb", runtime.ParamLocationQuery, params.SizeGb); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "size_gb", params.SizeGb, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "integer", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -4046,7 +4387,7 @@ func NewCreateVolumeFromArchiveRequestWithBody(server string, params *CreateVolu if params.Id != nil { - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "id", runtime.ParamLocationQuery, *params.Id); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("form", true, "id", *params.Id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "string", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -4062,7 +4403,7 @@ func NewCreateVolumeFromArchiveRequestWithBody(server string, params *CreateVolu if params.Tags != nil { - if queryFrag, err := runtime.StyleParamWithLocation("deepObject", true, "tags", runtime.ParamLocationQuery, *params.Tags); err != nil { + if queryFrag, err := runtime.StyleParamWithOptions("deepObject", true, "tags", *params.Tags, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationQuery, Type: "object", Format: ""}); err != nil { return nil, err } else if parsed, err := url.ParseQuery(queryFrag); err != nil { return nil, err @@ -4095,7 +4436,7 @@ func NewDeleteVolumeRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -4129,7 +4470,7 @@ func NewGetVolumeRequest(server string, id string) (*http.Request, error) { var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + pathParam0, err = runtime.StyleParamWithOptions("simple", false, "id", id, runtime.StyleParamOptions{ParamLocation: runtime.ParamLocationPath, Type: "string", Format: ""}) if err != nil { return nil, err } @@ -4315,6 +4656,11 @@ type ClientWithResponsesInterface interface { // StopInstanceWithResponse request StopInstanceWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) + // UpdateEgressSecretsWithBodyWithResponse request with any body + UpdateEgressSecretsWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateEgressSecretsResponse, error) + + UpdateEgressSecretsWithResponse(ctx context.Context, id string, body UpdateEgressSecretsJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateEgressSecretsResponse, error) + // DetachVolumeWithResponse request DetachVolumeWithResponse(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*DetachVolumeResponse, error) @@ -5169,6 +5515,32 @@ func (r StopInstanceResponse) StatusCode() int { return 0 } +type UpdateEgressSecretsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *Instance + JSON400 *Error + JSON404 *Error + JSON409 *Error + JSON500 *Error +} + +// Status returns HTTPResponse.Status +func (r UpdateEgressSecretsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r UpdateEgressSecretsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type DetachVolumeResponse struct { Body []byte HTTPResponse *http.Response @@ -5823,6 +6195,23 @@ func (c *ClientWithResponses) StopInstanceWithResponse(ctx context.Context, id s return ParseStopInstanceResponse(rsp) } +// UpdateEgressSecretsWithBodyWithResponse request with arbitrary body returning *UpdateEgressSecretsResponse +func (c *ClientWithResponses) UpdateEgressSecretsWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateEgressSecretsResponse, error) { + rsp, err := c.UpdateEgressSecretsWithBody(ctx, id, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdateEgressSecretsResponse(rsp) +} + +func (c *ClientWithResponses) UpdateEgressSecretsWithResponse(ctx context.Context, id string, body UpdateEgressSecretsJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateEgressSecretsResponse, error) { + rsp, err := c.UpdateEgressSecrets(ctx, id, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdateEgressSecretsResponse(rsp) +} + // DetachVolumeWithResponse request returning *DetachVolumeResponse func (c *ClientWithResponses) DetachVolumeWithResponse(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*DetachVolumeResponse, error) { rsp, err := c.DetachVolume(ctx, id, volumeId, reqEditors...) @@ -7408,6 +7797,60 @@ func ParseStopInstanceResponse(rsp *http.Response) (*StopInstanceResponse, error return response, nil } +// ParseUpdateEgressSecretsResponse parses an HTTP response from a UpdateEgressSecretsWithResponse call +func ParseUpdateEgressSecretsResponse(rsp *http.Response) (*UpdateEgressSecretsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &UpdateEgressSecretsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest Instance + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 409: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON409 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON500 = &dest + + } + + return response, nil +} + // ParseDetachVolumeResponse parses an HTTP response from a DetachVolumeWithResponse call func ParseDetachVolumeResponse(rsp *http.Response) (*DetachVolumeResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -8024,6 +8467,9 @@ type ServerInterface interface { // Stop instance (graceful shutdown) // (POST /instances/{id}/stop) StopInstance(w http.ResponseWriter, r *http.Request, id string) + // Update egress proxy secret env values on a running instance + // (POST /instances/{id}/update-egress-secrets) + UpdateEgressSecrets(w http.ResponseWriter, r *http.Request, id string) // Detach volume from instance // (DELETE /instances/{id}/volumes/{volumeId}) DetachVolume(w http.ResponseWriter, r *http.Request, id string, volumeId string) @@ -8264,6 +8710,12 @@ func (_ Unimplemented) StopInstance(w http.ResponseWriter, r *http.Request, id s w.WriteHeader(http.StatusNotImplemented) } +// Update egress proxy secret env values on a running instance +// (POST /instances/{id}/update-egress-secrets) +func (_ Unimplemented) UpdateEgressSecrets(w http.ResponseWriter, r *http.Request, id string) { + w.WriteHeader(http.StatusNotImplemented) +} + // Detach volume from instance // (DELETE /instances/{id}/volumes/{volumeId}) func (_ Unimplemented) DetachVolume(w http.ResponseWriter, r *http.Request, id string, volumeId string) { @@ -8361,7 +8813,7 @@ func (siw *ServerInterfaceWrapper) ListBuilds(w http.ResponseWriter, r *http.Req // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -8406,7 +8858,7 @@ func (siw *ServerInterfaceWrapper) CancelBuild(w http.ResponseWriter, r *http.Re // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8437,7 +8889,7 @@ func (siw *ServerInterfaceWrapper) GetBuild(w http.ResponseWriter, r *http.Reque // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8468,7 +8920,7 @@ func (siw *ServerInterfaceWrapper) GetBuildEvents(w http.ResponseWriter, r *http // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8485,7 +8937,7 @@ func (siw *ServerInterfaceWrapper) GetBuildEvents(w http.ResponseWriter, r *http // ------------- Optional query parameter "follow" ------------- - err = runtime.BindQueryParameter("form", true, false, "follow", r.URL.Query(), ¶ms.Follow) + err = runtime.BindQueryParameterWithOptions("form", true, false, "follow", r.URL.Query(), ¶ms.Follow, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "follow", Err: err}) return @@ -8518,7 +8970,7 @@ func (siw *ServerInterfaceWrapper) ListDevices(w http.ResponseWriter, r *http.Re // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -8583,7 +9035,7 @@ func (siw *ServerInterfaceWrapper) DeleteDevice(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8614,7 +9066,7 @@ func (siw *ServerInterfaceWrapper) GetDevice(w http.ResponseWriter, r *http.Requ // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8667,7 +9119,7 @@ func (siw *ServerInterfaceWrapper) ListImages(w http.ResponseWriter, r *http.Req // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -8712,7 +9164,7 @@ func (siw *ServerInterfaceWrapper) DeleteImage(w http.ResponseWriter, r *http.Re // ------------- Path parameter "name" ------------- var name string - err = runtime.BindStyledParameterWithOptions("simple", "name", chi.URLParam(r, "name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", chi.URLParam(r, "name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) return @@ -8743,7 +9195,7 @@ func (siw *ServerInterfaceWrapper) GetImage(w http.ResponseWriter, r *http.Reque // ------------- Path parameter "name" ------------- var name string - err = runtime.BindStyledParameterWithOptions("simple", "name", chi.URLParam(r, "name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "name", chi.URLParam(r, "name"), &name, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) return @@ -8782,7 +9234,7 @@ func (siw *ServerInterfaceWrapper) ListIngresses(w http.ResponseWriter, r *http. // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -8827,7 +9279,7 @@ func (siw *ServerInterfaceWrapper) DeleteIngress(w http.ResponseWriter, r *http. // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8858,7 +9310,7 @@ func (siw *ServerInterfaceWrapper) GetIngress(w http.ResponseWriter, r *http.Req // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8897,7 +9349,7 @@ func (siw *ServerInterfaceWrapper) ListInstances(w http.ResponseWriter, r *http. // ------------- Optional query parameter "state" ------------- - err = runtime.BindQueryParameter("form", true, false, "state", r.URL.Query(), ¶ms.State) + err = runtime.BindQueryParameterWithOptions("form", true, false, "state", r.URL.Query(), ¶ms.State, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "state", Err: err}) return @@ -8905,7 +9357,7 @@ func (siw *ServerInterfaceWrapper) ListInstances(w http.ResponseWriter, r *http. // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -8950,7 +9402,7 @@ func (siw *ServerInterfaceWrapper) DeleteInstance(w http.ResponseWriter, r *http // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -8981,7 +9433,7 @@ func (siw *ServerInterfaceWrapper) GetInstance(w http.ResponseWriter, r *http.Re // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9012,7 +9464,7 @@ func (siw *ServerInterfaceWrapper) ForkInstance(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9043,7 +9495,7 @@ func (siw *ServerInterfaceWrapper) GetInstanceLogs(w http.ResponseWriter, r *htt // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9060,7 +9512,7 @@ func (siw *ServerInterfaceWrapper) GetInstanceLogs(w http.ResponseWriter, r *htt // ------------- Optional query parameter "tail" ------------- - err = runtime.BindQueryParameter("form", true, false, "tail", r.URL.Query(), ¶ms.Tail) + err = runtime.BindQueryParameterWithOptions("form", true, false, "tail", r.URL.Query(), ¶ms.Tail, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tail", Err: err}) return @@ -9068,7 +9520,7 @@ func (siw *ServerInterfaceWrapper) GetInstanceLogs(w http.ResponseWriter, r *htt // ------------- Optional query parameter "follow" ------------- - err = runtime.BindQueryParameter("form", true, false, "follow", r.URL.Query(), ¶ms.Follow) + err = runtime.BindQueryParameterWithOptions("form", true, false, "follow", r.URL.Query(), ¶ms.Follow, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "follow", Err: err}) return @@ -9076,7 +9528,7 @@ func (siw *ServerInterfaceWrapper) GetInstanceLogs(w http.ResponseWriter, r *htt // ------------- Optional query parameter "source" ------------- - err = runtime.BindQueryParameter("form", true, false, "source", r.URL.Query(), ¶ms.Source) + err = runtime.BindQueryParameterWithOptions("form", true, false, "source", r.URL.Query(), ¶ms.Source, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "source", Err: err}) return @@ -9101,7 +9553,7 @@ func (siw *ServerInterfaceWrapper) RestoreInstance(w http.ResponseWriter, r *htt // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9132,7 +9584,7 @@ func (siw *ServerInterfaceWrapper) CreateInstanceSnapshot(w http.ResponseWriter, // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9163,7 +9615,7 @@ func (siw *ServerInterfaceWrapper) RestoreInstanceSnapshot(w http.ResponseWriter // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9172,7 +9624,7 @@ func (siw *ServerInterfaceWrapper) RestoreInstanceSnapshot(w http.ResponseWriter // ------------- Path parameter "snapshotId" ------------- var snapshotId string - err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "snapshotId", Err: err}) return @@ -9203,7 +9655,7 @@ func (siw *ServerInterfaceWrapper) StandbyInstance(w http.ResponseWriter, r *htt // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9234,7 +9686,7 @@ func (siw *ServerInterfaceWrapper) StartInstance(w http.ResponseWriter, r *http. // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9265,7 +9717,7 @@ func (siw *ServerInterfaceWrapper) StatInstancePath(w http.ResponseWriter, r *ht // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9289,7 +9741,7 @@ func (siw *ServerInterfaceWrapper) StatInstancePath(w http.ResponseWriter, r *ht return } - err = runtime.BindQueryParameter("form", true, true, "path", r.URL.Query(), ¶ms.Path) + err = runtime.BindQueryParameterWithOptions("form", true, true, "path", r.URL.Query(), ¶ms.Path, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "path", Err: err}) return @@ -9297,7 +9749,7 @@ func (siw *ServerInterfaceWrapper) StatInstancePath(w http.ResponseWriter, r *ht // ------------- Optional query parameter "follow_links" ------------- - err = runtime.BindQueryParameter("form", true, false, "follow_links", r.URL.Query(), ¶ms.FollowLinks) + err = runtime.BindQueryParameterWithOptions("form", true, false, "follow_links", r.URL.Query(), ¶ms.FollowLinks, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "follow_links", Err: err}) return @@ -9322,7 +9774,7 @@ func (siw *ServerInterfaceWrapper) GetInstanceStats(w http.ResponseWriter, r *ht // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9353,7 +9805,7 @@ func (siw *ServerInterfaceWrapper) StopInstance(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9376,6 +9828,37 @@ func (siw *ServerInterfaceWrapper) StopInstance(w http.ResponseWriter, r *http.R handler.ServeHTTP(w, r) } +// UpdateEgressSecrets operation middleware +func (siw *ServerInterfaceWrapper) UpdateEgressSecrets(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "id" ------------- + var id string + + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, BearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.UpdateEgressSecrets(w, r, id) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // DetachVolume operation middleware func (siw *ServerInterfaceWrapper) DetachVolume(w http.ResponseWriter, r *http.Request) { @@ -9384,7 +9867,7 @@ func (siw *ServerInterfaceWrapper) DetachVolume(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9393,7 +9876,7 @@ func (siw *ServerInterfaceWrapper) DetachVolume(w http.ResponseWriter, r *http.R // ------------- Path parameter "volumeId" ------------- var volumeId string - err = runtime.BindStyledParameterWithOptions("simple", "volumeId", chi.URLParam(r, "volumeId"), &volumeId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "volumeId", chi.URLParam(r, "volumeId"), &volumeId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "volumeId", Err: err}) return @@ -9424,7 +9907,7 @@ func (siw *ServerInterfaceWrapper) AttachVolume(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9433,7 +9916,7 @@ func (siw *ServerInterfaceWrapper) AttachVolume(w http.ResponseWriter, r *http.R // ------------- Path parameter "volumeId" ------------- var volumeId string - err = runtime.BindStyledParameterWithOptions("simple", "volumeId", chi.URLParam(r, "volumeId"), &volumeId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "volumeId", chi.URLParam(r, "volumeId"), &volumeId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "volumeId", Err: err}) return @@ -9492,7 +9975,7 @@ func (siw *ServerInterfaceWrapper) ListSnapshots(w http.ResponseWriter, r *http. // ------------- Optional query parameter "source_instance_id" ------------- - err = runtime.BindQueryParameter("form", true, false, "source_instance_id", r.URL.Query(), ¶ms.SourceInstanceId) + err = runtime.BindQueryParameterWithOptions("form", true, false, "source_instance_id", r.URL.Query(), ¶ms.SourceInstanceId, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "source_instance_id", Err: err}) return @@ -9500,7 +9983,7 @@ func (siw *ServerInterfaceWrapper) ListSnapshots(w http.ResponseWriter, r *http. // ------------- Optional query parameter "kind" ------------- - err = runtime.BindQueryParameter("form", true, false, "kind", r.URL.Query(), ¶ms.Kind) + err = runtime.BindQueryParameterWithOptions("form", true, false, "kind", r.URL.Query(), ¶ms.Kind, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "kind", Err: err}) return @@ -9508,7 +9991,7 @@ func (siw *ServerInterfaceWrapper) ListSnapshots(w http.ResponseWriter, r *http. // ------------- Optional query parameter "name" ------------- - err = runtime.BindQueryParameter("form", true, false, "name", r.URL.Query(), ¶ms.Name) + err = runtime.BindQueryParameterWithOptions("form", true, false, "name", r.URL.Query(), ¶ms.Name, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) return @@ -9516,7 +9999,7 @@ func (siw *ServerInterfaceWrapper) ListSnapshots(w http.ResponseWriter, r *http. // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -9541,7 +10024,7 @@ func (siw *ServerInterfaceWrapper) DeleteSnapshot(w http.ResponseWriter, r *http // ------------- Path parameter "snapshotId" ------------- var snapshotId string - err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "snapshotId", Err: err}) return @@ -9572,7 +10055,7 @@ func (siw *ServerInterfaceWrapper) GetSnapshot(w http.ResponseWriter, r *http.Re // ------------- Path parameter "snapshotId" ------------- var snapshotId string - err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "snapshotId", Err: err}) return @@ -9603,7 +10086,7 @@ func (siw *ServerInterfaceWrapper) ForkSnapshot(w http.ResponseWriter, r *http.R // ------------- Path parameter "snapshotId" ------------- var snapshotId string - err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "snapshotId", chi.URLParam(r, "snapshotId"), &snapshotId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "snapshotId", Err: err}) return @@ -9642,7 +10125,7 @@ func (siw *ServerInterfaceWrapper) ListVolumes(w http.ResponseWriter, r *http.Re // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -9702,7 +10185,7 @@ func (siw *ServerInterfaceWrapper) CreateVolumeFromArchive(w http.ResponseWriter return } - err = runtime.BindQueryParameter("form", true, true, "name", r.URL.Query(), ¶ms.Name) + err = runtime.BindQueryParameterWithOptions("form", true, true, "name", r.URL.Query(), ¶ms.Name, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) return @@ -9717,7 +10200,7 @@ func (siw *ServerInterfaceWrapper) CreateVolumeFromArchive(w http.ResponseWriter return } - err = runtime.BindQueryParameter("form", true, true, "size_gb", r.URL.Query(), ¶ms.SizeGb) + err = runtime.BindQueryParameterWithOptions("form", true, true, "size_gb", r.URL.Query(), ¶ms.SizeGb, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "size_gb", Err: err}) return @@ -9725,7 +10208,7 @@ func (siw *ServerInterfaceWrapper) CreateVolumeFromArchive(w http.ResponseWriter // ------------- Optional query parameter "id" ------------- - err = runtime.BindQueryParameter("form", true, false, "id", r.URL.Query(), ¶ms.Id) + err = runtime.BindQueryParameterWithOptions("form", true, false, "id", r.URL.Query(), ¶ms.Id, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9733,7 +10216,7 @@ func (siw *ServerInterfaceWrapper) CreateVolumeFromArchive(w http.ResponseWriter // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags) + err = runtime.BindQueryParameterWithOptions("deepObject", true, false, "tags", r.URL.Query(), ¶ms.Tags, runtime.BindQueryParameterOptions{Type: "object", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tags", Err: err}) return @@ -9758,7 +10241,7 @@ func (siw *ServerInterfaceWrapper) DeleteVolume(w http.ResponseWriter, r *http.R // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -9789,7 +10272,7 @@ func (siw *ServerInterfaceWrapper) GetVolume(w http.ResponseWriter, r *http.Requ // ------------- Path parameter "id" ------------- var id string - err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "id", chi.URLParam(r, "id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: ""}) if err != nil { siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "id", Err: err}) return @@ -10024,6 +10507,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/instances/{id}/stop", wrapper.StopInstance) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/instances/{id}/update-egress-secrets", wrapper.UpdateEgressSecrets) + }) r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/instances/{id}/volumes/{volumeId}", wrapper.DetachVolume) }) @@ -11474,6 +11960,60 @@ func (response StopInstance500JSONResponse) VisitStopInstanceResponse(w http.Res return json.NewEncoder(w).Encode(response) } +type UpdateEgressSecretsRequestObject struct { + Id string `json:"id"` + Body *UpdateEgressSecretsJSONRequestBody +} + +type UpdateEgressSecretsResponseObject interface { + VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error +} + +type UpdateEgressSecrets200JSONResponse Instance + +func (response UpdateEgressSecrets200JSONResponse) VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type UpdateEgressSecrets400JSONResponse Error + +func (response UpdateEgressSecrets400JSONResponse) VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +type UpdateEgressSecrets404JSONResponse Error + +func (response UpdateEgressSecrets404JSONResponse) VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(404) + + return json.NewEncoder(w).Encode(response) +} + +type UpdateEgressSecrets409JSONResponse Error + +func (response UpdateEgressSecrets409JSONResponse) VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(409) + + return json.NewEncoder(w).Encode(response) +} + +type UpdateEgressSecrets500JSONResponse Error + +func (response UpdateEgressSecrets500JSONResponse) VisitUpdateEgressSecretsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(500) + + return json.NewEncoder(w).Encode(response) +} + type DetachVolumeRequestObject struct { Id string `json:"id"` VolumeId string `json:"volumeId"` @@ -12060,6 +12600,9 @@ type StrictServerInterface interface { // Stop instance (graceful shutdown) // (POST /instances/{id}/stop) StopInstance(ctx context.Context, request StopInstanceRequestObject) (StopInstanceResponseObject, error) + // Update egress proxy secret env values on a running instance + // (POST /instances/{id}/update-egress-secrets) + UpdateEgressSecrets(ctx context.Context, request UpdateEgressSecretsRequestObject) (UpdateEgressSecretsResponseObject, error) // Detach volume from instance // (DELETE /instances/{id}/volumes/{volumeId}) DetachVolume(ctx context.Context, request DetachVolumeRequestObject) (DetachVolumeResponseObject, error) @@ -13038,6 +13581,39 @@ func (sh *strictHandler) StopInstance(w http.ResponseWriter, r *http.Request, id } } +// UpdateEgressSecrets operation middleware +func (sh *strictHandler) UpdateEgressSecrets(w http.ResponseWriter, r *http.Request, id string) { + var request UpdateEgressSecretsRequestObject + + request.Id = id + + var body UpdateEgressSecretsJSONRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.UpdateEgressSecrets(ctx, request.(UpdateEgressSecretsRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "UpdateEgressSecrets") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(UpdateEgressSecretsResponseObject); ok { + if err := validResponse.VisitUpdateEgressSecretsResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + // DetachVolume operation middleware func (sh *strictHandler) DetachVolume(w http.ResponseWriter, r *http.Request, id string, volumeId string) { var request DetachVolumeRequestObject @@ -13374,217 +13950,222 @@ func (sh *strictHandler) GetVolume(w http.ResponseWriter, r *http.Request, id st // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x97XLbOpLoq6B0Z2vkGUmWP+I42jq117GTHO+JE9849t6do1wZIiEJYxLgAUA5Sip/", - "5wHmEedJbqEB8EugRDu2E28yNXUikyA+Gt2N7kZ/fG4FPE44I0zJ1uBzSwYzEmP4eaAUDmYXPEpj8o78", - "kRKp9ONE8IQIRQk0innK1CjBaqb/CokMBE0U5aw1aJ1iNUPXMyIImkMvSM54GoVoTBB8R8JWp0U+4jiJ", - "SGvQ2oyZ2gyxwq1OSy0S/UgqQdm09aXTEgSHnEULM8wEp5FqDSY4kqRTGfZEd42wRPqTLnyT9TfmPCKY", - "tb5Aj3+kVJCwNfi9uIwPWWM+/jsJlB78YI5phMcROSJzGpBlMASpEISpUSjonIhlUBya99ECjXnKQmTa", - "oTZLowjRCWKckY0SMNichlRDQjfRQ7cGSqTEA5kQ5jSioWcHDo+ReY2Oj1B7Rj6WB9l+Ot5v1XfJcEyW", - "O/01jTHrauDqabn+oW2x79e7vp4pj+N0NBU8TZZ7Pn57cnKO4CViaTwmotjj/nbWH2WKTInQHSYBHeEw", - "FERK//rdy+Lc+v1+f4C3B/1+r++b5ZywkItakJrXfpBu9UOyostGILX9L4H0zcXx0fEBOuQi4QLDt0sj", - "VRC7CJ7iuopoU94VH/4/T2kULmP9WD8mYkSZVJjV4OCxfanBxSdIzQiy36GLE9SecIFCMk6nU8qmG03w", - "XTOsiCgSjrBaHg6mimwbyhlSNCZS4ThpdVoTLmL9USvEinT1m0YDCoLXDKdbNBpsmdRSs5OjWNb17pog", - "ylBMo4hKEnAWyuIYlKm93frFFAiGCME9HOqFfoxiIiWeEtTWbFPzboakwiqViEo0wTQiYaM98iGCWczf", - "+RjRkDBFJ7RM3wadungcbG3veHlHjKdkFNKpPYnK3R/Bc41iuh+FoLV/IZrQFs3WAUMKMlke7yWwbhhE", - "kAkRROP4Vw6XCD4nTFOLHu9PMG7rf23mR/SmPZ83AZinefMvndYfKUnJKOGSmhkucS77RqMRgBrBF/45", - "w6tVe13AKKmwWE0f0OIOKNHMrxFszkzTL52WwtO1n7zXbaq8E1ijHbLEBWpZ5Is5YR4hKeBM2Rdl6Lzm", - "UxRRRpBtYfdC80Q9wC8RB5Z4R3DIwL9M/Hret2Be5kFNb/pdp0VYGmtgRnxahOaMYKHGpATMmiPMdpTP", - "rhb8pyXyqZxVWJLRag5yShkjIdItLWGbliiVIKkuLR+o6Iqq0ZwI6aU5mNZvVCHborariAdXExqR0QzL", - "mZkxDkOgVxydllbikdZK4i9ONBN0HYIUIZHi6OzXg+0ne8gO4IGh5KkIzAyWV1L4Wndv2iKFxRhHkRc3", - "6tHt5mf0Mob4MeAsI4y6syfDQIeYhtO17G7q7jutJJUz8wt4t54VnH2aDWj0ivTvD55FHwKTMFpCrc7k", - "lwHfJmaz0TTiGqYLlDL6R1oSsHvoWOsKCumDgoYk7CAMLzTLxqni3SlhRGg+hSaCxyBtFYRg1Ca9aa+D", - "hlou7GopuIu3u/1+tz9slcXYaLc7TVINCqwUEXqC/+933P100P1bv/vsQ/5z1Ot++OuffAjQVDJ3UqFd", - "Z9vRfge5yRbF9epE14nyt+b+xen7OI7Z6mPNJ26604fHy4KDWWvIgysiepRvRnQssFhssillHwcRVkSq", - "8spXt71TWMA6VgCBTTWYbgiGitIDaNyO+DURgebAEdGIJzuaCVMlOwhrvRmYF9Kn5L+jADNNC0a44AIR", - "FqJrqmYIQ7sytOJFFye0S81UW51WjD++JmyqZq3B3s4Snmskb9sf3Q9/cY82/sOL6iKNiAfJ3/FUUTZF", - "8Nqc6jMqUT4Hqki8dkccdNMIxLyYsmPz2VY2EywEXnz9DruFrNppo8zVbnUQeyT/t3MiBA3dqXp4coTa", - "Eb0iFt2RSBkapv3+TgAN4CexTwIex5iF5tlGD72NqdKnWZof0sYa1Ctu9+8tEsw4yBlRxPWCMlDXCDE5", - "DANBQD/B0cpjeBWIvcA6zPpdPrR/5VJ1Y8zwlIA2aRuiseBXRE8UJTyiASUSXZGFFlIWaKo77c6ppJp8", - "CJujOTZGg96QvZ9xSUwT90orIgGhc4JiHlyhJMIBmXFQxOc4SonsoOuZlhg0MxYER/YxEiTGlA3ZTE9S", - "BjwhodYhTDNYGrokbH6JYpwAlWJBgERRjBURFEf0EwkRN5/EJKT6gBoyAniNEqxJNgi40Kev3luCg1kB", - "Cn+W6NLIG5fQ/SVlGisvDV31hqy4859bb8/fP397/uZo9Pb0xZuD49FvL/5bPzYftQa/f24Z+2YmaDwn", - "WBCB/vQZ1vvFSKchEa1B6yBVMy7oJ2Ns+dJpaRhIjV84oT2eEIZpL+Bxq9P6S/HPD18+OHlKD0XYXJOB", - "Z2JfvLKMOQo9HOXIGfMksgYiEO0wmGqBw7w6Pd/Uh2uCpVQzwdPprEwY9mS/EUmEVF6NKB+NE9+cqLxC", - "x5tvkZY7UEQ1gWZyxla/f/J8Uw5b+o8n7o+NHjoyVAvT1yyECyv+yJlGHy2EA8ocnp4jHEU8sCaQidaV", - "JnSaChL2KpY36N3HnwlTYpFw6tPBKswpb7rMo7rd/O0NWNHmmLJNqbehG9wM7oA3t9YEXrA5FZzFWhub", - "Y0H1MSvLtPLm7dGL0Ys3F62B5uNhGlij4unbd+9bg9ZOv99v+RBUY9AaHvjq9PwQdsqQjUqidDqS9JNH", - "EjjI1odiEnNhNGD7DWrPyoKCoVsEmzNs7bx6bpBr6xXglduUkEpo7XoxHZcxZvvVcx+2zBYJEXMqfWay", - "X7N3bucLx7ph92XclkTMiciQFrC4V1A/goinYbcwZKc1oYIEAmu0a3Vaf5BYy+HzTxp18rl7vvNbrxrJ", - "n2sESxwllJEVkuV3IuFdc3EVcRx2t+5YwGNE6b6Xl/jGvCjvr8UJkqFEq7NkjWDhNQ3VbBTya6an7OGr", - "9g3KGmfM9aNeCY7+9Y9/XpzkatLWq3FiOe3W9pOv5LQV3qq79ppAsoWkiX8Z54l/ERcn//rHP91Kvu0i", - "jCByK6HO7v8L0wOwbI3rYema0lgzy2D5rxlRMyIKp7dDFv3I6MPwOXK4V1hKyTxavNNcYtR8TkSEFwXG", - "a+fU2uoD96vMSlAFtGq/02z0CumP17Bh3Zs75F9VdfTtvp/ReiblmdNzzSvsudBkJtlEtrZP7M/t5SnV", - "zOiKJiOQmkd4mplsV902n13RxIri8IXZxigyjCBMQXgfc656Q/ZfM8IQ7B1sMPlIAuB5UmGFDk6PJbqm", - "UQQGHmAqy0eLFuxztmKaS6X/K1LWQeNUaWmdK4Ks3gSDpDAXaDwmKGXYXWdXZGe7wCpeWbBcEcFINDKy", - "sWwIGfMRsh/VAgeWOsFSEWG4fZqU4XX028kZah8tGI5pgH4zvZ7wMI0IOksTzQ82ytDrDFkiyFyrEGwK", - "xkZqx+UTxFPV5ZOuEoS4KcbQWWYis3et81en5/a2Xm70huwd0YAlLCQhzNmdOBKpGVYo5OzPmmJJWO62", - "OH4F6H5avokq32nNgyQt78h2dTfewH26XvucCpXiSLPKkjTovV43jhseqd/4hRS1D8u2MuTEqnwv2tTe", - "YXoGL45lmdhvtjCCTmOzRUETXzJgODXxc7PJrun/mLmJrDTb5JriV4x1Zjqpgsj23XEruwWUjjOYlGGF", - "7wY8B7KgWdeaxUMiFWUGnXRbZAU6idqXWhm3eKzV78sOuvxL6YEmXacZaPHgGhloADtg+lGx/6pNYa22", - "31ynq2wOlrffjwNZ62eE5ltICcykPhq1iJSQHvoVeDBSJE40I2JTRCWShneSEDF+/e+IG5nEfTpkemrS", - "eGlYcGQ2H0mnjLLphpbS9bmCw9AYhiapSoVuN6cyh2YZdZzxpbqA92Z2xLDTOJX6QA2iNCTo0hloLsti", - "3bL5Zlmjs/acJQXFgAQUE9DV1GacKj28XnCMVTDTcOKpMm5bdumyPIGykWjddaadS3bRdYv9P8vYRRmo", - "1lxQYfx6cfaKBax6BfNinRXPyhl+C+MVWcCWO2siXrInFg2JfnOfIJJHc2JPzaIpcoyDK3OUGM8Ja4U0", - "9kRrQtTkXyFRr3Ft3VZoeDUGf1nSX0YlsODaxeYYY4V3Y75dZFxIL86M19F6rSQAfNAcBgikqcuOUXUI", - "GBAQ08gSoZAKEqil7imbDhl4cFzaJz3b26Umci1i+IjQp6t4RbmCsmK+KW0tKuysk9qgG700HlOlSNgp", - "ywZXhCRy/aK0dGztzh7juCDXgjpGZu09YUPpirAJFwGJrYz/dXrfi0JnXi3sZl0sO1QY+BbmbPEJ4SSJ", - "KAmN947ZD7CSSrtPYCKteuyGFaXLXOCXh7zEUXSJ2rbRBhJEr0W6vWKc5cj+/vDUoUB26Xxx0tEYqbnA", - "5UypZKT/I0eaii+rndlvHYXr7vSZJNF+H9Sj3d0du6vWZmYmXOm2bB7zOiXUb80Zw4mccVV7r3VFWbgO", - "UVwnv+m2tUaxTKCRtvl928USQbppMhUYHFPv0ip269tGgGY9513jc+5zLsygGqRS8bjgYojaFccIWnah", - "KANrzqNuiBUGC2JDM6eZ7rK7brwwXRkdqs4AMpqOPd429JPmlmhKp3i8UGWz/Vbfp6l97dWvm4tvW+rc", - "3o3mR8KR4qsdf+kEubZN/PzgHBgpPppPqKfn7DjKvUaoREHFx97qo7qLbhJQq8WDbBLMjF+mAQIIexcn", - "xSuz3pB14dgcoKNsgKzbrEsMMiEOzYVFm4vCJCg4e6HxYgNhdHHSQ++z2f5ZIq1ozImLA5hhicaEMJSC", - "xRdOsa45Q4sTSCUcdqr6uTVZmJCBDbgZ5PZdD/26SEiMrflHk0KMFQ3AwWhMK+uBY8RslL2KxaxofGpk", - "LFrlLv2OTKlUouIsjdrvXh7u7Ow8q5oNt590+1vdrSfvt/qDvv7/35r7Vd99VISvr4Myb7EuW0Xuc3h+", - "fLRtbZTlcdSnXfxs/+NHrJ7t0Wv57FM8FtO/7+AHiZvws7Kj3NcMtVNJRNexSY1VPg+zgiNXjQfZrR3D", - "7snPK3dbXdXWQOK9bnkfASE+V2Pr6HrzkI0qw1zrrFxY3LIGvkhAX8yppCB5WZ/AgHq9H4+ovHouCL4K", - "+TXznNsxnhI5MueZ340glca3hXy0VgnBuZpIc11ZtlZu7T7d3d/Z293v9z1xEMsIzwM6CvQJ1GgCbw+P", - "UYQXRCD4BrXhnilE44iPy4j+ZGdv/2n/2dZ203mYm5VmcMgUJvcValuI/NXF1Lk3pUltbz/d29nZ6e/t", - "be82mpW18zaalLMJl0SSpztPd7f2t3cbQcEniL9wcSlV3/nQ5zGg9R5zx9eVCQnohAYIIluQ/gC1YzjC", - "SHZJVKbJMQ5H1ujhPzsUppFc6ahgBrMtjYEsTiNFk4iYd7AhjWzIsPIj6MnnBEIZI2KUhe3coCcbzbP2", - "Yt6tJWuCSlFZJdCdUAlSSC48URKFA0Oha/kc7GY+sQ91eGDX0BAbXmvVqRuROYmKSGCOLj3ZmAuCMjwx", - "m1ZaFWVzHNFwRFmSelGiFpQvUwGyqOkU4TFPlbndgw0rDgK+wqB7TDS7bqafvuTiaq3XpT6JRyJlTHez", - "1ppzAAbwiTWxwCmOkf3aOfYXhL7sFs7cVdr3Er0zXxjLTv44SRWiTHGtnbJwvOjASNYCxJAgUnHgpNbQ", - "Z7tpKl365RYwcjqvCzNezjsfyOWkOzG39HerYYspUSOpsForsWhMeQ/tz6B5Yydu/eFaA0gDuDNy/RBA", - "By/3rkbbrmQ4uR+Ir/IBy2wNeSM4hQUNSQ8BdYEziouqq1DameJJQsLM/tMbsjNDKtkjaW4+9IcGDmpG", - "qEBc0CktD1w2jN2nM9lNUNFh063RsfjhsoQKL8Frop7o8UQRYSDoAoaLUT92E1qdloV9q9OynKgMGvfQ", - "A5Hcw3Fpiq9Oz2/qEpYIPqGRZ7nggmDfWs3MOUu93u2fdbf+j3F81PgGIhplxm0h5iHpVWLyoX2zk+fV", - "6flp3ZyyhAioOLulNWWOJh7OkfkjOIjYyyB7m2g1GIf++mDJBsll72c+WXYicEzG6WRCxCj2GNde6vfI", - "NDAeRZShk+dleVbLzU215tPS5oDaPMGBjWdvBn2PQa6yjE4Bmh/82/WOmGO4LgpOb5WwbWwgXA+9yVJQ", - "oFen5xLlzkEeS115e2vd1E9nC0kDHJkeTVArZUUDGyBnYwn5NP/QmiI9cnLslQ0dIaD2fJqkQIZn77rH", - "by8245DMO6U5gUPPjEdEz3ujwC3mLhYu96kvMYl5naXDIIZsSkAFWGUU3BhIBXr1QEdxhaORjLjPyeK9", - "fongJWpfvDSxSnoGHZSUtlI/L0ChhN97XorRHKlu2DMYsGoyLRG4V3csZ24x5pXC8kqD+kjlV4Ijk7Cm", - "jM95WLXbeH5V3mh+tZZ6bSe+cY+dP3aDmKnDkyMjMAScKUwZESgmCtv0OAXXFBCHWp1WV59RISYxeLhN", - "/n21V0qNCb4YBFVrxD1cynZxLwbcmijtd8Z1IEQxZnRCpLJR2qWR5QxvP9kbmFwSIZnsPtnr9Xo3DQ15", - "kceCNNqKTeM5X4gS6cnZ1+3DPUSANFnL59bpwftfW4PWZirFZsQDHG3KMWWDwt/Zn/kL+GH+HFPmjRxp", - "lH6ETpbSjpSvNPWZZZ4P9EqYdeXSuMRBgV97xVSjz4BHAoSreaN0FZ5q/cRg3NeG4946YUeeNUoVEnUU", - "HTkbJO2gn1ZbQp1gBG3smClTNMrzmSzbQG+VkUauDNpfCthPCMvC9KPI/Ao4m2uq8MXslxi4e/dV9wfW", - "O2UUUg8m/5fV9oxzAwQzrae31iZOkvVo6xcUM/7XNFeJjSj2nETfnOvf5o6tPPrb6X/+8X/l6dO/b/3x", - "+uLiv+ev/vPoDf3vi+j07VcFLq0OJv+mEeF3FgQOF0ulSPCmqHSCVeARqGZcqhoI2zdIceNn2UOHoPgN", - "hqyLXlNFBI4GaNiquPYOW6hNPuJAma8QZ0h3ZQMMNvTHp8b8oz/+7HTLL9U+QhtJIOyGZAFEMh2HPMaU", - "bQzZkNm+kFuIhDt9/StEAU5UKojePS3DRgs0FjjIIwjywTvoM06SLxtDBhou+aiEXkGChcqyX7gRACns", - "rIzPgG1OQhePbTTkIcvOpSwc29hoepkRBGzzVU9JP1C86gsX5QiY/b4vcB28tfRGRlQqAg7VGWZrNMrc", - "yNB+v8Qq9vv7/bUCfoZDK9APKGE5N6VDyga0ZBAYhjaMGzzLGtjSNW8yNIJ+ff/+VINB/3uGXEc5LLIt", - "Nkqe8d2TxkaoIlnw2tto+SNC9O42XJAxksFnUYNgnRfGrfP96zOkiIido3070OCc0ECvD67/qZSpRkWK", - "0cHhyYuNXoPkmgDbbP4r9vF9tsJqUIY1mtXZAjOM1/DtoOMjcKu1FJoLcOBW85ILFBkGk9P1AJ1LUvZR", - "ha0yt/pmJ6NFbnkzJ8CwteF6TKqcYoDeZXIjzqaSOUjmyOC6zOkSurUXL8bnZ6n3ij8teDNZvciyNvDw", - "wSpz7tYnbj0rWE3+HogDzVt/7IJN82a0XTSG6sH8qJHv/b1LKzs31VFvmhehHLpYCHvNUiM0z2lwH7kB", - "lvW1j1SNai/hkX5tr9ydVnJxgmZYsj8reFnRTbZ2njZKUqlHbXp9Xby45hMzpYyqXBxkdu1qIkKvaBQZ", - "bwZJpwxH6Blqnx2/+u349esN1EVv355Ut2LVF779aZAiwaH2q9NziFLBcuRugOqdHnHuOEw+Uqnkcpho", - "o4vU1SkZfi2lTfDG3W7cYS4Fd/u8tIyHyJLwLd36vr8MDStzKnxtYgQr7N5TXoRa5urLKVDms+bx3WY4", - "uJfplGJ2fPyhKBM4n+tbpxTotKjH3/RAahZIQnR8mmcWzI1SrvvKmp5t97b29ntb/X5vq9/ERBfjYMXY", - "JweHzQfvbxtDxACPB0E4IJOvMBFaxDbCG46u8UKioROvhy0jzxcE+QLZWhG80fXrcuaG2yVqqAoU61Ix", - "3CT1QrOcCivSA5+VEwM3ltGe/O2rcgiTpiezdV2wX41uYrwmKOBpFGo5aKwpz6hVJLTanyQqz7kMxHrO", - "rhi/ZuWlGxumpt8/UiIW6OLkpGTxFmRiU8o2WDi4PNTsA09utA3ba0TltbO5ZXqDh0hpUOWahdPqzhMY", - "FE1uzoXSYGgD01suPXqvvSkzW6PxZMWaKkaTkMxHaeoTivQrFzhxfn58VEIOjPe29vv7z7r746297m7Y", - "3+rirZ297vYT3J/sBE93apK6N3d7ub0nS5ma6wOVAPBggDRxaOFA01vmijJOFcrc1DQhH2rpEhXEWBOW", - "AzaBY0YVZD6kbKq7ARXdSrkmLtIkZ6SMKgjEhywulOklgy1Ed2KdjwboFbSFVziGcCE3Ca3blM0AOFwY", - "M6hmDG7oBP5aPeWzWaq02AXfyFmqkP4Llq3BYLWN1V0YHjNAbzh8I5yPKONVtcU0B9+r5eZVFadtvYKc", - "9ygMZhnmAL3MmGTGZi1bbUtifxrebR2bwWl7o+Q6Z3e8pbEl37mCV1inZSDa6rQcoMB7bNmPzM7LGyJR", - "REXf/QDBEbDQ3E8nVTSyuQVgJVQqGhilD8Pm1lGyTYNFwpE5wetu+4zzhz3ls48co7g4QW2IRvwrsjqh", - "/msjuxksUuXu9rPdZ3tPt5/tNYo5yCe4nsEfgmvS8uTWcvsgSUeuXkbN0g9Pz+Hs0+eqTGOj5Nu1F1w8", - "E8EDLWxShvICHPngz3rPiqEWIU/HUcFoZOOywJ+/SbWUmuutP2g0p5MJ++NTcLX9d0HjrY97cnvs1c2y", - "gfyC7HHR0Lmk9ZFx16Qu9HvDA0IJWRsw8o5IWAE6IwoB/nQRDuCQzjyKLMq5sBILcS9i7e7s7Ow/fbLd", - "CK/s7AqEMwL1c3mWJ3YGBRKDlqj97uwMbRYQzvTp3CwhLQOzApyfzpDNYtwveWBq1WfHhyU18lKONbbv", - "eVwL8gsrBNlFWaCDY1QmIC1RuRfaOzv9p7tP9p80I2OrcI3Ex9UcxqXCMOCx2UOKO98G4/j7g1OkexcT", - "HJQVjK3tnd0ne0/3bzQrdaNZQeYbk7HiBhPbf7r3ZHdne6tZ5JPPAG5j+koEW+ZdHqLzIIVnNzygWGa9", - "nbrTwid4LntjrnQAzT1Kq+6DN/EXzmO+qYReacFVFbW1XFaUcQtxyxtNzBx+FqnHqavCpSXQpq68qz13", - "T7GaHbMJ9yT0uYG+af2hnOU70XKQhJojIWGUhI53ZYqnFa3AwyqSBIUpsZAzopLAFuDY3PJA4h7mZDLK", - "pmXf8qUBm2iBZg6rI/xhXNuwicFK+v1y3osUYGVMzBLh3EOnkb2cypFfUVnuWJBpGmGBqu7qK6YsF3FE", - "2VWT3uUiHvOIBkh/ULUmTHgU8euRfiV/gbVsNFqd/mCUXzBXrANmcta9wGxIZdx8Cb/oVW5UnJvg5N80", - "329CmcUm9j/vrdNLrTsZj+5zRj8WEL0cAru73a/ze6vptOTxthwNcFPeblHWR/HOUf8gy1Trud0090cV", - "pbgsB5fW61stXFCu8vJblgRQ25kUXYhxGa6FUN9GB3GzO9Kq8dzNZlOSoDz67v6Tp3sNY62/StReUYju", - "KwTrebxCoK7ZqZMmUtv+k/1nz3Z2nzzbvpF85O5Zavan7q6luD+VhNQVme1JH/53o0mZmxb/lGpuW8oT", - "KiWXvvWEvqwg3TzGpkbrXlUENt9Jp+aXBfBmIu4KaemgJHIV6ie0yWRCAkXnZGTg1s0nU/HNajSHACc4", - "oGrh0QDxtcnTmTWpxIo06L0yWQ9Ibd823E9zLpmOc3eAthsc/cVodhVc2G+cskGm4zot8m11VKND2txs", - "FQtFAwNBng22eid/nQETXWNZulTQvwNItJfXx6jePpkWzQv5OVzPavnl9+q+eCd/3b7i9le2s6B1lITk", - "KsRXHaH1JKglgsZ5fD0nsq800Hqfjgp/sAfg7b4ajYvJVFZmqyllXslP3ZuP26yyx/J35gS7+XgFB4Kb", - "fFjNKwH4aOdgQZ733SmhRA02KS7WpwG8h+hwY9K+VXy4tYY/SIi4fXwvYeFL23FW8IJq7vPnvvKXYy7d", - "Y+51+zvd/t77rZ3Bk73B1tZ9BChkdxh1ptynn7aun0bbeLIb7S+e/rE1ezrdjne8Xh/3kH6yUkShko3S", - "riEhopoRpJpJR5KIMtKV2fXH+ovoFaFHxiiX4AUIeSs0spuoAa6w6QqqPSsvski8WOXAqSa0fwj/NDv7", - "lbpMdfrHR6unfav7hOpE/AhWnQrgU7PJQMDc1p1mGgW7KlCPF5A1i/KhTOk+voTEH1ZwsN8s4dZxKusW", - "bmeYZ6dwxOTuF0tYk79eApSPxa5OoFE5hMwdaTFfSeaSerfZM97bLa1zYC4kddl+slfO6nLQ/ZvJ4oJG", - "vcHmL3/9390Pf/mTP5NXSXWURHRDMgGJ+Yosuia1uEauXjn61RTskwrb/FeK4Bi4XXBFDHeN8cfifJ/0", - "M1v24g2Ol5YAqkZMWfb32gX5i+ouIZpxNqlLzRprCvEkzKKmUr4NvUeFxqhN4kQtXHips6lv3Mz55SDr", - "sKbC5p067vef3UWY4fnKuMIfMDFw0TfJTWitV9LS/tcG8/iNckdVH2Fj+bbJDss+rZUUblJ16212MU+Z", - "GoHpedm+pt8Zs7YNpJum1YwCmzFTmzZsdznak+AQcpCvvMjIqcw56nTho/X2+ZW3hoWVFWZSvzfGMW05", - "Wm4FgE41aK5nRJDCRsAHeezhDUFmjczrI9OMY46WRLvVbJgmYYugYLW2ADKA1SDILiKWbztW+9ae4I/Z", - "CCCBYrkkLcM6CmVOXz2HJEzvXFZEOnFdwDSqheier8eiJvUYljejiFXL6zbtvYRnedUK7ldHWxXkzMco", - "oeYyPmo2R4JUULU402zIRgBANZeD1KAh8CdYBDzOB4foTCieS+3NaeXmVmtjNEAHp8e2lguDsxxdnKCI", - "TkiwCCJig+uWHNpAn357eNw1UcFZjS89PFUAEJdV++D0GJL0CmnG7fe2e1AyFcoDJbQ1aO30tiBlsQYD", - "LHETkjnAT3vdpukQTr3j0J7Oz00T/ZXAMVFQce13z7WVIsIkh5DgsICnBcEmwVRYySaJ4DLNaGRUfwv+", - "xI7BD8wp0TEAx00dc6VaWNMiSd7abf2g0UEmnEmzodv9vsncyZQ9DnCevHXz79LcfeXjNpIyADwe59ol", - "kc9JOhbkXzqt3f7WjeazNt+qb9hzhm1RIALTfHJDINxq0GNm7jtczVliG+Z0BihUpLDfTaHqNI6xWDhw", - "5bBKuKwT0YhEGDI+mswkf+fjHrKqH4QDyhlPoxDqDSYmp71moxgpLHrTTwiLYEbnZMjs6WFy52IB4dIx", - "0qeGsVuVScMMbXbfsB0i1XMeLirQzbrb1N2BtFUGcDXsSJIRuF+P6tIOZXaThDIG6Uvzqs8u/8YSRzf5", - "pqFkuq/UFcNM5emLTaLpKwLuZRP60dthIz9JzfBgWwjUNcjC77c3/De0EE3md244yt4hC97yIad1BFug", - "K5ME3KUBFmMcRd6sS9OIj3Fk83FfEY/g9ApaWKAUA+/ckct4SEwQVbJQM87M73ScMpWa32PBryUR+mC2", - "wdQW1q4ckUFdKIxAYwhoNqla9JibZoqbn6/I4ktvyA7C2KXhsWU6cSS5TVSeFazKCs8OWW24X43d5NAW", - "LjFJgot5Vc00eaqSVPWQWQhRNgIcmkPaXTkj4ZApjj4LU2Vh8WXzcz7iF5CoCQ41nhSamCVtfqbhl7pZ", - "yxHWqx9BU49OQgAAw5Y+XYYt/XsqsJaoUwmV/YmEOpHT4pa2DWFzAdLKRhXCAWYo4Ulqa8ERZPOvl/qA", - "bBo4ipACUnLfahkIdrJmPfay3Zca0t60m6vRChlBksgCMfV39/30JEkgiE/t/s+zt28QHFV6D0yzPMIT", - "YGTKEmalUfXovSF7gYOZrRcGzv/DFg2HrUzmDTdgrqm0VwHdLghev+ip/WKG6dDwl15Pd2VkugH6/bPp", - "ZaBpKYlHil8RNmx96aDCiylVs3ScvfvgB2jdheVZiRGgtuH9Gy4XEhT4yo9Bc25gFiJueW20QBjlHKio", - "3Y8pw2JlIicP6C0EtYKJp7IIjM9DMPEMW4OhM/IMW51hi7A5PLOWoGHrix8CNvFYvae5yWVlm+VItNfv", - "b6z3JLLw9YjQpYaa/L4sSV/bdyZ4WKFrWfAwi3NhMnoHTVYyI249gOTzHGe1GX+KeGtEPKtPF4Q3+L54", - "Dhj0jYixHVckMK2AR04CW6mdGLSAODHQOJzfn1E4qJPgcuQtqh9VJXNZrdito7IAphg5/Nt9APyDcfPM", - "/jDus4caF0emBpXLc/240BE2yyFix68RvyLqe8C4/kOxUleA5Bvi72PBn1fEyn050CrcbBOKwBfNLdXY", - "Z0FwLG0vprHWVc9gTt0zwhR6AU979l+n8UCo6GXEp5cDZEAY8SmKKCPS+mRkdxj6ULSwhI9MqsbsO5vt", - "NJhhNiUStc35+a9//BMmRdn0X//4p5amzS8g903j7w+RkJczgoUaE6wuB+g3QpIujuicuMVArBKZE7FA", - "O31p68rqV57cqXLIhuwdUalgMvP01+sCmJgObSkPvR7KUiKRBBBCcbqJdUH/JS8666dlA8oHpejOks5l", - "V1BYgD4VHQ6ATyE14aBW/2r5rWdmzSX7WdWCu2TTX89fFPmoDPZ2zQRvyGAAxD66gxd20ah9dvZio4dA", - "xzBYAWEGIDHn3VjhufeTJ63nSYajlBkKQNnwpkLa/Fr775Ft08wAbHv8kSzAdXUA6k3AxuRBBAkdvH7q", - "Ck3MwX64OdOwzz575MoG1htob7/e4hDOT7ORInx3++xwbxnmtn5mDrJvoQKjti1nlqWwLBXp/FZI/yCn", - "RqG2a3Z0IG4SZz6YWnbI2SSigUJdNxfIkhGTTFUrI8hjYQfv7KwRduuqBvQWz7fNUnxK7UmXharkR979", - "nx6VQW9yjORBxzmu/TxJ1qHOEZUB198WsKUb4MQm8DTiS0anRSxaZ5A6gufZkbNSXDrKqj5bgnw405Qd", - "OmXVs+EBmOJRhSF+Q0ZYSUpYCNN/TNh8nu2iK5G8wnL1faFm/+GkoIe2YvnQ/DGZscIK2DQXnGWlqurQ", - "yxazuseNtiN4Fn5GhKNqM1GT4C5flvkUBTMSXJkF2UreqySCY1fsu4nqa/r7kTRfU0XsBhKLBflPEaWB", - "spvDapWCe2wzNd6ffgsj3Ei9vbt7XotgHiCDs8nYWaxNEkQsFyzY+KGueh/kNKtWC39ElHSaRpG78ZgT", - "ofJaasUzYPMzuCWtl+0dta08Ds7fve4SFnDwQ8t8qPxClCtxdLcSvtkws5SfaNJEJwRQOcSoF6C/Yv+N", - "uyDK8uX/2/ZLmzH/37Zfmpz5/7ZzYLLmb9wbsvQfijU/tMT9iJFPC9y0DDRgTaYQ0ToJNWvVUEh17X8o", - "OdUWtbuJpJrB9aew2kRYLYJrpbya1Re8R4nVlmL7NlcyGbL5oA2vnH/iDyapPqyVz2JkoWp/6drDppzk", - "Ii9/Zmt+Pz4HSpphXPHYaGiuzgly5fHhUPf4qGMr25l6dFmAyAMZr908Hly4teM+vOX6IB7TacpTWYw9", - "gUKGRNpgpYiUGfBjE7vz47lW8P6OsbT/kEfHg8vVP/H+niT+6oYa5m1uoNbJ/K5VU5nftoeSgaYahYld", - "e+eqXNg0Khs1ToWuDkxTNC6VLFp2dvTNy6eLoHOtqOTqAgINYjBk/6H1j98VwfGHX1yQTNrvb+/Bc8Lm", - "H35xcTLsxKEKYUpQIhEWBB28OYJrvylEr0MytDwkrzoPk+LM1Ia2ZUv/xylI+c1ncw3JYeFPDamRhlQA", - "12oNKauicp8qkhnkm+lIDt98ALepNX5qSQ+hJcl0MqEBJUzlGYCXnMRsAvFHGFvG7P1QwbmjdNA21pLy", - "0karBdA87d2DO/Zkgz+8cuQy7D1OH3luomJCp47kh2G9PvK94UP/YZnzw+shjxnFjMBfBd0yI9qc2ATE", - "fgHhJRdXTTHPk4fzzhHw7qWT4gq/Q9lET48Uqhx+QxEFDm/jW6+Rpiy5PABBLiVX/ZYunQ4SVrk1QZGU", - "TfM6l1TNeGqyqozsQ5OVTVOFrSYDIk9ge/3W7EWP/gAC6BuuEI2TiMQEsrZ1DTZBcdE0SbjI6o9RWUhF", - "fDP2p8mm6GBrktvYKsAdZBM2g7HObVgb7PbL2+XlmhGfrg+qzQZ3EaSeqNohO5cmyculEYUvUcZkkeJI", - "kogECl3PaDCDCFv9DPo3Abg4SS6zlBobrlhqMbMIDN6WRFAcQZVHHpl6pZfzOL4cLGeAuzg5gY9McK3J", - "9XY5QC7rW3ZASN2qGDGrVxFhqdAbGwfc1pgkeBSZHb3Up1BhfRs2ljZPeTJkvrhaRq5th3SCLgshtpc1", - "MbaOob7mU/mt5KVOfaIqsxbFkQDAGdwkLGzVGXZo5I+u3er3fflTGkb6mmncc6Dv0mRe82mWJKuEyjhJ", - "mqKvnSZg8TyOV+AwaheSmUsV8lT9VaqQCAEfW+yuQ27UxoH5Q+ErjajMliJz6eAB/bzmS5O1xgsqzVQL", - "+aTNX/M4bnVadj6e6rlfHzFd7XDZzKZ3phAW/VPSvknAc5nZFyKeKyeHrVtRL3Lbchw/vL7nyl1/YzT8", - "BvaxfBaUOVEF9javI/64IidNpZaqLGaS5/toJCv1Uk8lZaPyWZ6m/3+gimrWWq3P88BKagZin2ZWKm/x", - "zbXTrNrGTw0101C5QGFqhqvUu/lh1c6MoaCUlTRPK57eVvfMksxlYIY6hGzlhUDO8zY/u5/HtxAXvhNO", - "2Kmt+lKXzihf9PfAcmtqojXiud9ITrLHakFA+IYs2FVne2gOnEFFq3sZl/su2LAhuIwbF3kOVN6nrvDi", - "T2ZcMgMaS+ltmbETPpdsgQX2TFk3iXAdX7Zyai0DtlWgfnh9LddVfnCNLeBCGNcxcEZ7TKGLhTvDgurZ", - "TnAqSScjmI67t744OdmoIxqhVpKM+D4utG8nOVTKcsahvy6yoKFLUn94cmRT2lOJRMp66G1MIXP8FSEJ", - "pKSkPJUIfAB7xXpjdVXQsoJihCmxSDhlau0s8qb3M5kvt0rS/cB8ygZv//BmJVto97ExKeAd+vS2C1it", - "VClTZs97TeeurSgzmfW18IHHPNW9L9VDQxMaEbmQisTmzm6SRkBEkN7DZn+13xnftQ6iSkL18A74+iRE", - "xFRKypkcsjGZaKkkIUKPDQUnaUQK1w++m60zhTOueWpY3/dxtQUl0uA2B6s6qJWro+EkcdXRfNcnWUG3", - "W0/pJdxVIbmIxzyiAYoou5KoHdErI4OjuUSR/rGx8rJrBN/ddW7b21OWhvQxm3Bv+j+Dsxky/wgc7rjC", - "1txl/qNja69IkVgc/4GN9rM1uZavCYIjKAKaudmiVNGIfjKsTndCpaKBqZmEM9hBuRczXm/ITogSug0W", - "BAU8ikignK1hMxE82Bym/f5OkFCIh9ghMDlgePWvYxjx8PQc2pmSNJ0h039Ax+8PThHVMJ1gqzIXJmoL", - "26Pjzbdrrv/PAEz/g/Uxs8BVZOHf8J83uzf3oaylIVlDojxZpQDx5Ic3GFgJ7qe14HFaC8CJPVtNeypw", - "AEKxnKUq5NfMbxkwFVLl5mfz43hdKITCwezClYr+PqRdWy123TBugY+CKO2aQmLSk34Te70t6PtI0zlp", - "wLklgBBTDOrwnwKmUPiPht13f1lXhON3eFNnIepS/343tPXQJ5+dg4vwK8LjsZC5wTS3EihZWbQ+ZeGM", - "a3WzIBWCMAWpYHLRMsAJDqhadBCOXDVVWx4psyHlheDHguArfdL2huxdFkhpyzNp7arjVCsUUnllerDa", - "Uw+9nRMh03E2OQSMyeh5AHxbUDXAUWAqkZLJhASKzokpESprtK9sKveZljcfxLPR7qUF3WNTOfw4AbuX", - "o4XVOkqecrXpG86yVs3SN2S9FrxhCp4iK32eR66hqYJ/E5OdZ/ArWusWb1/dzHvtN/1Rw7HLXlL+SdhX", - "X7nKHyUr3lnBOaVp0occwx9b/oXCzEukWnLwWh8I3tij6z49rNYFgmeDP3Qg+JnXyeeRpaPCJbetugjw", - "7w8R+g/rXfzQEeCPG7e0KCGXQFfPiRpEgn8XGHg/IeDf2Lv+FiHg35W/J4Twfju/++/K09N6LGaenj+D", - "vO/TwdNEekNAa52Dp+F61vK8UlG6sG2aqUm2xx9JgrfGyhvI7w7sP1O2NVAZCsByp3CF3QDvlxbhSZyo", - "hbNG8Qn43eQ5BSX9BN57vsC5zOh8f/Fqt7DH3h16ODyttcb+TPX2YAbfPB/28dHjz+9WpLnSwbKpT50u", - "FsGMzkvxWqso2IIoEaSb8ATsrKEBmIWHO8sUFr3pJ2S77w3Z+xlxfyHqsmWQEIVUkEBFC0SZ4sARzBh/", - "lkhwrQnAey4WPvNtkXJfCh4f2NWsOQ8tTVljWO7mFy+6IVa4O3fcZoUJ7SuurE7wRxqnMTA8RBl69Ry1", - "yUclTPIGNNGaD6KTDKTkY0BIKAEnN4oT3urXWDbpJzKajpvMckUajrc2zQkKUql47Pb++Ai1cap4d0qY", - "3gst6k9Akk0En9PQ5MjNgTrnkYHqVg1Ab2p31UKF9QfPlQszuW8iwzQ5kKafaFJmC8btsTVojSnDMLm1", - "CS/KNGU8cPV4mIIfXE47DnNaP4+wapVtjYlayXFAVJyjSEv0Gz+Pucd8zBU9GdyZVjrtmmUxbebc0NDn", - "4D4ymGaOLw9rtr74fu7jC1WJH6HpfJ4ppHVm8+8LBfsPdz48tLn84hH7b70iTvkumMqhA92jD2Fe8wBH", - "KCRzEvEk1mKladvqtFIRtQatmVLJYHMz0u1mXKrBfn+/3/ry4cv/DwAA//+gy9hgdyoBAA==", + "H4sIAAAAAAAC/+x9/XIbufHgq6B4SYVKSIr6sCwztfU7WbK9ylq2zrKcS5Y+CpwBSaxmgFkAQ5l2+d88", + "QB4xT3KFBjBfxJAjWZKt2KnUmprBAI1Go9Hd6I9PrYDHCWeEKdkafGrJYEZiDD8PlMLB7B2P0pi8Ib+n", + "RCr9OBE8IUJRAo1injI1SrCa6b9CIgNBE0U5aw1ap1jN0NWMCILm0AuSM55GIRoTBN+RsNVpkQ84TiLS", + "GrQ2Y6Y2Q6xwq9NSi0Q/kkpQNm197rQEwSFn0cIMM8FppFqDCY4k6VSGPdFdIyyR/qQL32T9jTmPCGat", + "z9Dj7ykVJGwNfi1O433WmI9/I4HSgx/MMY3wOCJHZE4DsoyGIBWCMDUKBZ0TsYyKQ/M+WqAxT1mITDvU", + "ZmkUITpBjDOyUUIGm9OQakzoJnro1kCJlHgwEwJMIxp6VuDwGJnX6PgItWfkQ3mQ7cfj/VZ9lwzHZLnT", + "n9MYs65GrgbL9Q9ti32/3PX1THkcp6Op4Gmy3PPx65OTcwQvEUvjMRHFHve3s/4oU2RKhO4wCegIh6Eg", + "Uvrn714WYev3+/0B3h70+72+D8o5YSEXtSg1r/0o3eqHZEWXjVBq+19C6at3x0fHB+iQi4QLDN8ujVQh", + "7CJ6ivMqkk15VXz0/zSlUbhM9WP9mIgRZVJhVkODx/alRhefIDUjyH6H3p2g9oQLFJJxOp1SNt1oQu+a", + "YUVEkXCE1fJwACqybShnSNGYSIXjpNVpTbiI9UetECvS1W8aDSgIXjOcbtFosOWtlpqVHMWyrnfXBFGG", + "YhpFVJKAs1AWx6BM7e3WT6awYYgQ3MOhnunHKCZS4ilBbc02Ne9mSCqsUomoRBNMIxI2WiMfIZjJ/MbH", + "iIaEKTqh5f1tyKmLx8HW9o6Xd8R4SkYhndqTqNz9ETzXJKb7UQha+yeiN9qi2TxgSEEmy+M9B9YNgwgy", + "IYJoGv/C4RLB54Tp3aLH+wOM2/pfm/kRvWnP501A5mne/HOn9XtKUjJKuKQGwiXOZd9oMgJUI/jCDzO8", + "WrXWBYqSCovV+wNa3MJONPA1ws2Zafq501J4uvaTt7pNlXcCa7RDlrhALYt8NifMIyQFnCn7ooydl3yK", + "IsoIsi3sWmieqAf4KeLAEm8JDxn6lze/hvsGzMs8qOlNv+u0CEtjjcyIT4vYnBEs1JiUkFlzhNmOcuhq", + "0X9a2j6VswpLMlrNQU4pYyREuqXd2KYlSiVIqkvTh110SdVoToT07jkA6xeqkG1R21XEg8sJjchohuXM", + "QIzDEPYrjk5LM/FIayXxFyeaCboOQYqQSHF09vPB9qM9ZAfw4FDyVAQGguWZFL7W3Zu2SGExxlHkpY16", + "crv+Gb1MIX4KOMs2Rt3Zk1GgI0zD6Vp2NXX3nVaSypn5BbxbQwVnn2YDmrwi/fu9Z9KHwCSMllCrM/ll", + "wNeJWWw0jbjG6QKljP6elgTsHjrWuoJC+qCgIQk7CMMLzbJxqnh3ShgRmk+hieAxSFsFIRi1SW/a66Ch", + "lgu7Wgru4u1uv9/tD1tlMTba7U6TVKMCK0WEBvD//Yq7Hw+6/+x3n7zPf4563fd/+YOPAJpK5k4qtPNs", + "u73fQQ7YorheBXSdKH9j7l8E38dxzFIfaz5x3ZU+PF4WHMxcQx5cEtGjfDOiY4HFYpNNKfswiLAiUpVn", + "vrrtreIC5rECCWyq0XRNNFSUHiDjdsSviAg0B46IJjzZ0UyYKtlBWOvNwLyQPiX/igLM9F4wwgUXiLAQ", + "XVE1QxjalbEVL7o4oV1qQG11WjH+8JKwqZq1Bns7S3Suibxtf3Tf/9k92vgfL6mLNCIeIn/DU0XZFMFr", + "c6rPqEQ5DFSReO2KOOymEYh5MWXH5rOtDBIsBF58+Qq7iaxaaaPM1S51EHsk/9dzIgQN3al6eHKE2hG9", + "JJbckUgZGqb9/k4ADeAnsU8CHseYhebZRg+9jqnSp1maH9LGGtQrLvevLRLMOMgZUcT1hDJU1wgxOQ4D", + "QUA/wdHKY3gVir3IOsz6XT60f+ZSdWPM8JSANmkborHgl0QDihIe0YASiS7JQgspCzTVnXbnVFK9fQib", + "ozk2RoPekL2dcUlME/dKKyIBoXOCYh5coiTCAZlxUMTnOEqJ7KCrmZYYNDMWBEf2MRIkxpQN2UwDKQOe", + "kFDrEKYZTA1dEDa/QDFOYJdiQWCLohgrIiiO6EcSIm4+iUlI9QE1ZAToGiVYb9kg4EKfvnptCQ5mBSz8", + "SaILI29cQPcXlGmqvDD7qjdkxZX/1Hp9/vbp6/NXR6PXp89eHRyPfnn2D/3YfNQa/PqpZeybmaDxlGBB", + "BPrDJ5jvZyOdhkS0Bq2DVM24oB+NseVzp6VxIDV94YT2eEIYpr2Ax61O68/FP99/fu/kKT0UYXO9DTyA", + "ffbKMuYo9HCUI2fMk8gaiEC0w2CqBQ7z4vR8Ux+uCZZSzQRPp7PyxrAn+7W2REjl5Yjy0TjxwUTlJTre", + "fI203IEiqjdoJmds9fsnTzflsKX/eOT+2OihI7NrAXzNQriw4o+cafLRQjiQzOHpOcJRxANrAploXWlC", + "p6kgYa9ieYPeffyZMCUWCac+HazCnPKmyzyq283fXoMVbY4p25R6GbrB9fAOdHNjTeAZm1PBWay1sTkW", + "VB+zsrxXXr0+ejZ69upda6D5eJgG1qh4+vrN29agtdPv91s+AtUUtIYHvjg9P4SVMttGJVE6HUn60SMJ", + "HGTzQzGJuTAasP0GtWdlQcHsWwSLM2ztvHhqiGvrBdCVW5SQSmjtejEdlylm+8VTH7XMFgkRcyp9ZrKf", + "s3du5QvHumH3ZdqWRMyJyIgWqLhXUD+CiKdhtzBkpzWhggQCa7JrdVq/k1jL4fOPmnRy2D3f+a1XjeTP", + "NYIljhLKyArJ8huR8K64uIw4DrtbtyzgMaJ038tTfGVelNfX0gTJSKLVWbJGsPCKhmo2CvkV0yB7+Kp9", + "g7LGGXP9oGeCo//869/vTnI1aevFOLGcdmv70Rdy2gpv1V17TSDZRNLEP43zxD+Jdyf/+de/3Uy+7iSM", + "IHIjoc6u/zPTA7BsTeth6ZrSWDPLaPn7jKgZEYXT2xGLfmT0YfgcOdorTKVkHi3eaS4xaj4nIsKLAuO1", + "MLW2+sD9KlAJqmCv2u80G71E+uM1bFj35g75F1UdfbvvZ7QeoDwwPdW8wp4LTSDJANnaPrE/t5dBqoHo", + "kiYjkJpHeJqZbFfdNp9d0sSK4vCFWcYoMowgTEF4H3OuekP29xlhCNYOFph8IAHwPKmwQgenxxJd0SgC", + "Aw8wleWjRQv2OVsxzaXS/xUp66BxqrS0zhVBVm+CQVKABRqPCUoZdtfZFdnZTrBKVxYtl0QwEo2MbCwb", + "YsZ8hOxHtciBqU6wVEQYbp8mZXwd/XJyhtpHC4ZjGqBfTK8nPEwjgs7SRPODjTL2OkOWCDLXKgSbgrGR", + "2nH5BPFUdfmkqwQhDsQYOstMZPaudf7i9Nze1suN3pC9IRqxhIUkBJjdiSORmmGFQs7+pHcsCcvdFsev", + "IN2/l6+jynda8yBJyyuyXV2NV3Cfruc+p0KlONKssiQNeq/XjeOGR+o3fiFF7cOyrYw4sSrfiza1d5ie", + "wYtjWSb2my2MoNPYbFHQxJcMGE5N/NQM2DX9HzMHyEqzTa4pfsFYZ6aTKops3x03sxtg6TjDSRlX+HbQ", + "cyALmnWtWTwkUlFmyEm3RVagk6h9oZVxS8da/b7ooIs/lx7ores0Ay0eXCGDDWAHTD8q9l+1KazV9pvr", + "dJXFwfLm63Ega/2M0HwLKYGZ1EejFpES0kM/Aw9GisSJZkRsiqhE0vBOEiLGr/6KuJFJ3KdDpkGTxkvD", + "oiOz+Ug6ZZRNN7SUrs8VHIbGMDRJVSp0uzmVOTbLpOOML9UJvDXQEcNO41TqAzWI0pCgC2eguSiLdcvm", + "m2WNztpzlhQUgxJQTEBXU5txqvTwesIxVsFM44mnyrht2anLMgBlI9G660wLS3bRdYP1P8vYRRmp1lxQ", + "Yfx6cvaKBax6BfNinRXPyhl+C+MlWcCSO2siXrInFg2JfnOfIJJHc2JPzaIpcoyDS3OUGM8Ja4U09kRr", + "QtTbv7JFvca1dUuh8dUY/WVJf5mUwIJrJ5tTjBXejfl2kXEhPTkzXkfrtZIA8kFzGCCQpi46RtUhYEBA", + "TBNLhEIqSKCWuqdsOmTgwXFhn/Rsbxd6k2sRw7cJfbqKV5QrKCvmm9LSosLKOqkNutFT4zFVioSdsmxw", + "SUgi109KS8fW7uwxjgtyJahjZNbeEzaUrgibcBGQ2Mr4X6b3PSt05tXCrtfFskOFwW8BZktPCCdJRElo", + "vHfMeoCVVNp1AhNp1WM3rChd5gK/POQFjqIL1LaNNpAgei7SrRXjLCf2t4enjgSyS+d3Jx1NkZoLXMyU", + "Skb6P3Kkd/FFtTP7rdvhujt9Jkm03wf1aHd3x66qtZkZgCvdls1jXqeE+qU5YziRM65q77UuKQvXEYrr", + "5BfdttYolgk00ja/a7tYIkg3TaYCg2PqbVrFbnzbCNis57xrfM59zoUZVoNUKh4XXAxRu+IYQcsuFGVk", + "zXnUDbHCYEFsaOY04C6768YL05XRoeoMIKPp2ONtQz9qbommdIrHC1U222/1fZral179Olh8y1Ln9m40", + "PxKOFF/t+EsnyLVt4ucH58BI8dF8Qj09Z8dR7jVCJQoqPvZWH9VddJOAWi0eZJNgZvwyDRJA2Ht3Urwy", + "6w1ZF47NATrKBsi6zbrEIBPi0FxYtLkoAEHB2QuNFxsIo3cnPfQ2g/ZPEmlFY05cHMAMSzQmhKEULL5w", + "inXNGVoEIJVw2Knq59ZkYUIGNuBmkNt3PfTzIiExtuYfvRVirGgADkZjWpkPHCNmoexVLGZF41MjY9Eq", + "d+k3ZEqlEhVnadR+8/xwZ2fnSdVsuP2o29/qbj16u9Uf9PX//9ncr/r2oyJ8fR2UeYt12Spyn8Pz46Nt", + "a6Msj6M+7uIn+x8+YPVkj17JJx/jsZj+toPvJW7Cz8qOcl8z1E4lEV3HJjVV+TzMCo5cNR5kN3YMuyM/", + "r9xtdVVbg4m3uuVdBIT4XI2to+v1QzaqDHOts3Jhcssa+CIBfTHfJQXJy/oEBtTr/XhE5eVTQfBlyK+Y", + "59yO8ZTIkTnP/G4EqTS+LeSDtUoIztVEmuvKsrVya/fx7v7O3u5+v++Jg1gmeB7QUaBPoEYAvD48RhFe", + "EIHgG9SGe6YQjSM+LhP6o529/cf9J1vbTeEwNyvN8JApTO4r1LYY+YuLqXNvSkBtbz/e29nZ6e/tbe82", + "gsraeRsB5WzCJZHk8c7j3a397d1GWPAJ4s9cXErVdz70eQxovcfc8XVlQgI6oQGCyBakP0DtGI4wkl0S", + "lffkGIcja/Twnx0K00iudFQwg9mWxkAWp5GiSUTMO1iQRjZkmPkR9ORzAqGMETHKwnau0ZON5ll7Me/m", + "kjVBpaisEupOqAQpJBeeKInCgdmha/kcrGYO2Ps6OrBzaEgNL7Xq1I3InERFIjBHlwY25oKgjE7MopVm", + "RdkcRzQcUZakXpKoReXzVIAsajpFeMxTZW73YMGKg4CvMOgeE82um+mnz7m4XOt1qU/ikUgZ092steYc", + "gAF8Yk0scIpjZL92jv0FoS+7hTN3lfa9RG/MF8aykz9OUoUoU1xrpywcLzowkrUAMSSIVBw4qTX02W6a", + "Spd+uQWMnM7rwoyX8857cjnpTswt/e1q2GJK1EgqrNZKLJpS3kL7M2je2Ilbf7jWANIA74xc3QfSwcu9", + "q8m2KxlO7gbjq3zAMltD3ghOYUFD0kOwu8AZxUXVVXbameJJQsLM/tMbsjOzVbJH0tx86A8NHtSMUIG4", + "oFNaHrhsGLtLZ7LrkKKjphuTY/HDZQkVXoLXRP2mxxNFhMGgCxguRv3YRWh1Whb3rU7LcqIyatxDD0Zy", + "D8clEF+cnl/XJSwRfEIjz3TBBcG+tZqZc5Z6uds/6279H+P4qOkNRDTKjNtCzEPSq8TkQ/tmJ8+L0/PT", + "OpiyhAioCN3SnDJHEw/nyPwRHEbsZZC9TbQajCN/fbBkg+Sy9xOfLDsROCbjdDIhYhR7jGvP9XtkGhiP", + "IsrQydOyPKvl5qZa82lpcUBtnuDAxrM3w77HIFeZRqeAzff+5XpDzDFcFwWnl0rYNjYQrodeZSko0IvT", + "c4ly5yCPpa68vLVu6qezhaQBjkyPJqiVsqKBDYizsYR8mn9oTZEeOTn2yoZuI6D2fJqksA3P3nSPX7/b", + "jEMy75RgAoeeGY+IhnujwC3mLhYu96kvMYl5naXDEIZsuoEKuMp2cGMkFfarBzuKKxyNZMR9ThZv9UsE", + "L1H73XMTq6Qh6KCktJT6eQELJfre8+4YzZHqhj2DAasm09IG9+qO5cwtxrxSmF5pUN9W+ZngyCSsKdNz", + "HlbtFp5flheaX67dvbYT37jHzh+7QczU4cmRERgCzhSmjAgUE4VtepyCawqIQ61Oq6vPqBCTGDzcJn9d", + "7ZVSY4IvBkHVGnEPl7Jd3IkBtyZK+41xHQhRjBmdEKlslHZpZDnD24/2BiaXREgmu4/2er3edUNDnuWx", + "II2WYtN4zheiRHpy9mXrcAcRIE3m8ql1evD259agtZlKsRnxAEebckzZoPB39mf+An6YP8eUeSNHGqUf", + "oZOltCPlK019ZpnnAz0TZl25NC1xUODXXjHV6DPgkQDhat4oXYWnWj8xFPel4bg3TtiRZ41ShUQdRUfO", + "Bkk76MfVllAnGEEbO2bKFI3yfCbLNtAbZaSRK4P2lwL2E8KyMP0oMr8CzuZ6V/hi9ksM3L37ovsD650y", + "CqmHkv9utT3j3ADBTOv3W2sTJ8l6svULihn/a5qrxEYUe06ir871b3LHVh799fRvv/9fefr4t63fX757", + "94/5i78dvaL/eBedvv6iwKXVweRfNSL81oLA4WKpFAnelJROsAo8AtWMS1WDYfsGKW78LHvoEBS/wZB1", + "0UuqiMDRAA1bFdfeYQu1yQccKPMV4gzprmyAwYb++NSYf/THn5xu+bnaR2gjCYRdkCyASKbjkMeYso0h", + "GzLbF3ITkXCnr3+FKMCJSgXRq6dl2GiBxgIHeQRBPngHfcJJ8nljyEDDJR+U0DNIsFBZ9gs3AhCFhcr4", + "DNjmJHTx2EZDHrLsXMrCsY2NppcZQcA2X/WU9CPFq75wUY6A2e/7AtfBW0svZESlIuBQnVG2JqPMjQzt", + "90usYr+/318r4Gc0tIL8YCcs56Z0RNlgLxkChqEN4wbPsga2dM2bzB5BP799e6rRoP89Q66jHBfZEhsl", + "z/juSWMjVJEseO1ttPwRIXp1G07IGMngs6hBsM4z49b59uUZUkTEztG+HWh0Tmig5wfX/1TKVJMixejg", + "8OTZRq9Bck3AbQb/inV8m82wGpRhjWZ1tsCM4jV+O+j4CNxq7Q7NBThwq3nOBYoMg8n39QCdS1L2UYWl", + "Mrf6ZiWjRW55MyfAsLXhekyqnGKA3mRyI85AyRwkc2JwXeb7Erq1Fy/G52ep94o/LXgzWb3Isjbw8MEq", + "c+7WJ249K1i9/T0Yhz1v/bELNs3r7e2iMVQP5ieNfO3vXFrZua6Oet28COXQxULYa5YaoXlOg7vIDbCs", + "r32galR7CY/0a3vl7rSSdydohiX7k4KXFd1ka+dxoySVetSm19fFi2s+MSBlu8rFQWbXriYi9JJGkfFm", + "kHTKcISeoPbZ8Ytfjl++3EBd9Pr1SXUpVn3hW58GKRIcab84PYcoFSxH7gao3ukR547D5AOVSi6HiTa6", + "SF2dkuHnUtoEb9ztxi3mUnC3z0vTuI8sCV/Tre/by9CwMqfClyZGsMLuHeVFqGWuvpwCZT5rHt9uhoM7", + "AacUs+PjD0WZwPlc3zilQKdFPf6mB1KzQBKi49M8s2BulHLdV+b0ZLu3tbff2+r3e1v9Jia6GAcrxj45", + "OGw+eH/bGCIGeDwIwgGZfIGJ0BK2Ed5wdIUXEg2deD1sGXm+IMgXtq0VwRtdvy5nbrhZooaqQLEuFcN1", + "Ui80y6mwIj3wWTkxcGMZ7dE/vyiHMGl6MlvXBfvV6DrGa4ICnkahloPGeucZtYqEVvuTROU5l2GznrNL", + "xq9YeerGhqn37+8pEQv07uSkZPEWZGJTyjaYOLg81KwDT661DNtrROW10NwwvcF9pDSocs3CaXXrCQyK", + "JjfnQmkotIHpLZcevdfelJml0XSyYk4Vo0lI5qM09QlF+pULnDg/Pz4qEQfGe1v7/f0n3f3x1l53N+xv", + "dfHWzl53+xHuT3aCxzs1Sd2bu73c3JOlvJvrA5UA8WCANHFo4UDvt8wVZZwqlLmp6Y18qKVLVBBjTVgO", + "2ASOGVWQ+ZCyqe4GVHQr5Zq4SJOckTKqIBAfsrhQpqcMthDdiXU+GqAX0BZe4RjChRwQWrcpmwFwuDBm", + "UM0Y3NAJ/LUa5LNZqrTYBd/IWaqQ/gumrdFgtY3VXRgeM0CvOHwjnI8o41W1xTQH36vl5lUVp229gpz3", + "KAxmGeYAPc+YZMZmLVttS2J/Gt5tHZvBaXuj5DpnV7ylqSVfuYJXWKdlMNrqtByiwHts2Y/MwuUNkSiS", + "ou9+gOAIWGjup5MqGtncAjATKhUNjNKHYXHrdrJNg0XCkTnB6277jPOHPeWzjxyjeHeC2hCN+BdkdUL9", + "10Z2M1jclbvbT3af7D3efrLXKOYgB3A9gz8E16Rl4NZy+yBJR65eRs3UD0/P4ezT56pMY6Pk27kXXDwT", + "wQMtbFKG8gIc+eBPek+KoRYhT8dRwWhk47LAn79JtZSa663faTSnkwn7/WNwuf2boPHWhz25PfbqZtlA", + "fkH2uGjoXNL6yLhrUhf6veGBoISsDRh5QyTMAJ0RhYB+uggHcEhnHkWW5FxYicW4l7B2d3Z29h8/2m5E", + "Vxa6wsYZgfq5DOWJhaCwxaAlar85O0ObBYIzfTo3S0jLwKwA599nyGYx7pc8MLXqs+Ojkhp5Kaca2/c8", + "rkX5OysE2UlZpINjVCYgLe1yL7Z3dvqPdx/tP2q2ja3CNRIfVnMYlwrDoMdmDymufBuM428PTpHuXUxw", + "UFYwtrZ3dh/tPd6/FlTqWlBB5huTseIagO0/3nu0u7O91SzyyWcAtzF9pQ1b5l2eTechCs9qeFCxzHo7", + "daeFT/Bc9sZc6QCae5RW3Qev4y+cx3xTCb3Sgqsqamu5rCjjFuKWN5qYOfwsUo9TV4VLS6BNXXlXe+6e", + "YjU7ZhPuSehzDX3T+kM5y3ei5SAJNUdCwigJHe/KFE8rWoGHVSQJClNiMWdEJYEtwrG55YHEPczJZJRN", + "y77lSwM20QINDKsj/GFc27CJwUr6/XLeihRwZUzMEuHcQ6eRvZzKkV9RWe5YkGkaYYGq7uorQJaLOKLs", + "sknvchGPeUQDpD+oWhMmPIr41Ui/kj/BXDYazU5/MMovmCvWAQOcdS8wC1IZN5/CT3qWGxXnJjj5N833", + "m1BmsYn9z3vr9FzrTsaj+5zRDwVCL4fA7m736/zeajotebwtRwNcl7dbkvXteOeof5BlqvXcbpr7o4pS", + "XJaDS/P1zRYuKFd5+S1LAqjtTIouxLiM10Kob6ODuNkdadV47qDZlCQoj767/+jxXsNY6y8StVcUovsC", + "wXoerxCoa1bqpInUtv9o/8mTnd1HT7avJR+5e5aa9am7aymuTyUhdUVme9SH/10LKHPT4gep5ralDFAp", + "ufSNAfq8YuvmMTY1WveqIrD5Sjo1vyyANxNxV0hLByWRq1A/oU0mExIoOicjg7duDkzFN6sRDAFOcEDV", + "wqMB4iuTpzNrUokVadB7BVgPSm3fNtxPcy6ZjnN3gLYbHP3ZaHYVWthvnLJBpuM6LfJ1dVSjQ9rcbBUL", + "RQMDQZ4Ntnonf5UhE11hWbpU0L8DSLSX18eo3j6ZFs0L+Tlaz2r55ffqvngnf92+4vJXlrOgdZSE5CrG", + "Vx2h9VtQSwSN8/h6TmRfaaD1Ph0V/mAPwJt9NRoXk6mszFZTyrySn7rXH7dZZY/l78wJdv3xCg4E1/mw", + "mlcC6NHCYFGe990pkUQNNSku1qcBvIPocGPSvlF8uLWG30uIuH18J2HhS8txVvCCau7z577yl2Mu3WPu", + "dfs73f7e262dwaO9wdbWXQQoZHcYdabcxx+3rh5H23iyG+0vHv++NXs83Y53vF4fd5B+slJEoZKN0s4h", + "IaKaEaSaSUeSiDLSldn1x/qL6BWhR8Yol+AFCHkrNLLrqAGusOmKXXtWnmRx82KVI6ea0P4+/NMs9Ct1", + "mSr4x0erwb7RfUIVED+BVUEBemoGDATMbd1qplGwq8Lu8SKyZlI+kindx5eI+P0KDvaL3bh1nMq6hVsI", + "8+wUbjO5+8US1eSvlxDlY7GrE2hUDiFzR1rMV5K5pN5u9oy3dknrHJgLSV22H+2Vs7ocdP9psrigUW+w", + "+dNf/nf3/Z//4M/kVVIdJRHdkExAYr4ki65JLa6Jq1eOfjUF+6TCNv+VIjgGbhdcEsNdY/yhCO+jfmbL", + "XrzC8dIUQNWIKcv+Xjshf1HdJUIzziZ1qVljvUM8CbOoqZRvQ+9RoTFqkzhRCxde6mzqG9dzfjnIOqyp", + "sHmrjvv9J7cRZni+Mq7wO0wMXPRNcgCt9UpaWv/aYB6/Ue6o6iNsLN822WHZp7WSwk2qbr3NLuYpUyMw", + "PS/b1/Q7Y9a2gXTTtJpRYDNmatOG7S5HexIcQg7ylRcZ+S5zjjpd+Gi9fX7lrWFhZgVI6tfGOKYtR8ut", + "QNCpRs3VjAhSWAj4II89vCbKrJF5fWSacczRkmi3mg3TJGwRFKzWFkEGsRoF2UXE8m3Hat/aE/whGwEk", + "UCyXpGWYR6HM6YunkITpjcuKSCeuCwCjWoju6XoqalKPYXkxilS1PG/T3rvxLK9awf3q9laFOPMxSqS5", + "TI+azZEgFVQtzjQbshEAUM3lIDVkCPwJJgGP88EhOhOK51J7c1q5udXaGA3QwemxreXC4CxH705QRCck", + "WAQRscF1Sw5toE+/PjzumqjgrMaXHp4qQIjLqn1wegxJeoU04/Z72z0omQrlgRLaGrR2eluQslijAaa4", + "Cckc4Ke9btP7EE6949Cezk9NE/2VwDFRUHHtV8+1lSLCJIeQ4LCApwXBJsFUWMkmieAyzWhkVH8L/sSO", + "wQ/MKdExCMdNHXOlWljTIkle22V9r8lBJpxJs6Db/b7J3MmUPQ5wnrx18zdp7r7ycRtJGYAej3Ptksjn", + "JB2L8s+d1m5/61rwrM236hv2nGFbFIgAmI+uiYQbDXrMzH2HqzlLbMN8nwEJFXfYr6ZQdRrHWCwcunJc", + "JVzWiWhEIgwZH01mkt/4uIes6gfhgHLG0yiEeoOJyWmv2ShGCove9CPCIpjRORkye3qY3LlYQLh0jPSp", + "YexW5a1hhjarb9gOkeopDxcV7GbdberuQNoqI7gadiTJCNyvR3VphzK7SUIZg/SledVnl39jiaObfNNQ", + "Mt1X6ophpvL0xSbR9CUB97IJ/eDtsJGfpGZ4sCwE6hpk4ffbG/4bWogm8zs3HGXvkEVv+ZDTOoIt0JVJ", + "Au7SAIsxjiJv1qVpxMc4svm4L4lHcHoBLSxSioF37shlPCQmiCpZqBln5nc6TplKze+x4FeSCH0w22Bq", + "i2tXjsiQLhRGoDEENJtULXrMTQPi5qdLsvjcG7KDMHZpeGyZThxJbhOVZwWrssKzQ1Yb7ldjNzm0hUtM", + "kuBiXlUDJk9VkqoeMhMhykaAQ3NIuytnJBwyxdEnYaosLD5vfspH/AwSNcGhppNCEzOlzU80/FwHtRxh", + "PfsRNPXoJAQQMGzp02XY0r+nAmuJOpVQ2Z9IqBM5LS5p22xsLkBa2ahiOMAMJTxJbS04gmz+9VIfkE0D", + "RxFSsJXct1oGgpWsmY+9bPelhrQ37eZqtLKNIElkYTP1d/f9+0mSQBCf2v23s9evEBxVeg1MszzCE3Bk", + "yhJmpVH16L0he4aDma0XBs7/wxYNh61M5g03ANZU2quAbhcEr580aD+ZYTo0/KnX010ZmW6Afv1kehno", + "vZTEI8UvCRu2PndQ4cWUqlk6zt699yO07sLyrMQIUNvw/g2XCwkKfOXHoDk3MAsRt7w2WiCMcg5U1O7H", + "lGGxMpGTB/UWg1rBxFNZRManIZh4hq3B0Bl5hq3OsEXYHJ5ZS9Cw9dmPAZt4rN7T3OSyss1yItrr9zfW", + "exJZ/HpE6FJDvf0+L0lf27cmeFiha1nwMJNzYTJ6BU1WMiNu3YPk8xRntRl/iHhrRDyrTxeEN/i+eA4Y", + "8o2IsR1XJDCtgEdOAlupnRiygDgx0Dic359ROKiT4HLiLaofVSVzWa3YrdtlAYAYOfrbvQf6g3HzzP4w", + "7pP7GhdHpgaVy3P9sMgRFssRYsevEb8g6luguP59sVJXgOQr0u9DoZ8XxMp9OdIq3GwTisAXzS3V2GdB", + "cCxtL6ax1lXPAKbuGWEKPYOnPfuv03ggVPQi4tOLATIojPgURZQRaX0ysjsMfShaXMJHJlVj9p3NdhrM", + "MJsSidrm/PzPv/4NQFE2/c+//q2lafMLtvum8feHSMiLGcFCjQlWFwP0CyFJF0d0TtxkIFaJzIlYoJ2+", + "tHVl9StP7lQ5ZEP2hqhUMJl5+ut5AU5Mh7aUh54PZSmRSAIKoTjdxLqg/5QXnfXvZYPKe93RnSWdy86g", + "MAF9KjoaAJ9CasJBrf7V8lvPzJxL9rOqBXfJpr+evyjyQRnq7RoAr8lgAMW+fQcv7KRR++zs2UYPgY5h", + "qALCDEBizruxwnPvB09az5MMRykzFMCy4U2FtPm19t8j26aZAdj2+D1ZgOvqANSbgI3JgwgSOnz90BWa", + "mIP9eHOmYZ999siVDaw30N58vsUhnJ9mI0X49tbZ0d4yzm39zBxlX0MFRm1bzixLYVkq0vm1iP5eTo1C", + "bdfs6EDcJM68N7XskLNJRAOFug4WyJIRk0xVKxPIQ2EHbyzUCLt5VQN6i+fbZik+pfaky0JV8iPv7k+P", + "yqDXOUbyoOOc1n6cJOtI54jKgOtvC9TSDXBiE3ga8SXbp0UqWmeQOoLn2ZGzUlw6yqo+2w15f6YpO3TK", + "qmfDPTDFowpD/IqMsJKUsBCm/5Co+TxbRVcieYXl6tsizf79SUH3bcXykflDMmOFFbRpLjjLSlXVkZct", + "ZnWHC21H8Ez8jAi3qw2gJsFdPi3zKQpmJLg0E7KVvFdJBMeu2HcT1df09z1pvqaK2DUkFovyHyJKA2U3", + "x9UqBffYZmq8O/0WRriWent797yWwDxIBmeTsbNYmySIWC5YsPFdXfXey2lWrRb+gHbSaRpF7sZjToTK", + "a6kVz4DNT+CWtF62d7tt5XFw/uZll7CAgx9a5kPlF6JciaPblfDNgpmp/CCTJjohoMoRRr0A/QXrb9wF", + "UZYv/4/bz23G/D9uPzc58/+4c2Cy5m/cGbH074s137fE/YCJTwvctIw0YE2mENE6CTVr1VBIde2/KznV", + "FrW7jqSa4fWHsNpEWC2ia6W8mtUXvEOJ1ZZi+zpXMhmx+bANr5x/4ncmqd6vlc9SZKFqf+naw6ac5CIv", + "f2Zrfj88B0qaUVzx2Ghors435Mrjw5Hu8VHHVrYz9eiyAJF7Ml47OO5duLXj3r/l+iAe02nKU1mMPYFC", + "hkTaYKWIlBnwQxO78+O5VvD+hqm0f59Hx73L1T/o/o4k/uqCGuZtbqDWyfyuVVOZ37aHkoGmGoWJXXvj", + "qlzYNCobNU6Frg5MUzIulSxadnb0weXTRdC5VlRydQGBBjEYsv/R+seviuD4/U8uSCbt97f34Dlh8/c/", + "uTgZduJIhTAlKJEIC4IOXh3Btd8UotchGVoekleFw6Q4M7WhbdnS/zoFKb/5bK4hOSr8oSE10pAK6Fqt", + "IWVVVO5SRTKDfDUdydGbD+E2tcYPLek+tCSZTiY0oISpPAPwkpOYTSD+AGPLmL0fKjh3lA7axlpSXtpo", + "tQCap727d8eebPD7V45chr2H6SPPTVRM6NSR/DCs10e+NXro3y9zvn895CGTmBH4q6hbZkSbE5uA2C8g", + "POfisinlefJw3joB3r50UpzhNyibaPBIocrhVxRR4PA2vvWaaMqSyz1syKXkql/TpdNhwiq3JiiSsmle", + "55KqGU9NVpWRfWiysuldYavJgMgT2F6/NnvRo9+DAPqKK0TjJCIxgaxtXUNNUFw0TRIusvpjVBZSEV+P", + "/eltU3SwNcltbBXgDrIJm8FY5xasDXb75eXycs2IT9cH1WaDuwhST1TtkJ1Lk+TlwojCFyhjskhxJElE", + "AoWuZjSYQYStfgb9mwBcnCQXWUqNDVcstZhZBAZvSyIojqDKI49MvdKLeRxfDJYzwL07OYGPTHCtyfV2", + "MUAu61t2QEjdqhgxq2cRYanQKxsH3NaUJHgUmRW90KdQYX4bNpY2T3kyZL64WkaubId0gi4KIbYXNTG2", + "jqG+5FP5teSlTn2iKjMXxZEAxBnaJCxs1Rl2aOSPrt3q9335UxpG+how7jjQdwmYl3yaJckqkTJOkqbk", + "a8EEKp7H8QoaRu1CMnOpQp6qv0gVEiHgY0vddcSN2jgwfyh8qQmV2VJkLh08kJ/XfGmy1nhRpZlqIZ+0", + "+Wsex61Oy8LjqZ775RHT1Q6XzWx6ZQph0T8k7esEPJeZfSHiuXJy2LoV9SK3Lcfx3et7rtz1VybDr2Af", + "y6GgzIkqsLZ5HfGHFTlpKrVUZTGTPN+3R7JSL/W7pGxUPsvT9P8XqqhmrtX6PPespGYo9mlmpfIWX107", + "zapt/NBQMw2VCxSmZrhKvZvvVu3MGApKWUnztOLpTXXPLMlchmaoQ8hWXgjkPG/zk/t5fANx4RvhhJ3a", + "qi916YzySX8LLLemJlojnvuV5CR7rBYEhK/Igl11tvvmwBlWtLqXcblvgg2bDZdx4yLPgcr71BVe/MGM", + "S2ZAYym9KTN2wueSLbDAninrJhGu48tWTq1lwLYK1Hevr+W6yneusQVcCOM6Bs5oDyl0sXBnWFA92wlO", + "JelkG6bj7q3fnZxs1G0aoVZuGfFtXGjfTHKolOWMQ39dZEFDl6T+8OTIprSnEomU9dDrmELm+EtCEkhJ", + "SXkqEfgA9or1xuqqoGUFxQhTYpFwytRaKPKmdwPM5xsl6b5nPmWDt797s5IttPvQmBTwDn162wmsVqqU", + "KbPnvaZz11aUmcz6WvjAY57q3pfqoaEJjYhcSEVic2c3SSPYRJDew2Z/td8Z37UOokpC9fAO+PokRMRU", + "SsqZHLIxmWipJCFCjw0FJ2lECtcPvputM4UzrnlqWN+3cbUFJdLgNgerOqyVq6PhJHHV0XzXJ1lBtxuD", + "9BzuqpBcxGMe0QBFlF1K1I7opZHB0VyiSP/YWHnZNYLvbju37c13lsb0MZtwb/o/Q7MZMX8PHO64wtbc", + "Zf6DY2svSHGzOP4DC+1na3ItXxMER1AENHOzRamiEf1oWJ3uhEpFA1MzCWe4g3IvZrzekJ0QJXQbLAgK", + "eBSRQDlbw2YieLA5TPv9nSChEA+xQwA4YHj1r2MY8fD0HNqZkjSdIdN/QMdvD04R1TidYKsyFwC1he3R", + "8ebrNdf/Z4Cm/2J9zExw1bbwL/iPm93r+1DW7iFZs0V5skoB4sl3bzCwEtwPa8HDtBaAE3s2m/ZU4ACE", + "YjlLVcivmN8ykCZQm5pAKGK3UC3MX27xHJob1zJ9nqFAEIjNxJFRTyVKpfMXJMh0ixLBP5gCuTOCQ3Bv", + "+s1WejA5cfSrS7JAgitA60YPvS2WXYbwuzEpOXOWOycMjyMS9tBrFum/5miOhcwLmgFIWQmJAtSJFkcp", + "kSjGC1MhUs8wNAAYoTn3gQMHQIJiHlza6fqOPIOkZwDemcXoQzeqQBH6+gL5a4rdn+AE8YleFio4g6rT", + "cywoJNzVEwPMMnLl6tBZ3Jo6EJowMgIorSdm9Uu6KBXcK9T5LRYz07N6/w0bSZ4VSdxuTkeh93ajdJzd", + "IdmM7qA2s6m5NSmsiNt1Gz+OkPwI0VgieQS95VMPKsEw0FuZ3dp9alYc2D5nBZVlpRHIFOWWm5/Mj+N1", + "0XcKBzNTEfybMbDYAuXrhnETfBByoJ1TSExG7K9yRWxryD/QDIIacW4KoDcX4wj9iseB+h6p+/b9Q4p4", + "/AadQyxGXbb5b2Zv3fdJaWFwQeVFfDyUbW4ozc0EqiQXz7osgn6tOTBIhdCC8IzLPPAeBTjBAVWLDsKR", + "K+BtK/Jl1xbdTOAYC4IvtXLXG7I3Wey+rQiIDk/PO86ah0IqL00P1mDXQ6/nRMh0nAGHgDEZ0yIg39bw", + "DnAUmOLXZDLRetucmKrUssbgl4Fyl5ng80E8C+1eWtQ9NCuXnyZg9XKysIauknN2bcags6xVs4xBWa8F", + "B8yCc+LKMJuRaziCk+g6t0SewS9pbSSWfXU9h+lf9EcNxy475vqBsK++cJbfSyLWs4I/ZNM8QzmFP7SU", + "PwXIS1u15FO8PvdIYyfiu3TqXZd7JBv8vnOPnHn9Sh9YBkRc8hSuSzry7RFC/34DWu476cjDpi0tSsgl", + "1NVzogbJR74JCrybrCNfOaDrBllHvqkQA8ga8fVCvb6p4ALrJJ8ZgH/kFbnLmAKTXATuj+piCgzXs5bn", + "lYrSO9ummZpke/yeJHhrrLyG/O7Q/iNLaAOVoYAs/xW8CWeUluBJnKiFs0bxCdy652lsJf0IDuO+WO3M", + "6Hx3IdI3sMfeHnk4Oq21xv7ILnpvBt+8BMPx0cNPKVrcc6WDZVOfOl0sghmdk3onmvIOtihKBOkmPAE7", + "a2gQZvHhzjKFRW/6Ednue0P2dkbcX4i6BE0kRCEVJFDRAlGmOHAEM8afJBJcawLwnouFz3xb3LnPBY8P", + "7GzWnId2T1ljWO5ZHi+6IVa4O3fcZoUJ7QuurE7wBxqnMTA8RBl68RS1yQclTL4gNNGaD6KTDKXkQ0BI", + "KIEmN4oAb/VrLJv0IxlNx02gXJH56bXNrIWCVCoeu7U/PkJtnCrenRKm10KL+hOQZBPB5zQ0adlzpM55", + "ZLC6VYPQ69pdtVBhQ5By5cIA91VkmCYH0vQjTcpswXjatwatMWUYgFubY6m8p0zQhx4PU/BjyPeOo5zW", + "jyPMuQE5ZUdTolZyHBIV5yjSEv3Gj2PuIR9zRU8Gd6aVTrtmibObOTc09Dm4i6TZmePL/Zqt33079/GF", + "QvgP0HQ+zxTSOrP5t0WC/fs7H+7bXP7uAftvvSBO+S6YyqED3aOPYF7yAEcoJHMS8QScmk3bVqeViqg1", + "aM2USgabm5FuN+NSDfb7+/3W5/ef/38AAAD//6ZLNoPqMAEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/lib/scopes/scopes.go b/lib/scopes/scopes.go index 1ebbc49a..b2ce125b 100644 --- a/lib/scopes/scopes.go +++ b/lib/scopes/scopes.go @@ -239,6 +239,7 @@ var RouteScopes = map[string]Scope{ "GET /instances/{id}/stat": InstanceRead, "GET /instances/{id}/stats": InstanceRead, "POST /instances/{id}/stop": InstanceWrite, + "POST /instances/{id}/update-egress-secrets": InstanceWrite, "DELETE /instances/{id}/volumes/{volumeId}": VolumeWrite, "POST /instances/{id}/volumes/{volumeId}": VolumeWrite, diff --git a/openapi.yaml b/openapi.yaml index 1f0b5e1a..cee1efef 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2235,6 +2235,72 @@ paths: schema: $ref: "#/components/schemas/Error" + /instances/{id}/update-egress-secrets: + post: + summary: Update egress proxy secret env values on a running instance + description: > + Updates the real credential values used by the egress proxy for header + injection (e.g. for key rotation). The instance must be running with + egress proxy enabled. Only env vars referenced by existing credential + policies may be updated. The guest continues to see mock values. + operationId: updateEgressSecrets + security: + - bearerAuth: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + description: Instance ID or name + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - env + properties: + env: + type: object + additionalProperties: + type: string + description: > + Map of environment variable names to new secret values. + Each key must be referenced by an existing credential policy. + responses: + 200: + description: Egress proxy secrets updated + content: + application/json: + schema: + $ref: "#/components/schemas/Instance" + 400: + description: Invalid request (missing or unreferenced env vars) + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + 404: + description: Instance not found + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + 409: + description: Conflict - instance not in correct state or egress not enabled + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + 500: + description: Internal server error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + /instances/{id}/logs: get: summary: Stream instance logs (SSE)