diff --git a/api/openapi_client/.openapi-generator/VERSION b/api/openapi_client/.openapi-generator/VERSION index 696eaac5..14d6b5dc 100644 --- a/api/openapi_client/.openapi-generator/VERSION +++ b/api/openapi_client/.openapi-generator/VERSION @@ -1 +1 @@ -7.22.0 +7.23.0 diff --git a/api/openapi_client/api_managed_services.go b/api/openapi_client/api_managed_services.go index 72017182..00168ae9 100644 --- a/api/openapi_client/api_managed_services.go +++ b/api/openapi_client/api_managed_services.go @@ -43,8 +43,8 @@ type ManagedServicesAPI interface { ManagedServicesCreateProvider(ctx context.Context) ApiManagedServicesCreateProviderRequest // ManagedServicesCreateProviderExecute executes the request - // @return ManagedServicesListProviders200ResponseInnerAnyOf - ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error) + // @return ManagedServicesListProviders200ResponseInner + ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInner, *http.Response, error) /* ManagedServicesDelete delete @@ -294,15 +294,15 @@ func (a *ManagedServicesAPIService) ManagedServicesCreateExecute(r ApiManagedSer type ApiManagedServicesCreateProviderRequest struct { ctx context.Context ApiService ManagedServicesAPI - managedServicesUpsertProviderRequest *ManagedServicesUpsertProviderRequest + managedServicesCreateProviderRequest *ManagedServicesCreateProviderRequest } -func (r ApiManagedServicesCreateProviderRequest) ManagedServicesUpsertProviderRequest(managedServicesUpsertProviderRequest ManagedServicesUpsertProviderRequest) ApiManagedServicesCreateProviderRequest { - r.managedServicesUpsertProviderRequest = &managedServicesUpsertProviderRequest +func (r ApiManagedServicesCreateProviderRequest) ManagedServicesCreateProviderRequest(managedServicesCreateProviderRequest ManagedServicesCreateProviderRequest) ApiManagedServicesCreateProviderRequest { + r.managedServicesCreateProviderRequest = &managedServicesCreateProviderRequest return r } -func (r ApiManagedServicesCreateProviderRequest) Execute() (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error) { +func (r ApiManagedServicesCreateProviderRequest) Execute() (*ManagedServicesListProviders200ResponseInner, *http.Response, error) { return r.ApiService.ManagedServicesCreateProviderExecute(r) } @@ -321,13 +321,13 @@ func (a *ManagedServicesAPIService) ManagedServicesCreateProvider(ctx context.Co // Execute executes the request // -// @return ManagedServicesListProviders200ResponseInnerAnyOf -func (a *ManagedServicesAPIService) ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error) { +// @return ManagedServicesListProviders200ResponseInner +func (a *ManagedServicesAPIService) ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInner, *http.Response, error) { var ( localVarHTTPMethod = http.MethodPost localVarPostBody interface{} formFiles []formFile - localVarReturnValue *ManagedServicesListProviders200ResponseInnerAnyOf + localVarReturnValue *ManagedServicesListProviders200ResponseInner ) localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ManagedServicesAPIService.ManagedServicesCreateProvider") @@ -359,7 +359,7 @@ func (a *ManagedServicesAPIService) ManagedServicesCreateProviderExecute(r ApiMa localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept } // body params - localVarPostBody = r.managedServicesUpsertProviderRequest + localVarPostBody = r.managedServicesCreateProviderRequest req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) if err != nil { return localVarReturnValue, nil, err diff --git a/api/openapi_client/api_teams.go b/api/openapi_client/api_teams.go index 69e6fe3b..7549f67d 100644 --- a/api/openapi_client/api_teams.go +++ b/api/openapi_client/api_teams.go @@ -827,6 +827,17 @@ func (a *TeamsAPIService) TeamsInviteMemberExecute(r ApiTeamsInviteMemberRequest } newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v) newErr.model = v + return localVarHTTPResponse, newErr + } + if localVarHTTPResponse.StatusCode == 409 { + var v DomainsUpdateDomain409Response + err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() + return localVarHTTPResponse, newErr + } + newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v) + newErr.model = v } return localVarHTTPResponse, newErr } diff --git a/api/openapi_client/client.go b/api/openapi_client/client.go index 99ea224c..72e6ff98 100644 --- a/api/openapi_client/client.go +++ b/api/openapi_client/client.go @@ -466,6 +466,15 @@ func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err err *s = string(b) return nil } + if r, ok := v.(*io.Reader); ok { + *r = bytes.NewReader(b) + return nil + } + // Must stay before the JSON branch: json.Unmarshal would base64-decode into *[]byte. + if p, ok := v.(*[]byte); ok { + *p = b + return nil + } if f, ok := v.(*os.File); ok { f, err = os.CreateTemp("", "HttpClientFile") if err != nil { diff --git a/api/openapi_client/mocks.go b/api/openapi_client/mocks.go index f0869e9e..15e5bdc2 100644 --- a/api/openapi_client/mocks.go +++ b/api/openapi_client/mocks.go @@ -1536,24 +1536,24 @@ func (_c *MockManagedServicesAPI_ManagedServicesCreateProvider_Call) RunAndRetur } // ManagedServicesCreateProviderExecute provides a mock function for the type MockManagedServicesAPI -func (_mock *MockManagedServicesAPI) ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error) { +func (_mock *MockManagedServicesAPI) ManagedServicesCreateProviderExecute(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInner, *http.Response, error) { ret := _mock.Called(r) if len(ret) == 0 { panic("no return value specified for ManagedServicesCreateProviderExecute") } - var r0 *ManagedServicesListProviders200ResponseInnerAnyOf + var r0 *ManagedServicesListProviders200ResponseInner var r1 *http.Response var r2 error - if returnFunc, ok := ret.Get(0).(func(ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error)); ok { + if returnFunc, ok := ret.Get(0).(func(ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInner, *http.Response, error)); ok { return returnFunc(r) } - if returnFunc, ok := ret.Get(0).(func(ApiManagedServicesCreateProviderRequest) *ManagedServicesListProviders200ResponseInnerAnyOf); ok { + if returnFunc, ok := ret.Get(0).(func(ApiManagedServicesCreateProviderRequest) *ManagedServicesListProviders200ResponseInner); ok { r0 = returnFunc(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*ManagedServicesListProviders200ResponseInnerAnyOf) + r0 = ret.Get(0).(*ManagedServicesListProviders200ResponseInner) } } if returnFunc, ok := ret.Get(1).(func(ApiManagedServicesCreateProviderRequest) *http.Response); ok { @@ -1595,12 +1595,12 @@ func (_c *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call) Run( return _c } -func (_c *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call) Return(managedServicesListProviders200ResponseInnerAnyOf *ManagedServicesListProviders200ResponseInnerAnyOf, response *http.Response, err error) *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call { - _c.Call.Return(managedServicesListProviders200ResponseInnerAnyOf, response, err) +func (_c *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call) Return(managedServicesListProviders200ResponseInner *ManagedServicesListProviders200ResponseInner, response *http.Response, err error) *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call { + _c.Call.Return(managedServicesListProviders200ResponseInner, response, err) return _c } -func (_c *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call) RunAndReturn(run func(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInnerAnyOf, *http.Response, error)) *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call { +func (_c *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call) RunAndReturn(run func(r ApiManagedServicesCreateProviderRequest) (*ManagedServicesListProviders200ResponseInner, *http.Response, error)) *MockManagedServicesAPI_ManagedServicesCreateProviderExecute_Call { _c.Call.Return(run) return _c } diff --git a/api/openapi_client/model_managed_services_create_provider_request.go b/api/openapi_client/model_managed_services_create_provider_request.go new file mode 100644 index 00000000..8a98b563 --- /dev/null +++ b/api/openapi_client/model_managed_services_create_provider_request.go @@ -0,0 +1,104 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +/* +Codesphere Public API + +API version: 0.1.0 +*/ + +// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. + +package openapi_client + +import ( + "encoding/json" + "fmt" +) + +// ManagedServicesCreateProviderRequest struct for ManagedServicesCreateProviderRequest +type ManagedServicesCreateProviderRequest struct { + ManagedServicesCreateProviderRequestAnyOf *ManagedServicesCreateProviderRequestAnyOf + ManagedServicesUpsertProviderRequest *ManagedServicesUpsertProviderRequest +} + +// Unmarshal JSON data into any of the pointers in the struct +func (dst *ManagedServicesCreateProviderRequest) UnmarshalJSON(data []byte) error { + var err error + // try to unmarshal JSON data into ManagedServicesCreateProviderRequestAnyOf + err = json.Unmarshal(data, &dst.ManagedServicesCreateProviderRequestAnyOf) + if err == nil { + jsonManagedServicesCreateProviderRequestAnyOf, _ := json.Marshal(dst.ManagedServicesCreateProviderRequestAnyOf) + if string(jsonManagedServicesCreateProviderRequestAnyOf) == "{}" { // empty struct + dst.ManagedServicesCreateProviderRequestAnyOf = nil + } else { + return nil // data stored in dst.ManagedServicesCreateProviderRequestAnyOf, return on the first match + } + } else { + dst.ManagedServicesCreateProviderRequestAnyOf = nil + } + + // try to unmarshal JSON data into ManagedServicesUpsertProviderRequest + err = json.Unmarshal(data, &dst.ManagedServicesUpsertProviderRequest) + if err == nil { + jsonManagedServicesUpsertProviderRequest, _ := json.Marshal(dst.ManagedServicesUpsertProviderRequest) + if string(jsonManagedServicesUpsertProviderRequest) == "{}" { // empty struct + dst.ManagedServicesUpsertProviderRequest = nil + } else { + return nil // data stored in dst.ManagedServicesUpsertProviderRequest, return on the first match + } + } else { + dst.ManagedServicesUpsertProviderRequest = nil + } + + return fmt.Errorf("data failed to match schemas in anyOf(ManagedServicesCreateProviderRequest)") +} + +// Marshal data from the first non-nil pointers in the struct to JSON +func (src ManagedServicesCreateProviderRequest) MarshalJSON() ([]byte, error) { + if src.ManagedServicesCreateProviderRequestAnyOf != nil { + return json.Marshal(&src.ManagedServicesCreateProviderRequestAnyOf) + } + + if src.ManagedServicesUpsertProviderRequest != nil { + return json.Marshal(&src.ManagedServicesUpsertProviderRequest) + } + + return nil, nil // no data in anyOf schemas +} + +type NullableManagedServicesCreateProviderRequest struct { + value *ManagedServicesCreateProviderRequest + isSet bool +} + +func (v NullableManagedServicesCreateProviderRequest) Get() *ManagedServicesCreateProviderRequest { + return v.value +} + +func (v *NullableManagedServicesCreateProviderRequest) Set(val *ManagedServicesCreateProviderRequest) { + v.value = val + v.isSet = true +} + +func (v NullableManagedServicesCreateProviderRequest) IsSet() bool { + return v.isSet +} + +func (v *NullableManagedServicesCreateProviderRequest) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableManagedServicesCreateProviderRequest(val *ManagedServicesCreateProviderRequest) *NullableManagedServicesCreateProviderRequest { + return &NullableManagedServicesCreateProviderRequest{value: val, isSet: true} +} + +func (v NullableManagedServicesCreateProviderRequest) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableManagedServicesCreateProviderRequest) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/api/openapi_client/model_managed_services_create_provider_request_any_of.go b/api/openapi_client/model_managed_services_create_provider_request_any_of.go new file mode 100644 index 00000000..bde46615 --- /dev/null +++ b/api/openapi_client/model_managed_services_create_provider_request_any_of.go @@ -0,0 +1,620 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +/* +Codesphere Public API + +API version: 0.1.0 +*/ + +// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. + +package openapi_client + +import ( + "bytes" + "encoding/json" + "fmt" +) + +// checks if the ManagedServicesCreateProviderRequestAnyOf type satisfies the MappedNullable interface at compile time +var _ MappedNullable = &ManagedServicesCreateProviderRequestAnyOf{} + +// ManagedServicesCreateProviderRequestAnyOf struct for ManagedServicesCreateProviderRequestAnyOf +type ManagedServicesCreateProviderRequestAnyOf struct { + Author string `json:"author"` + Backups *ManagedServicesListProviders200ResponseInnerAnyOfBackups `json:"backups,omitempty"` + Capabilities *ManagedServicesListProviders200ResponseInnerAnyOfCapabilities `json:"capabilities,omitempty"` + Category string `json:"category"` + Description string `json:"description"` + DisplayName string `json:"displayName"` + IconUrl string `json:"iconUrl"` + // JSON Schema + ConfigSchema map[string]interface{} `json:"configSchema"` + // JSON Schema + DetailsSchema map[string]interface{} `json:"detailsSchema"` + // JSON Schema + SecretsSchema map[string]interface{} `json:"secretsSchema"` + Plans []ManagedServicesListProviders200ResponseInnerAnyOfPlansInner `json:"plans"` + Versions *map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue `json:"versions,omitempty"` + Name string `json:"name" validate:"regexp=^[a-z0-9-_]+$"` + SchemaVersion *string `json:"schemaVersion,omitempty" validate:"regexp=^v[0-9][0-9a-z]*$"` + Backend ManagedServicesListProviders200ResponseInnerAnyOf1Backend `json:"backend"` + Scope *ManagedServicesUpsertProviderRequestAnyOfScope `json:"scope,omitempty"` +} + +type _ManagedServicesCreateProviderRequestAnyOf ManagedServicesCreateProviderRequestAnyOf + +// NewManagedServicesCreateProviderRequestAnyOf instantiates a new ManagedServicesCreateProviderRequestAnyOf object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewManagedServicesCreateProviderRequestAnyOf(author string, category string, description string, displayName string, iconUrl string, configSchema map[string]interface{}, detailsSchema map[string]interface{}, secretsSchema map[string]interface{}, plans []ManagedServicesListProviders200ResponseInnerAnyOfPlansInner, name string, backend ManagedServicesListProviders200ResponseInnerAnyOf1Backend) *ManagedServicesCreateProviderRequestAnyOf { + this := ManagedServicesCreateProviderRequestAnyOf{} + this.Author = author + this.Category = category + this.Description = description + this.DisplayName = displayName + this.IconUrl = iconUrl + this.ConfigSchema = configSchema + this.DetailsSchema = detailsSchema + this.SecretsSchema = secretsSchema + this.Plans = plans + this.Name = name + this.Backend = backend + return &this +} + +// NewManagedServicesCreateProviderRequestAnyOfWithDefaults instantiates a new ManagedServicesCreateProviderRequestAnyOf object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewManagedServicesCreateProviderRequestAnyOfWithDefaults() *ManagedServicesCreateProviderRequestAnyOf { + this := ManagedServicesCreateProviderRequestAnyOf{} + return &this +} + +// GetAuthor returns the Author field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetAuthor() string { + if o == nil { + var ret string + return ret + } + + return o.Author +} + +// GetAuthorOk returns a tuple with the Author field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetAuthorOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Author, true +} + +// SetAuthor sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetAuthor(v string) { + o.Author = v +} + +// GetBackups returns the Backups field value if set, zero value otherwise. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetBackups() ManagedServicesListProviders200ResponseInnerAnyOfBackups { + if o == nil || IsNil(o.Backups) { + var ret ManagedServicesListProviders200ResponseInnerAnyOfBackups + return ret + } + return *o.Backups +} + +// GetBackupsOk returns a tuple with the Backups field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetBackupsOk() (*ManagedServicesListProviders200ResponseInnerAnyOfBackups, bool) { + if o == nil || IsNil(o.Backups) { + return nil, false + } + return o.Backups, true +} + +// HasBackups returns a boolean if a field has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) HasBackups() bool { + if o != nil && !IsNil(o.Backups) { + return true + } + + return false +} + +// SetBackups gets a reference to the given ManagedServicesListProviders200ResponseInnerAnyOfBackups and assigns it to the Backups field. +func (o *ManagedServicesCreateProviderRequestAnyOf) SetBackups(v ManagedServicesListProviders200ResponseInnerAnyOfBackups) { + o.Backups = &v +} + +// GetCapabilities returns the Capabilities field value if set, zero value otherwise. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetCapabilities() ManagedServicesListProviders200ResponseInnerAnyOfCapabilities { + if o == nil || IsNil(o.Capabilities) { + var ret ManagedServicesListProviders200ResponseInnerAnyOfCapabilities + return ret + } + return *o.Capabilities +} + +// GetCapabilitiesOk returns a tuple with the Capabilities field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetCapabilitiesOk() (*ManagedServicesListProviders200ResponseInnerAnyOfCapabilities, bool) { + if o == nil || IsNil(o.Capabilities) { + return nil, false + } + return o.Capabilities, true +} + +// HasCapabilities returns a boolean if a field has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) HasCapabilities() bool { + if o != nil && !IsNil(o.Capabilities) { + return true + } + + return false +} + +// SetCapabilities gets a reference to the given ManagedServicesListProviders200ResponseInnerAnyOfCapabilities and assigns it to the Capabilities field. +func (o *ManagedServicesCreateProviderRequestAnyOf) SetCapabilities(v ManagedServicesListProviders200ResponseInnerAnyOfCapabilities) { + o.Capabilities = &v +} + +// GetCategory returns the Category field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetCategory() string { + if o == nil { + var ret string + return ret + } + + return o.Category +} + +// GetCategoryOk returns a tuple with the Category field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetCategoryOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Category, true +} + +// SetCategory sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetCategory(v string) { + o.Category = v +} + +// GetDescription returns the Description field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDescription() string { + if o == nil { + var ret string + return ret + } + + return o.Description +} + +// GetDescriptionOk returns a tuple with the Description field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDescriptionOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Description, true +} + +// SetDescription sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetDescription(v string) { + o.Description = v +} + +// GetDisplayName returns the DisplayName field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDisplayName() string { + if o == nil { + var ret string + return ret + } + + return o.DisplayName +} + +// GetDisplayNameOk returns a tuple with the DisplayName field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDisplayNameOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.DisplayName, true +} + +// SetDisplayName sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetDisplayName(v string) { + o.DisplayName = v +} + +// GetIconUrl returns the IconUrl field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetIconUrl() string { + if o == nil { + var ret string + return ret + } + + return o.IconUrl +} + +// GetIconUrlOk returns a tuple with the IconUrl field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetIconUrlOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.IconUrl, true +} + +// SetIconUrl sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetIconUrl(v string) { + o.IconUrl = v +} + +// GetConfigSchema returns the ConfigSchema field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetConfigSchema() map[string]interface{} { + if o == nil { + var ret map[string]interface{} + return ret + } + + return o.ConfigSchema +} + +// GetConfigSchemaOk returns a tuple with the ConfigSchema field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetConfigSchemaOk() (map[string]interface{}, bool) { + if o == nil { + return map[string]interface{}{}, false + } + return o.ConfigSchema, true +} + +// SetConfigSchema sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetConfigSchema(v map[string]interface{}) { + o.ConfigSchema = v +} + +// GetDetailsSchema returns the DetailsSchema field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDetailsSchema() map[string]interface{} { + if o == nil { + var ret map[string]interface{} + return ret + } + + return o.DetailsSchema +} + +// GetDetailsSchemaOk returns a tuple with the DetailsSchema field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetDetailsSchemaOk() (map[string]interface{}, bool) { + if o == nil { + return map[string]interface{}{}, false + } + return o.DetailsSchema, true +} + +// SetDetailsSchema sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetDetailsSchema(v map[string]interface{}) { + o.DetailsSchema = v +} + +// GetSecretsSchema returns the SecretsSchema field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetSecretsSchema() map[string]interface{} { + if o == nil { + var ret map[string]interface{} + return ret + } + + return o.SecretsSchema +} + +// GetSecretsSchemaOk returns a tuple with the SecretsSchema field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetSecretsSchemaOk() (map[string]interface{}, bool) { + if o == nil { + return map[string]interface{}{}, false + } + return o.SecretsSchema, true +} + +// SetSecretsSchema sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetSecretsSchema(v map[string]interface{}) { + o.SecretsSchema = v +} + +// GetPlans returns the Plans field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetPlans() []ManagedServicesListProviders200ResponseInnerAnyOfPlansInner { + if o == nil { + var ret []ManagedServicesListProviders200ResponseInnerAnyOfPlansInner + return ret + } + + return o.Plans +} + +// GetPlansOk returns a tuple with the Plans field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetPlansOk() ([]ManagedServicesListProviders200ResponseInnerAnyOfPlansInner, bool) { + if o == nil { + return nil, false + } + return o.Plans, true +} + +// SetPlans sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetPlans(v []ManagedServicesListProviders200ResponseInnerAnyOfPlansInner) { + o.Plans = v +} + +// GetVersions returns the Versions field value if set, zero value otherwise. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetVersions() map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue { + if o == nil || IsNil(o.Versions) { + var ret map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue + return ret + } + return *o.Versions +} + +// GetVersionsOk returns a tuple with the Versions field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetVersionsOk() (*map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue, bool) { + if o == nil || IsNil(o.Versions) { + return nil, false + } + return o.Versions, true +} + +// HasVersions returns a boolean if a field has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) HasVersions() bool { + if o != nil && !IsNil(o.Versions) { + return true + } + + return false +} + +// SetVersions gets a reference to the given map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue and assigns it to the Versions field. +func (o *ManagedServicesCreateProviderRequestAnyOf) SetVersions(v map[string]ManagedServicesListProviders200ResponseInnerAnyOfVersionsValue) { + o.Versions = &v +} + +// GetName returns the Name field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetName() string { + if o == nil { + var ret string + return ret + } + + return o.Name +} + +// GetNameOk returns a tuple with the Name field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetNameOk() (*string, bool) { + if o == nil { + return nil, false + } + return &o.Name, true +} + +// SetName sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetName(v string) { + o.Name = v +} + +// GetSchemaVersion returns the SchemaVersion field value if set, zero value otherwise. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetSchemaVersion() string { + if o == nil || IsNil(o.SchemaVersion) { + var ret string + return ret + } + return *o.SchemaVersion +} + +// GetSchemaVersionOk returns a tuple with the SchemaVersion field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetSchemaVersionOk() (*string, bool) { + if o == nil || IsNil(o.SchemaVersion) { + return nil, false + } + return o.SchemaVersion, true +} + +// HasSchemaVersion returns a boolean if a field has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) HasSchemaVersion() bool { + if o != nil && !IsNil(o.SchemaVersion) { + return true + } + + return false +} + +// SetSchemaVersion gets a reference to the given string and assigns it to the SchemaVersion field. +func (o *ManagedServicesCreateProviderRequestAnyOf) SetSchemaVersion(v string) { + o.SchemaVersion = &v +} + +// GetBackend returns the Backend field value +func (o *ManagedServicesCreateProviderRequestAnyOf) GetBackend() ManagedServicesListProviders200ResponseInnerAnyOf1Backend { + if o == nil { + var ret ManagedServicesListProviders200ResponseInnerAnyOf1Backend + return ret + } + + return o.Backend +} + +// GetBackendOk returns a tuple with the Backend field value +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetBackendOk() (*ManagedServicesListProviders200ResponseInnerAnyOf1Backend, bool) { + if o == nil { + return nil, false + } + return &o.Backend, true +} + +// SetBackend sets field value +func (o *ManagedServicesCreateProviderRequestAnyOf) SetBackend(v ManagedServicesListProviders200ResponseInnerAnyOf1Backend) { + o.Backend = v +} + +// GetScope returns the Scope field value if set, zero value otherwise. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetScope() ManagedServicesUpsertProviderRequestAnyOfScope { + if o == nil || IsNil(o.Scope) { + var ret ManagedServicesUpsertProviderRequestAnyOfScope + return ret + } + return *o.Scope +} + +// GetScopeOk returns a tuple with the Scope field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) GetScopeOk() (*ManagedServicesUpsertProviderRequestAnyOfScope, bool) { + if o == nil || IsNil(o.Scope) { + return nil, false + } + return o.Scope, true +} + +// HasScope returns a boolean if a field has been set. +func (o *ManagedServicesCreateProviderRequestAnyOf) HasScope() bool { + if o != nil && !IsNil(o.Scope) { + return true + } + + return false +} + +// SetScope gets a reference to the given ManagedServicesUpsertProviderRequestAnyOfScope and assigns it to the Scope field. +func (o *ManagedServicesCreateProviderRequestAnyOf) SetScope(v ManagedServicesUpsertProviderRequestAnyOfScope) { + o.Scope = &v +} + +func (o ManagedServicesCreateProviderRequestAnyOf) MarshalJSON() ([]byte, error) { + toSerialize, err := o.ToMap() + if err != nil { + return []byte{}, err + } + return json.Marshal(toSerialize) +} + +func (o ManagedServicesCreateProviderRequestAnyOf) ToMap() (map[string]interface{}, error) { + toSerialize := map[string]interface{}{} + toSerialize["author"] = o.Author + if !IsNil(o.Backups) { + toSerialize["backups"] = o.Backups + } + if !IsNil(o.Capabilities) { + toSerialize["capabilities"] = o.Capabilities + } + toSerialize["category"] = o.Category + toSerialize["description"] = o.Description + toSerialize["displayName"] = o.DisplayName + toSerialize["iconUrl"] = o.IconUrl + toSerialize["configSchema"] = o.ConfigSchema + toSerialize["detailsSchema"] = o.DetailsSchema + toSerialize["secretsSchema"] = o.SecretsSchema + toSerialize["plans"] = o.Plans + if !IsNil(o.Versions) { + toSerialize["versions"] = o.Versions + } + toSerialize["name"] = o.Name + if !IsNil(o.SchemaVersion) { + toSerialize["schemaVersion"] = o.SchemaVersion + } + toSerialize["backend"] = o.Backend + if !IsNil(o.Scope) { + toSerialize["scope"] = o.Scope + } + return toSerialize, nil +} + +func (o *ManagedServicesCreateProviderRequestAnyOf) UnmarshalJSON(data []byte) (err error) { + // This validates that all required properties are included in the JSON object + // by unmarshalling the object into a generic map with string keys and checking + // that every required field exists as a key in the generic map. + requiredProperties := []string{ + "author", + "category", + "description", + "displayName", + "iconUrl", + "configSchema", + "detailsSchema", + "secretsSchema", + "plans", + "name", + "backend", + } + + allProperties := make(map[string]interface{}) + + err = json.Unmarshal(data, &allProperties) + + if err != nil { + return err + } + + for _, requiredProperty := range requiredProperties { + if _, exists := allProperties[requiredProperty]; !exists { + return fmt.Errorf("no value given for required property %v", requiredProperty) + } + } + + varManagedServicesCreateProviderRequestAnyOf := _ManagedServicesCreateProviderRequestAnyOf{} + + decoder := json.NewDecoder(bytes.NewReader(data)) + //decoder.DisallowUnknownFields() + err = decoder.Decode(&varManagedServicesCreateProviderRequestAnyOf) + + if err != nil { + return err + } + + *o = ManagedServicesCreateProviderRequestAnyOf(varManagedServicesCreateProviderRequestAnyOf) + + return err +} + +type NullableManagedServicesCreateProviderRequestAnyOf struct { + value *ManagedServicesCreateProviderRequestAnyOf + isSet bool +} + +func (v NullableManagedServicesCreateProviderRequestAnyOf) Get() *ManagedServicesCreateProviderRequestAnyOf { + return v.value +} + +func (v *NullableManagedServicesCreateProviderRequestAnyOf) Set(val *ManagedServicesCreateProviderRequestAnyOf) { + v.value = val + v.isSet = true +} + +func (v NullableManagedServicesCreateProviderRequestAnyOf) IsSet() bool { + return v.isSet +} + +func (v *NullableManagedServicesCreateProviderRequestAnyOf) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableManagedServicesCreateProviderRequestAnyOf(val *ManagedServicesCreateProviderRequestAnyOf) *NullableManagedServicesCreateProviderRequestAnyOf { + return &NullableManagedServicesCreateProviderRequestAnyOf{value: val, isSet: true} +} + +func (v NullableManagedServicesCreateProviderRequestAnyOf) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableManagedServicesCreateProviderRequestAnyOf) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} diff --git a/api/openapi_client/model_managed_services_list_providers_200_response_inner_any_of_backend_landscape.go b/api/openapi_client/model_managed_services_list_providers_200_response_inner_any_of_backend_landscape.go index 514cf344..62151892 100644 --- a/api/openapi_client/model_managed_services_list_providers_200_response_inner_any_of_backend_landscape.go +++ b/api/openapi_client/model_managed_services_list_providers_200_response_inner_any_of_backend_landscape.go @@ -22,6 +22,7 @@ var _ MappedNullable = &ManagedServicesListProviders200ResponseInnerAnyOfBackend // ManagedServicesListProviders200ResponseInnerAnyOfBackendLandscape struct for ManagedServicesListProviders200ResponseInnerAnyOfBackendLandscape type ManagedServicesListProviders200ResponseInnerAnyOfBackendLandscape struct { + // full URL string GitUrl string `json:"gitUrl"` // Deprecated legacy fallback CI profile. A provider must define at least one version; as a temporary backwards-compatibility fallback, a provider without versions is still accepted as long as it defines this field. // Deprecated diff --git a/api/openapi_client/model_managed_services_upsert_provider_request_any_of_1.go b/api/openapi_client/model_managed_services_upsert_provider_request_any_of_1.go index 20273373..b85f2d0e 100644 --- a/api/openapi_client/model_managed_services_upsert_provider_request_any_of_1.go +++ b/api/openapi_client/model_managed_services_upsert_provider_request_any_of_1.go @@ -22,6 +22,7 @@ var _ MappedNullable = &ManagedServicesUpsertProviderRequestAnyOf1{} // ManagedServicesUpsertProviderRequestAnyOf1 struct for ManagedServicesUpsertProviderRequestAnyOf1 type ManagedServicesUpsertProviderRequestAnyOf1 struct { + // full URL string GitUrl string `json:"gitUrl"` GitRef *string `json:"gitRef,omitempty"` Scope *ManagedServicesUpsertProviderRequestAnyOfScope `json:"scope,omitempty"` diff --git a/api/openapi_client/model_workspaces_create_workspace_request.go b/api/openapi_client/model_workspaces_create_workspace_request.go index 13388020..7ab8dcc4 100644 --- a/api/openapi_client/model_workspaces_create_workspace_request.go +++ b/api/openapi_client/model_workspaces_create_workspace_request.go @@ -29,6 +29,7 @@ type WorkspacesCreateWorkspaceRequest struct { Replicas int `json:"replicas"` BaseImage *string `json:"baseImage,omitempty"` GitUrl *string `json:"gitUrl,omitempty"` + GitRef *string `json:"gitRef,omitempty"` InitialBranch *string `json:"initialBranch,omitempty"` CloneDepth *int `json:"cloneDepth,omitempty"` SourceWorkspaceId *int `json:"sourceWorkspaceId,omitempty"` @@ -248,6 +249,38 @@ func (o *WorkspacesCreateWorkspaceRequest) SetGitUrl(v string) { o.GitUrl = &v } +// GetGitRef returns the GitRef field value if set, zero value otherwise. +func (o *WorkspacesCreateWorkspaceRequest) GetGitRef() string { + if o == nil || IsNil(o.GitRef) { + var ret string + return ret + } + return *o.GitRef +} + +// GetGitRefOk returns a tuple with the GitRef field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *WorkspacesCreateWorkspaceRequest) GetGitRefOk() (*string, bool) { + if o == nil || IsNil(o.GitRef) { + return nil, false + } + return o.GitRef, true +} + +// HasGitRef returns a boolean if a field has been set. +func (o *WorkspacesCreateWorkspaceRequest) HasGitRef() bool { + if o != nil && !IsNil(o.GitRef) { + return true + } + + return false +} + +// SetGitRef gets a reference to the given string and assigns it to the GitRef field. +func (o *WorkspacesCreateWorkspaceRequest) SetGitRef(v string) { + o.GitRef = &v +} + // GetInitialBranch returns the InitialBranch field value if set, zero value otherwise. func (o *WorkspacesCreateWorkspaceRequest) GetInitialBranch() string { if o == nil || IsNil(o.InitialBranch) { @@ -557,6 +590,9 @@ func (o WorkspacesCreateWorkspaceRequest) ToMap() (map[string]interface{}, error if !IsNil(o.GitUrl) { toSerialize["gitUrl"] = o.GitUrl } + if !IsNil(o.GitRef) { + toSerialize["gitRef"] = o.GitRef + } if !IsNil(o.InitialBranch) { toSerialize["initialBranch"] = o.InitialBranch } diff --git a/api/workspace.go b/api/workspace.go index cfe9edec..6f7131ad 100644 --- a/api/workspace.go +++ b/api/workspace.go @@ -102,6 +102,12 @@ func (c *Client) StartPipelineStage(wsId int, profile string, stage string) erro return errors.FormatAPIError(r, err) } +func (c *Client) StopPipelineStage(wsId int, stage string) error { + req := c.api.WorkspacesAPI.WorkspacesStopPipelineStage(c.ctx, wsId, stage) + r, err := req.Execute() + return errors.FormatAPIError(r, err) +} + func (c *Client) GetPipelineState(wsId int, stage string) ([]PipelineStatus, error) { req := c.api.WorkspacesAPI.WorkspacesPipelineStatus(c.ctx, wsId, stage) res, r, err := req.Execute() diff --git a/cli/cmd/client.go b/cli/cmd/client.go index 167e726b..e72e7555 100644 --- a/cli/cmd/client.go +++ b/cli/cmd/client.go @@ -32,6 +32,7 @@ type Client interface { DeployWorkspace(args api.DeployWorkspaceArgs) (*api.Workspace, error) DeleteWorkspace(wsId int) error StartPipelineStage(wsId int, profile string, stage string) error + StopPipelineStage(wsId int, stage string) error GetPipelineState(wsId int, stage string) ([]api.PipelineStatus, error) GitPull(wsId int, remote string, branch string) error DeployLandscape(wsId int, profile string) error diff --git a/cli/cmd/mocks.go b/cli/cmd/mocks.go index 069c12d2..98406130 100644 --- a/cli/cmd/mocks.go +++ b/cli/cmd/mocks.go @@ -1382,6 +1382,63 @@ func (_c *MockClient_StartPipelineStage_Call) RunAndReturn(run func(wsId int, pr return _c } +// StopPipelineStage provides a mock function for the type MockClient +func (_mock *MockClient) StopPipelineStage(wsId int, stage string) error { + ret := _mock.Called(wsId, stage) + + if len(ret) == 0 { + panic("no return value specified for StopPipelineStage") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(int, string) error); ok { + r0 = returnFunc(wsId, stage) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// MockClient_StopPipelineStage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StopPipelineStage' +type MockClient_StopPipelineStage_Call struct { + *mock.Call +} + +// StopPipelineStage is a helper method to define mock.On call +// - wsId int +// - stage string +func (_e *MockClient_Expecter) StopPipelineStage(wsId any, stage any) *MockClient_StopPipelineStage_Call { + return &MockClient_StopPipelineStage_Call{Call: _e.mock.On("StopPipelineStage", wsId, stage)} +} + +func (_c *MockClient_StopPipelineStage_Call) Run(run func(wsId int, stage string)) *MockClient_StopPipelineStage_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 int + if args[0] != nil { + arg0 = args[0].(int) + } + var arg1 string + if args[1] != nil { + arg1 = args[1].(string) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockClient_StopPipelineStage_Call) Return(err error) *MockClient_StopPipelineStage_Call { + _c.Call.Return(err) + return _c +} + +func (_c *MockClient_StopPipelineStage_Call) RunAndReturn(run func(wsId int, stage string) error) *MockClient_StopPipelineStage_Call { + _c.Call.Return(run) + return _c +} + // WaitForWorkspaceRunning provides a mock function for the type MockClient func (_mock *MockClient) WaitForWorkspaceRunning(workspace *api.Workspace, timeout time.Duration) error { ret := _mock.Called(workspace, timeout) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index b98a73e7..e0b7eb4b 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -121,6 +121,7 @@ func GetRootCmd() *cobra.Command { AddDeleteCmd(rootCmd, &opts) AddMonitorCmd(rootCmd, &opts) AddStartCmd(rootCmd, &opts) + AddStopCmd(rootCmd, &opts) AddGitCmd(rootCmd, &opts) AddSyncCmd(rootCmd, &opts) AddUpdateCmd(rootCmd) diff --git a/cli/cmd/stop.go b/cli/cmd/stop.go new file mode 100644 index 00000000..09d4649d --- /dev/null +++ b/cli/cmd/stop.go @@ -0,0 +1,24 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "github.com/spf13/cobra" +) + +type StopCmd struct { + cmd *cobra.Command +} + +func AddStopCmd(rootCmd *cobra.Command, opts *GlobalOptions) { + stop := StopCmd{ + cmd: &cobra.Command{ + Use: "stop", + Short: "Stop workspace pipeline", + Long: `Stop pipeline of a workspace using the pipeline subcommand`, + }, + } + AddCmd(rootCmd, stop.cmd) + AddStopPipelineCmd(stop.cmd, opts) +} diff --git a/cli/cmd/stop_pipeline.go b/cli/cmd/stop_pipeline.go new file mode 100644 index 00000000..2d7fba91 --- /dev/null +++ b/cli/cmd/stop_pipeline.go @@ -0,0 +1,86 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd + +import ( + "fmt" + "log" + + "github.com/codesphere-cloud/cs-go/pkg/io" + "github.com/spf13/cobra" +) + +type StopPipelineCmd struct { + cmd *cobra.Command + Opts StopPipelineOpts +} + +type StopPipelineOpts struct { + *GlobalOptions +} + +func (c *StopPipelineCmd) RunE(_ *cobra.Command, args []string) error { + workspaceId, err := c.Opts.GetWorkspaceId() + if err != nil { + return fmt.Errorf("failed to get workspace ID: %w", err) + } + + client, err := NewClient(*c.Opts.GlobalOptions) + if err != nil { + return fmt.Errorf("failed to create Codesphere client: %w", err) + } + + return c.StopPipelineStages(client, workspaceId, args) +} + +func AddStopPipelineCmd(stop *cobra.Command, opts *GlobalOptions) { + pipeline := StopPipelineCmd{ + cmd: &cobra.Command{ + Use: "pipeline", + Short: "Stop pipeline stages of a workspace", + Args: cobra.RangeArgs(1, 3), + Long: io.Long(`Stop one or many pipeline stages of a workspace. + + Stages can be 'prepare', 'test', or 'run'. + When multiple stages are specified, the command will stop them in the provided order. + The command sends a stop request for each stage and returns after all requests succeed.`), + Example: io.FormatExampleCommands("stop pipeline", []io.Example{ + {Cmd: "run", Desc: "Stop the run stage"}, + {Cmd: "prepare test", Desc: "Stop the prepare and test stages in order"}, + {Cmd: "prepare test run", Desc: "Stop the prepare, test, and run stages in order"}, + }), + }, + Opts: StopPipelineOpts{GlobalOptions: opts}, + } + AddCmd(stop, pipeline.cmd) + pipeline.cmd.RunE = pipeline.RunE +} + +func (c *StopPipelineCmd) StopPipelineStages(client Client, wsId int, stages []string) error { + for _, stage := range stages { + if !isValidStage(stage) { + return fmt.Errorf("invalid pipeline stage: %s", stage) + } + } + for _, stage := range stages { + err := c.stopStage(client, wsId, stage) + if err != nil { + return err + } + } + return nil +} + +func (c *StopPipelineCmd) stopStage(client Client, wsId int, stage string) error { + log.Printf("stopping %s stage on workspace %d...", stage, wsId) + + err := client.StopPipelineStage(wsId, stage) + if err != nil { + log.Println() + return fmt.Errorf("failed to stop pipeline stage %s: %w", stage, err) + } + + log.Printf("stage %s stop requested\n", stage) + return nil +} diff --git a/cli/cmd/stop_pipeline_test.go b/cli/cmd/stop_pipeline_test.go new file mode 100644 index 00000000..6068d3e5 --- /dev/null +++ b/cli/cmd/stop_pipeline_test.go @@ -0,0 +1,55 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package cmd_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/cs-go/cli/cmd" +) + +var _ = Describe("StopPipeline", func() { + var ( + mockClient *cmd.MockClient + c *cmd.StopPipelineCmd + wsId int + stages []string + ) + + BeforeEach(func() { + mockClient = cmd.NewMockClient(GinkgoT()) + wsId = 21 + }) + + JustBeforeEach(func() { + c = &cmd.StopPipelineCmd{} + }) + + Context("invalid pipeline stage specified", func() { + BeforeEach(func() { + stages = []string{"warmup"} + }) + + It("fails before executing any stage", func() { + err := c.StopPipelineStages(mockClient, wsId, stages) + Expect(err).To(MatchError("invalid pipeline stage: " + stages[0])) + }) + }) + + Context("valid pipeline stages specified", func() { + BeforeEach(func() { + stages = []string{"prepare", "test", "run"} + }) + + It("stops all stages sequentially", func() { + mockClient.EXPECT().StopPipelineStage(wsId, stages[0]).Return(nil) + mockClient.EXPECT().StopPipelineStage(wsId, stages[1]).Return(nil) + mockClient.EXPECT().StopPipelineStage(wsId, stages[2]).Return(nil) + + err := c.StopPipelineStages(mockClient, wsId, stages) + Expect(err).NotTo(HaveOccurred()) + }) + }) +}) diff --git a/docs/README.md b/docs/README.md index 16c6426b..efc826ad 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,6 +34,7 @@ Manage and debug resources deployed in Codesphere via command line. * [cs scale](cs_scale.md) - Scale Codesphere resources * [cs set-env](cs_set-env.md) - Set environment variables * [cs start](cs_start.md) - Start workspace pipeline +* [cs stop](cs_stop.md) - Stop workspace pipeline * [cs sync](cs_sync.md) - Sync Codesphere resources * [cs team](cs_team.md) - Manage Team * [cs update](cs_update.md) - Update Codesphere CLI diff --git a/docs/cs.md b/docs/cs.md index 16c6426b..efc826ad 100644 --- a/docs/cs.md +++ b/docs/cs.md @@ -34,6 +34,7 @@ Manage and debug resources deployed in Codesphere via command line. * [cs scale](cs_scale.md) - Scale Codesphere resources * [cs set-env](cs_set-env.md) - Set environment variables * [cs start](cs_start.md) - Start workspace pipeline +* [cs stop](cs_stop.md) - Stop workspace pipeline * [cs sync](cs_sync.md) - Sync Codesphere resources * [cs team](cs_team.md) - Manage Team * [cs update](cs_update.md) - Update Codesphere CLI diff --git a/docs/cs_stop.md b/docs/cs_stop.md new file mode 100644 index 00000000..771d3b32 --- /dev/null +++ b/docs/cs_stop.md @@ -0,0 +1,29 @@ +## cs stop + +Stop workspace pipeline + +### Synopsis + +Stop pipeline of a workspace using the pipeline subcommand + +### Options + +``` + -h, --help help for stop +``` + +### Options inherited from parent commands + +``` + -a, --api string URL of Codesphere API (can also be CS_API) + -O, --org string Organization ID (relevant for some commands) + -t, --team int Team ID (relevant for some commands, can also be CS_TEAM_ID) (default -1) + -v, --verbose Verbose output + -w, --workspace int Workspace ID (relevant for some commands, can also be CS_WORKSPACE_ID) (default -1) +``` + +### SEE ALSO + +* [cs](cs.md) - The Codesphere CLI +* [cs stop pipeline](cs_stop_pipeline.md) - Stop pipeline stages of a workspace + diff --git a/docs/cs_stop_pipeline.md b/docs/cs_stop_pipeline.md new file mode 100644 index 00000000..7a7a8367 --- /dev/null +++ b/docs/cs_stop_pipeline.md @@ -0,0 +1,49 @@ +## cs stop pipeline + +Stop pipeline stages of a workspace + +### Synopsis + +Stop one or many pipeline stages of a workspace. + +Stages can be 'prepare', 'test', or 'run'. +When multiple stages are specified, the command will stop them in the provided order. +The command sends a stop request for each stage and returns after all requests succeed. + +``` +cs stop pipeline [flags] +``` + +### Examples + +``` +# Stop the run stage +$ cs stop pipeline run + +# Stop the prepare and test stages in order +$ cs stop pipeline prepare test + +# Stop the prepare, test, and run stages in order +$ cs stop pipeline prepare test run +``` + +### Options + +``` + -h, --help help for pipeline +``` + +### Options inherited from parent commands + +``` + -a, --api string URL of Codesphere API (can also be CS_API) + -O, --org string Organization ID (relevant for some commands) + -t, --team int Team ID (relevant for some commands, can also be CS_TEAM_ID) (default -1) + -v, --verbose Verbose output + -w, --workspace int Workspace ID (relevant for some commands, can also be CS_WORKSPACE_ID) (default -1) +``` + +### SEE ALSO + +* [cs stop](cs_stop.md) - Stop workspace pipeline + diff --git a/mcp-server/domain.go b/mcp-server/domain.go index 25ec2988..066ec053 100644 --- a/mcp-server/domain.go +++ b/mcp-server/domain.go @@ -49,7 +49,7 @@ func RegisterDomainTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, domains, nil + return nil, map[string]any{"items": domains}, nil }) mcp.AddTool(server, &mcp.Tool{ diff --git a/mcp-server/metadata.go b/mcp-server/metadata.go index 6b1271c6..dee8e2a4 100644 --- a/mcp-server/metadata.go +++ b/mcp-server/metadata.go @@ -22,7 +22,7 @@ func RegisterMetadataTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, dcs, nil + return nil, map[string]any{"items": dcs}, nil }) mcp.AddTool(server, &mcp.Tool{ @@ -33,6 +33,6 @@ func RegisterMetadataTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, images, nil + return nil, map[string]any{"items": images}, nil }) } diff --git a/mcp-server/plan.go b/mcp-server/plan.go index 1b831fcd..c39cbc0c 100644 --- a/mcp-server/plan.go +++ b/mcp-server/plan.go @@ -21,6 +21,6 @@ func RegisterPlanTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, plans, nil + return nil, map[string]any{"items": plans}, nil }) } diff --git a/mcp-server/team.go b/mcp-server/team.go index 0d8a5284..1f68f215 100644 --- a/mcp-server/team.go +++ b/mcp-server/team.go @@ -38,7 +38,7 @@ func RegisterTeamTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, teams, nil + return nil, map[string]any{"items": teams}, nil }) mcp.AddTool(server, &mcp.Tool{ diff --git a/mcp-server/workspace.go b/mcp-server/workspace.go index 93dac18c..6c37cc61 100644 --- a/mcp-server/workspace.go +++ b/mcp-server/workspace.go @@ -60,6 +60,11 @@ type StartPipelineStageArgs struct { Stage string `json:"stage" jsonschema:"Stage name"` } +type StopPipelineStageArgs struct { + WorkspaceId int `json:"workspaceId" jsonschema:"ID of the workspace"` + Stage string `json:"stage" jsonschema:"Stage name"` +} + type GetPipelineStateArgs struct { WorkspaceId int `json:"workspaceId" jsonschema:"ID of the workspace"` Stage string `json:"stage" jsonschema:"Stage name"` @@ -102,7 +107,7 @@ func RegisterWorkspaceTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, workspaces, nil + return nil, map[string]any{"items": workspaces}, nil }) mcp.AddTool(server, &mcp.Tool{ @@ -203,6 +208,17 @@ func RegisterWorkspaceTools(server *mcp.Server, client *api.Client) { return nil, map[string]string{"status": "started"}, nil }) + mcp.AddTool(server, &mcp.Tool{ + Name: "stop_pipeline_stage", + Description: "Stop a CI pipeline stage", + }, func(ctx context.Context, req *mcp.CallToolRequest, args StopPipelineStageArgs) (*mcp.CallToolResult, any, error) { + err := client.StopPipelineStage(args.WorkspaceId, args.Stage) + if err != nil { + return &mcp.CallToolResult{IsError: true}, nil, err + } + return nil, map[string]string{"status": "stopped"}, nil + }) + mcp.AddTool(server, &mcp.Tool{ Name: "get_pipeline_state", Description: "Get the status of a pipeline stage", @@ -211,7 +227,7 @@ func RegisterWorkspaceTools(server *mcp.Server, client *api.Client) { if err != nil { return &mcp.CallToolResult{IsError: true}, nil, err } - return nil, states, nil + return nil, map[string]any{"items": states}, nil }) mcp.AddTool(server, &mcp.Tool{