diff --git a/services/iaas/CHANGELOG.md b/services/iaas/CHANGELOG.md index afe0866c9..ac5c8cfd6 100644 --- a/services/iaas/CHANGELOG.md +++ b/services/iaas/CHANGELOG.md @@ -1,15 +1,3 @@ -## v1.13.0 -- **Improvement:** Update various descriptions -- **Improvement:** Add new error messages for `CreateBackupRequest`, `CreateImageRequest`, `CreateSnapshotRequest` and `CreateVolumeRequest -- **Feature:** Add fields `VpcNetworkRangeId` and `VpcId` in Network -- **Feature:** Add field `Vtpm` in Server -- **Feature:** Add field `AvailabilityZone` in Snapshot -- `v1api`: **Removal:** Remove deprecated methods `UpdateImageScopeLocal` and `UpdateImageScopePublic` -- `v2beta1api`: Align package to latest API specification -- `v2alpha1api`: - - Align package to latest API specification - - **Feature:** Add waiters for VPC region and VPC network ranges - ## v1.12.2 - `v2api` - **Improvement**: fix `DeleteVolumeWaitHandler` error message diff --git a/services/iaas/VERSION b/services/iaas/VERSION index e58d236a7..e670a7660 100644 --- a/services/iaas/VERSION +++ b/services/iaas/VERSION @@ -1 +1 @@ -v1.13.0 \ No newline at end of file +v1.12.2 \ No newline at end of file diff --git a/services/iaas/oas_commit b/services/iaas/oas_commit index 2fd4b6b8b..854b4d05a 100644 --- a/services/iaas/oas_commit +++ b/services/iaas/oas_commit @@ -1 +1 @@ -f05986bf33be92fa5cbe425bcf5e4a11dd3c7463 +f0f8f6fffec1443b5a8cab41d989cc063797883b diff --git a/services/iaas/v2alpha1api/wait/wait.go b/services/iaas/v2alpha1api/wait/wait.go deleted file mode 100644 index 82dc70599..000000000 --- a/services/iaas/v2alpha1api/wait/wait.go +++ /dev/null @@ -1,123 +0,0 @@ -package wait - -import ( - "context" - "errors" - "net/http" - "time" - - "github.com/stackitcloud/stackit-sdk-go/core/wait" - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" -) - -const ( - CreateSuccess = "CREATED" - UpdateSuccess = "UPDATED" - FailedStatus = "FAILED" -) - -// CreateVPCRegionWaitHandler will wait for network area region creation -func CreateVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region string) *wait.AsyncActionHandler[iaas.RegionalVPC] { - waitConfig := wait.WaiterHelper[iaas.RegionalVPC, string]{ - FetchInstance: a.GetVPCRegion(ctx, projectId, vpcId, region).Execute, - GetState: getStateVPCRegion, - ActiveState: []string{CreateSuccess}, - ErrorState: []string{FailedStatus}, - } - - handler := wait.New(waitConfig.Wait()) - handler.SetSleepBeforeWait(2 * time.Second) - handler.SetTimeout(30 * time.Minute) - return handler -} - -// DeleteVPCRegionWaitHandler will wait for network area region deletion -func DeleteVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region string) *wait.AsyncActionHandler[iaas.RegionalVPC] { - waitConfig := wait.WaiterHelper[iaas.RegionalVPC, string]{ - FetchInstance: a.GetVPCRegion(ctx, projectId, vpcId, region).Execute, - GetState: getStateVPCRegion, - ActiveState: []string{}, - ErrorState: []string{FailedStatus}, - - // The IaaS API response with a 400 if the regional network area configuration doesn't exist because of some compatible - // issues to v1. When v1 is deprecated, they probably will respond with 404 - DeleteHttpErrorStatusCodes: []int{http.StatusBadRequest, http.StatusNotFound}, - } - - handler := wait.New(waitConfig.Wait()) - handler.SetSleepBeforeWait(2 * time.Second) - handler.SetTimeout(30 * time.Minute) - return handler -} - -func createOrUpdateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] { - waitConfig := wait.WaiterHelper[iaas.VPCNetworkRange, string]{ - FetchInstance: a.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute, - GetState: getStateVPCNetworkRange, - // Usually "CREATED" should be enough as active state. The IaaS API uses "CREATED" always as active state, even after an update. - // To prevent potential issues in the future, we set "UPDATED" also as active state. - ActiveState: []string{CreateSuccess, UpdateSuccess}, - ErrorState: []string{FailedStatus}, - } - - handler := wait.New(waitConfig.Wait()) - handler.SetSleepBeforeWait(5 * time.Second) - handler.SetTimeout(30 * time.Minute) - return handler -} - -// CreateVPCNetworkRangeWaitHandler will wait for VPC Network range creation -func CreateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] { - return createOrUpdateVPCNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId) -} - -// UpdateVPCNetworkRangeWaitHandler will wait for VPC Network range update -func UpdateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] { - return createOrUpdateVPCNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId) -} - -// DeleteVPCNetworkRangeWaitHandler will wait for VPC Network range deletion -func DeleteVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] { - waitConfig := wait.WaiterHelper[iaas.VPCNetworkRange, string]{ - FetchInstance: a.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute, - GetState: getStateVPCNetworkRange, - ErrorState: []string{FailedStatus}, - DeleteHttpErrorStatusCodes: nil, // Use defaults - } - - handler := wait.New(waitConfig.Wait()) - handler.SetSleepBeforeWait(5 * time.Second) - handler.SetTimeout(30 * time.Minute) - return handler -} - -// getStateVPCRegion returns the state of an iaas.RegionalVPC -func getStateVPCRegion(i *iaas.RegionalVPC) (string, error) { - if i == nil { - return "", errors.New("empty response") - } - if i.Status == nil { - return "", errors.New("status is missing in response") - } - return *i.Status, nil -} - -// getStateVPCNetworkRange returns the state of an iaas.VPCNetworkRange -func getStateVPCNetworkRange(i *iaas.VPCNetworkRange) (string, error) { - if i == nil { - return "", errors.New("empty response") - } - if i.VPCNetworkRangeIPv4 != nil { - if i.VPCNetworkRangeIPv4.Status == nil { - return "", errors.New("ipv4 status is missing in response") - } - return *i.VPCNetworkRangeIPv4.Status, nil - } - if i.VPCNetworkRangeIPv6 != nil { - if i.VPCNetworkRangeIPv6.Status == nil { - return "", errors.New("ipv6 status is missing in response") - } - return *i.VPCNetworkRangeIPv6.Status, nil - } - return "", errors.New("unknown status in response") -} diff --git a/services/iaas/v2alpha1api/wait/wait_test.go b/services/iaas/v2alpha1api/wait/wait_test.go deleted file mode 100644 index b2898fa34..000000000 --- a/services/iaas/v2alpha1api/wait/wait_test.go +++ /dev/null @@ -1,328 +0,0 @@ -package wait - -import ( - "context" - "fmt" - "testing" - "testing/synctest" - "time" - - "github.com/google/go-cmp/cmp" - - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/core/wait" - iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2alpha1api" -) - -type iaasMockSettings struct { - getVPCRegionFails bool - getVPCNetworkRangeFails bool - isDeleted bool - resourceState string -} - -func newIaaSAPIMock(settings *iaasMockSettings) iaas.DefaultAPI { - return &iaas.DefaultAPIServiceMock{ - GetVPCRegionExecuteMock: utils.Ptr(func(_ iaas.ApiGetVPCRegionRequest) (*iaas.RegionalVPC, error) { - if settings.isDeleted { - return nil, &oapierror.GenericOpenAPIError{ - StatusCode: 404, - } - } - - if settings.getVPCRegionFails { - return nil, &oapierror.GenericOpenAPIError{ - StatusCode: 500, - } - } - - return &iaas.RegionalVPC{ - Status: &settings.resourceState, - }, nil - }), - GetVPCNetworkRangeExecuteMock: utils.Ptr(func(_ iaas.ApiGetVPCNetworkRangeRequest) (*iaas.VPCNetworkRange, error) { - if settings.isDeleted { - return nil, &oapierror.GenericOpenAPIError{ - StatusCode: 404, - } - } - - if settings.getVPCNetworkRangeFails { - return nil, &oapierror.GenericOpenAPIError{ - StatusCode: 500, - } - } - - return &iaas.VPCNetworkRange{ - VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{ - Status: &settings.resourceState, - }, - }, nil - }), - } -} - -func TestCreateNetworkAreaRegionWaitHandler(t *testing.T) { - tests := []struct { - desc string - getFails bool - resourceState string - wantErr bool - wantResp bool - }{ - { - desc: "create_succeeded", - getFails: false, - resourceState: CreateSuccess, - wantErr: false, - wantResp: true, - }, - { - desc: "get_fails", - getFails: true, - resourceState: "", - wantErr: true, - wantResp: false, - }, - { - desc: "timeout", - getFails: false, - resourceState: "ANOTHER STATE", - wantErr: true, - wantResp: true, - }, - } - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - synctest.Test(t, func(t *testing.T) { - apiClient := newIaaSAPIMock(&iaasMockSettings{ - getVPCRegionFails: tt.getFails, - resourceState: tt.resourceState, - }) - - var wantRes *iaas.RegionalVPC - if tt.wantResp { - wantRes = &iaas.RegionalVPC{ - Status: utils.Ptr(tt.resourceState), - } - } - - handler := CreateVPCRegionWaitHandler(context.Background(), apiClient, "pid", "aid", "region") - - gotRes, err := handler.SetTimeout(10 * time.Millisecond).SetSleepBeforeWait(1 * time.Millisecond).WaitWithContext(context.Background()) - - if (err != nil) != tt.wantErr { - t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) - } - if !tt.wantErr && !cmp.Equal(gotRes, wantRes) { - t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) - } - }) - }) - } -} - -func TestDeleteNetworkAreaRegionWaitHandler(t *testing.T) { - tests := []struct { - desc string - getFails bool - isDeleted bool - resourceState string - wantErr bool - wantResp bool - }{ - { - desc: "delete_succeeded", - getFails: false, - isDeleted: true, - wantErr: false, - wantResp: false, - }, - { - desc: "get_fails", - getFails: true, - resourceState: "", - wantErr: true, - wantResp: false, - }, - { - desc: "timeout", - getFails: false, - resourceState: "ANOTHER STATE", - wantErr: true, - wantResp: false, - }, - } - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - synctest.Test(t, func(t *testing.T) { - apiClient := newIaaSAPIMock(&iaasMockSettings{ - getVPCRegionFails: tt.getFails, - isDeleted: tt.isDeleted, - resourceState: tt.resourceState, - }) - - var wantRes *iaas.RegionalVPC - if tt.wantResp { - wantRes = &iaas.RegionalVPC{ - Status: utils.Ptr(tt.resourceState), - } - } - - handler := DeleteVPCRegionWaitHandler(context.Background(), apiClient, "pid", "region", "nid") - - gotRes, err := handler.SetSleepBeforeWait(0).SetTimeout(10 * time.Millisecond).WaitWithContext(context.Background()) - - if (err != nil) != tt.wantErr { - t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) - } - if !tt.wantErr && !cmp.Equal(gotRes, wantRes) { - t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) - } - }) - }) - } -} - -func TestCreateOrUpdateVPCNetworkRangeWaitHandler(t *testing.T) { - tests := []struct { - desc string - getFails bool - resourceState string - wantErr bool - wantResp bool - }{ - { - desc: "update_succeeded", - getFails: false, - resourceState: UpdateSuccess, - wantErr: false, - wantResp: true, - }, - { - desc: "create_succeeded", - getFails: false, - resourceState: CreateSuccess, - wantErr: false, - wantResp: true, - }, - { - desc: "get_fails", - getFails: true, - resourceState: "", - wantErr: true, - wantResp: false, - }, - { - desc: "timeout", - getFails: false, - resourceState: "ANOTHER STATE", - wantErr: true, - wantResp: true, - }, - } - - handlers := map[string]func(context.Context, iaas.DefaultAPI, string, string, string, string) *wait.AsyncActionHandler[iaas.VPCNetworkRange]{ - "common logic": createOrUpdateVPCNetworkRangeWaitHandler, - "create": CreateVPCNetworkRangeWaitHandler, - "update": UpdateVPCNetworkRangeWaitHandler, - } - - for handlerDesc, handlerFn := range handlers { - for _, tt := range tests { - t.Run(fmt.Sprintf("%s - %s", handlerDesc, tt.desc), func(t *testing.T) { - synctest.Test(t, func(t *testing.T) { - apiClient := newIaaSAPIMock(&iaasMockSettings{ - getVPCNetworkRangeFails: tt.getFails, - resourceState: tt.resourceState, - }) - - var wantRes *iaas.VPCNetworkRange - if tt.wantResp { - wantRes = &iaas.VPCNetworkRange{ - VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{ - Status: utils.Ptr(tt.resourceState), - }, - } - } - - handler := handlerFn(context.Background(), apiClient, "pid", "vpcId", "region", "nid") - - gotRes, err := handler.WaitWithContext(context.Background()) - - if (err != nil) != tt.wantErr { - t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) - } - if !tt.wantErr && !cmp.Equal(gotRes, wantRes) { - t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) - } - }) - }) - } - } -} - -func TestDeleteVPCNetworkRangeWaitHandler(t *testing.T) { - tests := []struct { - desc string - getFails bool - isDeleted bool - resourceState string - wantErr bool - wantResp bool - }{ - { - desc: "delete_succeeded", - getFails: false, - isDeleted: true, - wantErr: false, - wantResp: false, - }, - { - desc: "get_fails", - getFails: true, - resourceState: "", - wantErr: true, - wantResp: false, - }, - { - desc: "timeout", - getFails: false, - resourceState: "ANOTHER STATE", - wantErr: true, - wantResp: false, - }, - } - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - synctest.Test(t, func(t *testing.T) { - apiClient := newIaaSAPIMock(&iaasMockSettings{ - getVPCNetworkRangeFails: tt.getFails, - isDeleted: tt.isDeleted, - resourceState: tt.resourceState, - }) - - var wantRes *iaas.VPCNetworkRange - if tt.wantResp { - wantRes = &iaas.VPCNetworkRange{ - VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{ - Status: utils.Ptr(tt.resourceState), - }, - } - } - - handler := DeleteVPCNetworkRangeWaitHandler(context.Background(), apiClient, "pid", "vpcId", "region", "nid") - - gotRes, err := handler.WaitWithContext(context.Background()) - - if (err != nil) != tt.wantErr { - t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr) - } - if !tt.wantErr && !cmp.Equal(gotRes, wantRes) { - t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes) - } - }) - }) - } -}