diff --git a/pacts/replicated-cli-vendor-api.json b/pacts/replicated-cli-vendor-api.json index 08ac5d29f..0c7fb29c1 100644 --- a/pacts/replicated-cli-vendor-api.json +++ b/pacts/replicated-cli-vendor-api.json @@ -28,11 +28,11 @@ "app": { "channels": [ { - }, + }, { - }, + }, { - } + } ], "created": "2000-02-01T12:30:00Z", "description": "", @@ -83,7 +83,7 @@ { "channels": [ { - } + } ], "id": "replicated-cli-list-apps-app", "name": "Replicated CLI List Apps App", @@ -223,7 +223,8 @@ "id": "replicated-cli-get-channel-unstable", "name": "Unstable", "releases": [ - ] + + ] } }, "matchingRules": { @@ -773,7 +774,7 @@ { "eventType": "release.promoted", "filters": { - } + } } ], "id": "notif-sub-1", @@ -817,7 +818,7 @@ { "eventType": "release.promoted", "filters": { - } + } } ], "isEnabled": true, @@ -834,7 +835,7 @@ { "eventType": "release.promoted", "filters": { - } + } } ], "id": "notif-sub-1", @@ -877,7 +878,7 @@ { "eventType": "release.promoted", "filters": { - } + } } ], "id": "notif-sub-1", @@ -923,7 +924,7 @@ { "eventType": "release.promoted", "filters": { - } + } } ], "id": "notif-sub-1", @@ -983,7 +984,8 @@ "events": [ { "attempts": [ - ], + + ], "eventData": { "releaseId": "rel-1" }, @@ -1720,7 +1722,8 @@ }, "body": { "releases": [ - ] + + ] } } }, diff --git a/pkg/kotsclient/cluster_create.go b/pkg/kotsclient/cluster_create.go index ab5302491..4234bb996 100644 --- a/pkg/kotsclient/cluster_create.go +++ b/pkg/kotsclient/cluster_create.go @@ -140,9 +140,12 @@ func (c *VendorV3Client) doCreateClusterDryRunRequest(req CreateClusterRequest) return nil, nil, err } - if resp.Error.Message != "" { + if resp.Error.Message != "" || resp.Error.ValidationError != nil || resp.Error.MaxDiskGiB != 0 || resp.Error.MaxEKS != 0 || resp.Error.MaxGKE != 0 || resp.Error.MaxAKS != 0 { return nil, &resp.Error, nil } + if resp.TotalCost == nil || resp.TTL == nil { + return nil, nil, fmt.Errorf("create cluster dry-run response missing total_cost or ttl") + } cl := &types.Cluster{ EstimatedCost: *resp.TotalCost, TTL: *resp.TTL, diff --git a/pkg/kotsclient/create_request_test.go b/pkg/kotsclient/create_request_test.go index b869f312b..d79df3789 100644 --- a/pkg/kotsclient/create_request_test.go +++ b/pkg/kotsclient/create_request_test.go @@ -97,3 +97,49 @@ func TestCreateClusterIncludesNetworkPolicy(t *testing.T) { require.Equal(t, "test-cluster", requestBody["name"]) require.Equal(t, "airgap", requestBody["network_policy"]) } + +func TestCreateClusterDryRunReturnsValidationErrorWithoutMessage(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + require.Equal(t, "/v3/cluster", r.URL.Path) + require.Equal(t, "dry-run=true", r.URL.RawQuery) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"error":{"validationError":{"errors":["bad version"]}}}`)) + })) + defer server.Close() + + httpClient := platformclient.NewHTTPClient(server.URL, "fake-api-key") + client := &VendorV3Client{HTTPClient: *httpClient} + + cluster, ve, err := client.CreateCluster(CreateClusterOpts{DryRun: true}) + require.NoError(t, err) + require.Nil(t, cluster) + require.NotNil(t, ve) + require.NotNil(t, ve.ValidationError) + require.Equal(t, []string{"bad version"}, ve.ValidationError.Errors) +} + +func TestCreateVMDryRunReturnsValidationErrorWithoutMessage(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + require.Equal(t, "/v3/vm", r.URL.Path) + require.Equal(t, "dry-run=true", r.URL.RawQuery) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`{"error":{"validationError":{"errors":["bad version"]}}}`)) + })) + defer server.Close() + + httpClient := platformclient.NewHTTPClient(server.URL, "fake-api-key") + client := &VendorV3Client{HTTPClient: *httpClient} + + vms, ve, err := client.CreateVM(CreateVMOpts{DryRun: true}) + require.NoError(t, err) + require.Nil(t, vms) + require.NotNil(t, ve) + require.NotNil(t, ve.ValidationError) + require.Equal(t, []string{"bad version"}, ve.ValidationError.Errors) +} diff --git a/pkg/kotsclient/vm_create.go b/pkg/kotsclient/vm_create.go index fcf9d9c5d..9acdc523e 100644 --- a/pkg/kotsclient/vm_create.go +++ b/pkg/kotsclient/vm_create.go @@ -125,9 +125,12 @@ func (c *VendorV3Client) doCreateVMDryRunRequest(req CreateVMRequest) ([]*types. return nil, nil, err } - if resp.Error.Message != "" { + if resp.Error.Message != "" || resp.Error.ValidationError != nil || resp.Error.MaxDiskGiB != 0 { return nil, &resp.Error, nil } + if resp.TotalCost == nil || resp.TTL == nil { + return nil, nil, fmt.Errorf("create vm dry-run response missing total_cost or ttl") + } vms := []*types.VM{ { EstimatedCost: *resp.TotalCost,