Skip to content

Commit 4dffe7b

Browse files
committed
Fix: Replace deprecated ske service state endpoints with new ones
1 parent b39e32c commit 4dffe7b

File tree

8 files changed

+166
-99
lines changed

8 files changed

+166
-99
lines changed

internal/cmd/ske/cluster/create/create.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1414
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
1515
"github.com/stackitcloud/stackit-cli/internal/pkg/projectname"
16+
serviceEnablementClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/client"
17+
serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils"
1618
"github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client"
1719
skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/utils"
1820
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
@@ -87,8 +89,14 @@ func NewCmd(p *print.Printer) *cobra.Command {
8789
}
8890
}
8991

92+
// Configure ServiceEnable API client
93+
serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(p)
94+
if err != nil {
95+
return err
96+
}
97+
9098
// Check if the project is enabled before trying to create
91-
enabled, err := skeUtils.ProjectEnabled(ctx, apiClient, model.ProjectId)
99+
enabled, err := serviceEnablementUtils.ProjectEnabled(ctx, serviceEnablementApiClient, model.ProjectId)
92100
if err != nil {
93101
return err
94102
}

internal/cmd/ske/cluster/list/list.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ import (
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1414
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
1515
"github.com/stackitcloud/stackit-cli/internal/pkg/projectname"
16+
serviceEnablementClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/client"
17+
serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils"
1618
"github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client"
17-
skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/utils"
1819
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"
1920

2021
"github.com/spf13/cobra"
@@ -60,8 +61,14 @@ func NewCmd(p *print.Printer) *cobra.Command {
6061
return err
6162
}
6263

64+
// Configure ServiceEnable API client
65+
serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(p)
66+
if err != nil {
67+
return err
68+
}
69+
6370
// Check if SKE is enabled for this project
64-
enabled, err := skeUtils.ProjectEnabled(ctx, apiClient, model.ProjectId)
71+
enabled, err := serviceEnablementUtils.ProjectEnabled(ctx, serviceEnablementApiClient, model.ProjectId)
6572
if err != nil {
6673
return err
6774
}

internal/cmd/ske/describe/describe.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import (
1111
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
1212
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
1313
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
14-
"github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client"
14+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/client"
15+
"github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils"
1516
"github.com/stackitcloud/stackit-cli/internal/pkg/tables"
17+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement"
1618

1719
"github.com/spf13/cobra"
18-
"github.com/stackitcloud/stackit-sdk-go/services/ske"
1920
)
2021

2122
type inputModel struct {
@@ -52,7 +53,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
5253
return fmt.Errorf("read SKE project details: %w", err)
5354
}
5455

55-
return outputResult(p, model.OutputFormat, resp)
56+
return outputResult(p, model.OutputFormat, resp, model.ProjectId)
5657
},
5758
}
5859
return cmd
@@ -80,12 +81,12 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
8081
return &model, nil
8182
}
8283

83-
func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiGetServiceStatusRequest {
84-
req := apiClient.GetServiceStatus(ctx, model.ProjectId) //nolint:staticcheck //command will be removed in a later update
84+
func buildRequest(ctx context.Context, model *inputModel, apiClient *serviceenablement.APIClient) serviceenablement.ApiGetServiceStatusRequest {
85+
req := apiClient.GetServiceStatus(ctx, model.ProjectId, utils.SKEServiceId)
8586
return req
8687
}
8788

88-
func outputResult(p *print.Printer, outputFormat string, project *ske.ProjectResponse) error {
89+
func outputResult(p *print.Printer, outputFormat string, project *serviceenablement.ServiceStatus, projectId string) error {
8990
switch outputFormat {
9091
case print.JSONOutputFormat:
9192
details, err := json.MarshalIndent(project, "", " ")
@@ -105,7 +106,7 @@ func outputResult(p *print.Printer, outputFormat string, project *ske.ProjectRes
105106
return nil
106107
default:
107108
table := tables.NewTable()
108-
table.AddRow("ID", *project.ProjectId)
109+
table.AddRow("ID", projectId)
109110
table.AddSeparator()
110111
table.AddRow("STATE", *project.State)
111112
err := table.Display(p)

internal/cmd/ske/describe/describe_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@ import (
66

77
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
88
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
9+
serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils"
10+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement"
911

1012
"github.com/google/go-cmp/cmp"
1113
"github.com/google/go-cmp/cmp/cmpopts"
1214
"github.com/google/uuid"
1315
"github.com/spf13/cobra"
14-
"github.com/stackitcloud/stackit-sdk-go/services/ske"
1516
)
1617

1718
var projectIdFlag = globalflags.ProjectIdFlag
1819

1920
type testCtxKey struct{}
2021

2122
var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo")
22-
var testClient = &ske.APIClient{}
23+
var testClient = &serviceenablement.APIClient{}
2324
var testProjectId = uuid.NewString()
2425

2526
func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string {
@@ -45,8 +46,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
4546
return model
4647
}
4748

48-
func fixtureRequest(mods ...func(request *ske.ApiGetServiceStatusRequest)) ske.ApiGetServiceStatusRequest {
49-
request := testClient.GetServiceStatus(testCtx, testProjectId) //nolint:staticcheck //command will be removed in a later update
49+
func fixtureRequest(mods ...func(request *serviceenablement.ApiGetServiceStatusRequest)) serviceenablement.ApiGetServiceStatusRequest {
50+
request := testClient.GetServiceStatus(testCtx, testProjectId, serviceEnablementUtils.SKEServiceId) //nolint:staticcheck //command will be removed in a later update
5051
for _, mod := range mods {
5152
mod(&request)
5253
}
@@ -145,7 +146,7 @@ func TestBuildRequest(t *testing.T) {
145146
description string
146147
model *inputModel
147148
isValid bool
148-
expectedRequest ske.ApiGetServiceStatusRequest
149+
expectedRequest serviceenablement.ApiGetServiceStatusRequest
149150
}{
150151
{
151152
description: "base",
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
package utils
22

3+
import (
4+
"context"
5+
"net/http"
6+
7+
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
8+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement"
9+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/wait"
10+
)
11+
312
const (
413
SKEServiceId = "cloud.stackit.ske"
514
)
15+
16+
type ServiceEnablementClient interface {
17+
GetServiceStatusExecute(ctx context.Context, projectId string, serviceId string) (*serviceenablement.ServiceStatus, error)
18+
}
19+
20+
func ProjectEnabled(ctx context.Context, apiClient ServiceEnablementClient, projectId string) (bool, error) {
21+
project, err := apiClient.GetServiceStatusExecute(ctx, projectId, SKEServiceId)
22+
if err != nil {
23+
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
24+
if !ok {
25+
return false, err
26+
}
27+
if oapiErr.StatusCode == http.StatusNotFound {
28+
return false, nil
29+
}
30+
return false, err
31+
}
32+
return *project.State == wait.ServiceStateEnabled, nil
33+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package utils
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
9+
10+
"github.com/google/uuid"
11+
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
12+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement"
13+
"github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/wait"
14+
)
15+
16+
var (
17+
testProjectId = uuid.NewString()
18+
)
19+
20+
type serviceEnableClientMocked struct {
21+
serviceDisabled bool
22+
getServiceStatusFails bool
23+
getServiceStatusResp *serviceenablement.ServiceStatus
24+
}
25+
26+
func (m *serviceEnableClientMocked) GetServiceStatusExecute(_ context.Context, _, _ string) (*serviceenablement.ServiceStatus, error) {
27+
if m.getServiceStatusFails {
28+
return nil, fmt.Errorf("could not get service status")
29+
}
30+
if m.serviceDisabled {
31+
return nil, &oapierror.GenericOpenAPIError{StatusCode: 404}
32+
}
33+
return m.getServiceStatusResp, nil
34+
}
35+
36+
func TestProjectEnabled(t *testing.T) {
37+
tests := []struct {
38+
description string
39+
serviceDisabled bool
40+
getProjectFails bool
41+
getProjectResp *serviceenablement.ServiceStatus
42+
isValid bool
43+
expectedOutput bool
44+
}{
45+
{
46+
description: "project enabled",
47+
getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateEnabled)},
48+
isValid: true,
49+
expectedOutput: true,
50+
},
51+
{
52+
description: "project disabled (404)",
53+
serviceDisabled: true,
54+
isValid: true,
55+
expectedOutput: false,
56+
},
57+
{
58+
description: "project disabled 1",
59+
getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateEnabling)},
60+
isValid: true,
61+
expectedOutput: false,
62+
},
63+
{
64+
description: "project disabled 2",
65+
getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateDisabled)},
66+
isValid: true,
67+
expectedOutput: false,
68+
},
69+
{
70+
description: "project disabled 3",
71+
getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateDisabling)},
72+
isValid: true,
73+
expectedOutput: false,
74+
},
75+
{
76+
description: "get clusters fails",
77+
getProjectFails: true,
78+
isValid: false,
79+
},
80+
}
81+
82+
for _, tt := range tests {
83+
t.Run(tt.description, func(t *testing.T) {
84+
client := &serviceEnableClientMocked{
85+
serviceDisabled: tt.serviceDisabled,
86+
getServiceStatusFails: tt.getProjectFails,
87+
getServiceStatusResp: tt.getProjectResp,
88+
}
89+
90+
output, err := ProjectEnabled(context.Background(), client, testProjectId)
91+
92+
if tt.isValid && err != nil {
93+
t.Errorf("failed on valid input")
94+
}
95+
if !tt.isValid && err == nil {
96+
t.Errorf("did not fail on invalid input")
97+
}
98+
if !tt.isValid {
99+
return
100+
}
101+
if output != tt.expectedOutput {
102+
t.Errorf("expected output to be %t, got %t", tt.expectedOutput, output)
103+
}
104+
})
105+
}
106+
}

internal/pkg/services/ske/utils/utils.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,11 @@ package utils
33
import (
44
"context"
55
"fmt"
6-
"net/http"
76
"os"
87
"path/filepath"
98
"strconv"
109

1110
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
12-
13-
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1411
"github.com/stackitcloud/stackit-sdk-go/services/ske"
1512
"golang.org/x/mod/semver"
1613
)
@@ -37,21 +34,6 @@ type SKEClient interface {
3734
ListProviderOptionsExecute(ctx context.Context) (*ske.ProviderOptions, error)
3835
}
3936

40-
func ProjectEnabled(ctx context.Context, apiClient SKEClient, projectId string) (bool, error) {
41-
project, err := apiClient.GetServiceStatusExecute(ctx, projectId)
42-
if err != nil {
43-
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
44-
if !ok {
45-
return false, err
46-
}
47-
if oapiErr.StatusCode == http.StatusNotFound {
48-
return false, nil
49-
}
50-
return false, err
51-
}
52-
return *project.State == ske.PROJECTSTATE_CREATED, nil
53-
}
54-
5537
func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, clusterName string) (bool, error) {
5638
clusters, err := apiClient.ListClustersExecute(ctx, projectId)
5739
if err != nil {

internal/pkg/services/ske/utils/utils_test.go

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -57,72 +57,6 @@ func (m *skeClientMocked) ListProviderOptionsExecute(_ context.Context) (*ske.Pr
5757
return m.listProviderOptionsResp, nil
5858
}
5959

60-
func TestProjectEnabled(t *testing.T) {
61-
tests := []struct {
62-
description string
63-
serviceDisabled bool
64-
getProjectFails bool
65-
getProjectResp *ske.ProjectResponse
66-
isValid bool
67-
expectedOutput bool
68-
}{
69-
{
70-
description: "project enabled",
71-
getProjectResp: &ske.ProjectResponse{State: ske.PROJECTSTATE_CREATED.Ptr()},
72-
isValid: true,
73-
expectedOutput: true,
74-
},
75-
{
76-
description: "project disabled (404)",
77-
serviceDisabled: true,
78-
isValid: true,
79-
expectedOutput: false,
80-
},
81-
{
82-
description: "project disabled 1",
83-
getProjectResp: &ske.ProjectResponse{State: ske.PROJECTSTATE_CREATING.Ptr()},
84-
isValid: true,
85-
expectedOutput: false,
86-
},
87-
{
88-
description: "project disabled 2",
89-
getProjectResp: &ske.ProjectResponse{State: ske.PROJECTSTATE_DELETING.Ptr()},
90-
isValid: true,
91-
expectedOutput: false,
92-
},
93-
{
94-
description: "get clusters fails",
95-
getProjectFails: true,
96-
isValid: false,
97-
},
98-
}
99-
100-
for _, tt := range tests {
101-
t.Run(tt.description, func(t *testing.T) {
102-
client := &skeClientMocked{
103-
serviceDisabled: tt.serviceDisabled,
104-
getServiceStatusFails: tt.getProjectFails,
105-
getServiceStatusResp: tt.getProjectResp,
106-
}
107-
108-
output, err := ProjectEnabled(context.Background(), client, testProjectId)
109-
110-
if tt.isValid && err != nil {
111-
t.Errorf("failed on valid input")
112-
}
113-
if !tt.isValid && err == nil {
114-
t.Errorf("did not fail on invalid input")
115-
}
116-
if !tt.isValid {
117-
return
118-
}
119-
if output != tt.expectedOutput {
120-
t.Errorf("expected output to be %t, got %t", tt.expectedOutput, output)
121-
}
122-
})
123-
}
124-
}
125-
12660
func TestClusterExists(t *testing.T) {
12761
tests := []struct {
12862
description string

0 commit comments

Comments
 (0)