From 16e0548bb9d51aa8331deca6181ba83e88203649 Mon Sep 17 00:00:00 2001 From: Marcin Kaciuba Date: Fri, 14 Jul 2023 14:27:37 +0200 Subject: [PATCH] feat:eks cross role user resource (#186) * feat: eks cross role user resource * doc: generate doc * test: update acc test --- castai/data_source_eks_cluster_userarn.go | 3 +- castai/provider.go | 5 +- castai/resource_eks_cluster_userarn.go | 98 +++++ castai/resource_node_configuration_test.go | 4 +- castai/sdk/api.gen.go | 13 + castai/sdk/client.gen.go | 351 ++++++++++++++++++ castai/sdk/mock/client.go | 105 ++++++ .../eks_user_arn.md | 4 +- docs/resources/rebalancing_schedule.md | 2 +- examples/eks/eks_cluster_assumerole/castai.tf | 2 +- .../eks_cluster_autoscaler_polices/castai.tf | 2 +- examples/eks/eks_cluster_custom_iam/castai.tf | 2 +- .../eks_cluster_optional_readonly/castai.tf | 2 +- .../eks/eks_cluster_optional_readonly/iam.tf | 2 +- .../eks_cluster_optional_readonly/versions.tf | 1 + examples/eks/eks_cluster_webshop/main.tf | 2 +- 16 files changed, 585 insertions(+), 13 deletions(-) create mode 100644 castai/resource_eks_cluster_userarn.go rename docs/{data-sources => resources}/eks_user_arn.md (71%) diff --git a/castai/data_source_eks_cluster_userarn.go b/castai/data_source_eks_cluster_userarn.go index c1b86d02..c405180a 100644 --- a/castai/data_source_eks_cluster_userarn.go +++ b/castai/data_source_eks_cluster_userarn.go @@ -18,7 +18,8 @@ const ( func dataSourceEKSClusterUserARN() *schema.Resource { return &schema.Resource{ - ReadContext: dataSourceCastaiEKSUserARN, + ReadContext: dataSourceCastaiEKSUserARN, + DeprecationMessage: `Use castai_eks_user_arn resource instead`, Schema: map[string]*schema.Schema{ EKSClusterUserARNFieldClusterID: { Type: schema.TypeString, diff --git a/castai/provider.go b/castai/provider.go index 8215af10..7abbb0aa 100644 --- a/castai/provider.go +++ b/castai/provider.go @@ -44,12 +44,15 @@ func Provider(version string) *schema.Provider { "castai_rebalancing_job": resourceRebalancingJob(), "castai_node_configuration": resourceNodeConfiguration(), "castai_node_configuration_default": resourceNodeConfigurationDefault(), + "castai_eks_user_arn": resourceEKSClusterUserARN(), }, DataSourcesMap: map[string]*schema.Resource{ "castai_eks_settings": dataSourceEKSSettings(), - "castai_eks_user_arn": dataSourceEKSClusterUserARN(), "castai_gke_user_policies": dataSourceGKEPolicies(), + + // TODO: remove in next major release + "castai_eks_user_arn": dataSourceEKSClusterUserARN(), }, ConfigureContextFunc: providerConfigure(version), diff --git a/castai/resource_eks_cluster_userarn.go b/castai/resource_eks_cluster_userarn.go new file mode 100644 index 00000000..9f6e3e00 --- /dev/null +++ b/castai/resource_eks_cluster_userarn.go @@ -0,0 +1,98 @@ +package castai + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + + "github.com/castai/terraform-provider-castai/castai/sdk" +) + +func resourceEKSClusterUserARN() *schema.Resource { + return &schema.Resource{ + ReadContext: resourceEKSUserARNRead, + CreateContext: resourceEKSUserARNCreate, + DeleteContext: resourceEKSUserARNDelete, + Schema: map[string]*schema.Schema{ + EKSClusterUserARNFieldClusterID: { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotWhiteSpace), + }, + EKSClusterUserARNFieldARN: { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +func resourceEKSUserARNRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics { + client := meta.(*ProviderConfig).api + + clusterID := data.Get(EKSClusterUserARNFieldClusterID).(string) + + resp, err := client.ExternalClusterAPIGetAssumeRolePrincipalWithResponse(ctx, clusterID) + if checkErr := sdk.CheckOKResponse(resp, err); checkErr != nil { + return diag.FromErr(checkErr) + } + + arn := *resp.JSON200.Arn + + data.SetId(arn) + if err := data.Set(EKSClusterUserARNFieldARN, arn); err != nil { + return diag.FromErr(fmt.Errorf("setting user arn: %w", err)) + } + + return nil +} + +func resourceEKSUserARNCreate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics { + if err := resourceEKSUserARNRead(ctx, data, meta); err != nil { + return err + } + + arn, ok := data.Get(EKSClusterUserARNFieldARN).(string) + if ok && arn != "" { + log.Println("Using created arn for cross role user") + return nil + } + + client := meta.(*ProviderConfig).api + + clusterID := data.Get(EKSClusterUserARNFieldClusterID).(string) + + resp, err := client.ExternalClusterAPICreateAssumeRolePrincipalWithResponse(ctx, clusterID) + if checkErr := sdk.CheckOKResponse(resp, err); checkErr != nil { + return diag.FromErr(checkErr) + } + + arn = *resp.JSON200.Arn + + data.SetId(arn) + if err := data.Set(EKSClusterUserARNFieldARN, arn); err != nil { + return diag.FromErr(fmt.Errorf("setting user arn: %w", err)) + } + + return nil +} + +func resourceEKSUserARNDelete(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics { + client := meta.(*ProviderConfig).api + + clusterID := data.Get(EKSClusterUserARNFieldClusterID).(string) + + resp, err := client.ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse(ctx, clusterID) + if checkErr := sdk.CheckOKResponse(resp, err); checkErr != nil { + return diag.FromErr(checkErr) + } + + data.SetId("") + + return nil +} diff --git a/castai/resource_node_configuration_test.go b/castai/resource_node_configuration_test.go index 0fce171c..74ff634f 100644 --- a/castai/resource_node_configuration_test.go +++ b/castai/resource_node_configuration_test.go @@ -159,7 +159,7 @@ resource "castai_eks_clusterid" "test" { cluster_name = %[1]q } -data "castai_eks_user_arn" "test" { +resource "castai_eks_user_arn" "test" { cluster_id = castai_eks_clusterid.test.id } @@ -228,7 +228,7 @@ resource "aws_iam_role" "test" { Action = "sts:AssumeRole" Effect = "Allow" Principal = { - AWS = data.castai_eks_user_arn.test.arn + AWS = castai_eks_user_arn.test.arn } }, ] diff --git a/castai/sdk/api.gen.go b/castai/sdk/api.gen.go index b2f177d3..24457b8b 100644 --- a/castai/sdk/api.gen.go +++ b/castai/sdk/api.gen.go @@ -289,11 +289,19 @@ type ExternalclusterV1ClusterUpdate struct { Eks *ExternalclusterV1UpdateEKSClusterParams `json:"eks,omitempty"` } +// ExternalclusterV1CreateAssumeRolePrincipalResponse defines model for externalcluster.v1.CreateAssumeRolePrincipalResponse. +type ExternalclusterV1CreateAssumeRolePrincipalResponse struct { + Arn *string `json:"arn,omitempty"` +} + // ExternalclusterV1CreateClusterTokenResponse defines model for externalcluster.v1.CreateClusterTokenResponse. type ExternalclusterV1CreateClusterTokenResponse struct { Token *string `json:"token,omitempty"` } +// ExternalclusterV1DeleteAssumeRolePrincipalResponse defines model for externalcluster.v1.DeleteAssumeRolePrincipalResponse. +type ExternalclusterV1DeleteAssumeRolePrincipalResponse = map[string]interface{} + // DeleteNodeResponse is the result of DeleteNodeRequest. type ExternalclusterV1DeleteNodeResponse struct { // Node delete operation ID. @@ -397,6 +405,11 @@ type ExternalclusterV1GPUInfo struct { GpuDevices *[]ExternalclusterV1GPUDevice `json:"gpuDevices,omitempty"` } +// ExternalclusterV1GetAssumeRolePrincipalResponse defines model for externalcluster.v1.GetAssumeRolePrincipalResponse. +type ExternalclusterV1GetAssumeRolePrincipalResponse struct { + Arn *string `json:"arn,omitempty"` +} + // ExternalclusterV1GetAssumeRoleUserResponse defines model for externalcluster.v1.GetAssumeRoleUserResponse. type ExternalclusterV1GetAssumeRoleUserResponse struct { Arn *string `json:"arn,omitempty"` diff --git a/castai/sdk/client.gen.go b/castai/sdk/client.gen.go index 3d969122..908427db 100644 --- a/castai/sdk/client.gen.go +++ b/castai/sdk/client.gen.go @@ -212,6 +212,15 @@ type ClientInterface interface { ExternalClusterAPIUpdateCluster(ctx context.Context, clusterId string, body ExternalClusterAPIUpdateClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ExternalClusterAPIDeleteAssumeRolePrincipal request + ExternalClusterAPIDeleteAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // ExternalClusterAPIGetAssumeRolePrincipal request + ExternalClusterAPIGetAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // ExternalClusterAPICreateAssumeRolePrincipal request + ExternalClusterAPICreateAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // ExternalClusterAPIGetAssumeRoleUser request ExternalClusterAPIGetAssumeRoleUser(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -831,6 +840,42 @@ func (c *Client) ExternalClusterAPIUpdateCluster(ctx context.Context, clusterId return c.Client.Do(req) } +func (c *Client) ExternalClusterAPIDeleteAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewExternalClusterAPIDeleteAssumeRolePrincipalRequest(c.Server, clusterId) + 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) ExternalClusterAPIGetAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewExternalClusterAPIGetAssumeRolePrincipalRequest(c.Server, clusterId) + 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) ExternalClusterAPICreateAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewExternalClusterAPICreateAssumeRolePrincipalRequest(c.Server, clusterId) + 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) ExternalClusterAPIGetAssumeRoleUser(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewExternalClusterAPIGetAssumeRoleUserRequest(c.Server, clusterId) if err != nil { @@ -2499,6 +2544,108 @@ func NewExternalClusterAPIUpdateClusterRequestWithBody(server string, clusterId return req, nil } +// NewExternalClusterAPIDeleteAssumeRolePrincipalRequest generates requests for ExternalClusterAPIDeleteAssumeRolePrincipal +func NewExternalClusterAPIDeleteAssumeRolePrincipalRequest(server string, clusterId string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "clusterId", runtime.ParamLocationPath, clusterId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/kubernetes/external-clusters/%s/assume-role-principal", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewExternalClusterAPIGetAssumeRolePrincipalRequest generates requests for ExternalClusterAPIGetAssumeRolePrincipal +func NewExternalClusterAPIGetAssumeRolePrincipalRequest(server string, clusterId string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "clusterId", runtime.ParamLocationPath, clusterId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/kubernetes/external-clusters/%s/assume-role-principal", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewExternalClusterAPICreateAssumeRolePrincipalRequest generates requests for ExternalClusterAPICreateAssumeRolePrincipal +func NewExternalClusterAPICreateAssumeRolePrincipalRequest(server string, clusterId string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "clusterId", runtime.ParamLocationPath, clusterId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/kubernetes/external-clusters/%s/assume-role-principal", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewExternalClusterAPIGetAssumeRoleUserRequest generates requests for ExternalClusterAPIGetAssumeRoleUser func NewExternalClusterAPIGetAssumeRoleUserRequest(server string, clusterId string) (*http.Request, error) { var err error @@ -3647,6 +3794,15 @@ type ClientWithResponsesInterface interface { ExternalClusterAPIUpdateClusterWithResponse(ctx context.Context, clusterId string, body ExternalClusterAPIUpdateClusterJSONRequestBody) (*ExternalClusterAPIUpdateClusterResponse, error) + // ExternalClusterAPIDeleteAssumeRolePrincipal request + ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIDeleteAssumeRolePrincipalResponse, error) + + // ExternalClusterAPIGetAssumeRolePrincipal request + ExternalClusterAPIGetAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIGetAssumeRolePrincipalResponse, error) + + // ExternalClusterAPICreateAssumeRolePrincipal request + ExternalClusterAPICreateAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPICreateAssumeRolePrincipalResponse, error) + // ExternalClusterAPIGetAssumeRoleUser request ExternalClusterAPIGetAssumeRoleUserWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIGetAssumeRoleUserResponse, error) @@ -4694,6 +4850,96 @@ func (r ExternalClusterAPIUpdateClusterResponse) GetBody() []byte { // TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 +type ExternalClusterAPIDeleteAssumeRolePrincipalResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ExternalclusterV1DeleteAssumeRolePrincipalResponse +} + +// Status returns HTTPResponse.Status +func (r ExternalClusterAPIDeleteAssumeRolePrincipalResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ExternalClusterAPIDeleteAssumeRolePrincipalResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 +// Body returns body of byte array +func (r ExternalClusterAPIDeleteAssumeRolePrincipalResponse) GetBody() []byte { + return r.Body +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 + +type ExternalClusterAPIGetAssumeRolePrincipalResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ExternalclusterV1GetAssumeRolePrincipalResponse +} + +// Status returns HTTPResponse.Status +func (r ExternalClusterAPIGetAssumeRolePrincipalResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ExternalClusterAPIGetAssumeRolePrincipalResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 +// Body returns body of byte array +func (r ExternalClusterAPIGetAssumeRolePrincipalResponse) GetBody() []byte { + return r.Body +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 + +type ExternalClusterAPICreateAssumeRolePrincipalResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ExternalclusterV1CreateAssumeRolePrincipalResponse +} + +// Status returns HTTPResponse.Status +func (r ExternalClusterAPICreateAssumeRolePrincipalResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ExternalClusterAPICreateAssumeRolePrincipalResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 +// Body returns body of byte array +func (r ExternalClusterAPICreateAssumeRolePrincipalResponse) GetBody() []byte { + return r.Body +} + +// TODO: to have common interface. https://github.com/deepmap/oapi-codegen/issues/240 + type ExternalClusterAPIGetAssumeRoleUserResponse struct { Body []byte HTTPResponse *http.Response @@ -5744,6 +5990,33 @@ func (c *ClientWithResponses) ExternalClusterAPIUpdateClusterWithResponse(ctx co return ParseExternalClusterAPIUpdateClusterResponse(rsp) } +// ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse request returning *ExternalClusterAPIDeleteAssumeRolePrincipalResponse +func (c *ClientWithResponses) ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIDeleteAssumeRolePrincipalResponse, error) { + rsp, err := c.ExternalClusterAPIDeleteAssumeRolePrincipal(ctx, clusterId) + if err != nil { + return nil, err + } + return ParseExternalClusterAPIDeleteAssumeRolePrincipalResponse(rsp) +} + +// ExternalClusterAPIGetAssumeRolePrincipalWithResponse request returning *ExternalClusterAPIGetAssumeRolePrincipalResponse +func (c *ClientWithResponses) ExternalClusterAPIGetAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIGetAssumeRolePrincipalResponse, error) { + rsp, err := c.ExternalClusterAPIGetAssumeRolePrincipal(ctx, clusterId) + if err != nil { + return nil, err + } + return ParseExternalClusterAPIGetAssumeRolePrincipalResponse(rsp) +} + +// ExternalClusterAPICreateAssumeRolePrincipalWithResponse request returning *ExternalClusterAPICreateAssumeRolePrincipalResponse +func (c *ClientWithResponses) ExternalClusterAPICreateAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPICreateAssumeRolePrincipalResponse, error) { + rsp, err := c.ExternalClusterAPICreateAssumeRolePrincipal(ctx, clusterId) + if err != nil { + return nil, err + } + return ParseExternalClusterAPICreateAssumeRolePrincipalResponse(rsp) +} + // ExternalClusterAPIGetAssumeRoleUserWithResponse request returning *ExternalClusterAPIGetAssumeRoleUserResponse func (c *ClientWithResponses) ExternalClusterAPIGetAssumeRoleUserWithResponse(ctx context.Context, clusterId string) (*ExternalClusterAPIGetAssumeRoleUserResponse, error) { rsp, err := c.ExternalClusterAPIGetAssumeRoleUser(ctx, clusterId) @@ -6812,6 +7085,84 @@ func ParseExternalClusterAPIUpdateClusterResponse(rsp *http.Response) (*External return response, nil } +// ParseExternalClusterAPIDeleteAssumeRolePrincipalResponse parses an HTTP response from a ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse call +func ParseExternalClusterAPIDeleteAssumeRolePrincipalResponse(rsp *http.Response) (*ExternalClusterAPIDeleteAssumeRolePrincipalResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer rsp.Body.Close() + if err != nil { + return nil, err + } + + response := &ExternalClusterAPIDeleteAssumeRolePrincipalResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ExternalclusterV1DeleteAssumeRolePrincipalResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + } + + return response, nil +} + +// ParseExternalClusterAPIGetAssumeRolePrincipalResponse parses an HTTP response from a ExternalClusterAPIGetAssumeRolePrincipalWithResponse call +func ParseExternalClusterAPIGetAssumeRolePrincipalResponse(rsp *http.Response) (*ExternalClusterAPIGetAssumeRolePrincipalResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer rsp.Body.Close() + if err != nil { + return nil, err + } + + response := &ExternalClusterAPIGetAssumeRolePrincipalResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ExternalclusterV1GetAssumeRolePrincipalResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + } + + return response, nil +} + +// ParseExternalClusterAPICreateAssumeRolePrincipalResponse parses an HTTP response from a ExternalClusterAPICreateAssumeRolePrincipalWithResponse call +func ParseExternalClusterAPICreateAssumeRolePrincipalResponse(rsp *http.Response) (*ExternalClusterAPICreateAssumeRolePrincipalResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer rsp.Body.Close() + if err != nil { + return nil, err + } + + response := &ExternalClusterAPICreateAssumeRolePrincipalResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ExternalclusterV1CreateAssumeRolePrincipalResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + } + + return response, nil +} + // ParseExternalClusterAPIGetAssumeRoleUserResponse parses an HTTP response from a ExternalClusterAPIGetAssumeRoleUserWithResponse call func ParseExternalClusterAPIGetAssumeRoleUserResponse(rsp *http.Response) (*ExternalClusterAPIGetAssumeRoleUserResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/castai/sdk/mock/client.go b/castai/sdk/mock/client.go index 5635e22e..d095560e 100644 --- a/castai/sdk/mock/client.go +++ b/castai/sdk/mock/client.go @@ -255,6 +255,26 @@ func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPIAddNodeWithBody(ctx return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIAddNodeWithBody", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPIAddNodeWithBody), varargs...) } +// ExternalClusterAPICreateAssumeRolePrincipal mocks base method. +func (m *MockClientInterface) ExternalClusterAPICreateAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, clusterId} + for _, a := range reqEditors { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ExternalClusterAPICreateAssumeRolePrincipal", varargs...) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPICreateAssumeRolePrincipal indicates an expected call of ExternalClusterAPICreateAssumeRolePrincipal. +func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPICreateAssumeRolePrincipal(ctx, clusterId interface{}, reqEditors ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, clusterId}, reqEditors...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPICreateAssumeRolePrincipal", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPICreateAssumeRolePrincipal), varargs...) +} + // ExternalClusterAPICreateClusterToken mocks base method. func (m *MockClientInterface) ExternalClusterAPICreateClusterToken(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { m.ctrl.T.Helper() @@ -275,6 +295,26 @@ func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPICreateClusterToken( return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPICreateClusterToken", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPICreateClusterToken), varargs...) } +// ExternalClusterAPIDeleteAssumeRolePrincipal mocks base method. +func (m *MockClientInterface) ExternalClusterAPIDeleteAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, clusterId} + for _, a := range reqEditors { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ExternalClusterAPIDeleteAssumeRolePrincipal", varargs...) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPIDeleteAssumeRolePrincipal indicates an expected call of ExternalClusterAPIDeleteAssumeRolePrincipal. +func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPIDeleteAssumeRolePrincipal(ctx, clusterId interface{}, reqEditors ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, clusterId}, reqEditors...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIDeleteAssumeRolePrincipal", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPIDeleteAssumeRolePrincipal), varargs...) +} + // ExternalClusterAPIDeleteCluster mocks base method. func (m *MockClientInterface) ExternalClusterAPIDeleteCluster(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { m.ctrl.T.Helper() @@ -395,6 +435,26 @@ func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPIDrainNodeWithBody(c return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIDrainNodeWithBody", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPIDrainNodeWithBody), varargs...) } +// ExternalClusterAPIGetAssumeRolePrincipal mocks base method. +func (m *MockClientInterface) ExternalClusterAPIGetAssumeRolePrincipal(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, clusterId} + for _, a := range reqEditors { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ExternalClusterAPIGetAssumeRolePrincipal", varargs...) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPIGetAssumeRolePrincipal indicates an expected call of ExternalClusterAPIGetAssumeRolePrincipal. +func (mr *MockClientInterfaceMockRecorder) ExternalClusterAPIGetAssumeRolePrincipal(ctx, clusterId interface{}, reqEditors ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, clusterId}, reqEditors...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIGetAssumeRolePrincipal", reflect.TypeOf((*MockClientInterface)(nil).ExternalClusterAPIGetAssumeRolePrincipal), varargs...) +} + // ExternalClusterAPIGetAssumeRoleUser mocks base method. func (m *MockClientInterface) ExternalClusterAPIGetAssumeRoleUser(ctx context.Context, clusterId string, reqEditors ...sdk.RequestEditorFn) (*http.Response, error) { m.ctrl.T.Helper() @@ -1693,6 +1753,21 @@ func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPIAddNod return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIAddNodeWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPIAddNodeWithResponse), ctx, clusterId, body) } +// ExternalClusterAPICreateAssumeRolePrincipalWithResponse mocks base method. +func (m *MockClientWithResponsesInterface) ExternalClusterAPICreateAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPICreateAssumeRolePrincipalResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExternalClusterAPICreateAssumeRolePrincipalWithResponse", ctx, clusterId) + ret0, _ := ret[0].(*sdk.ExternalClusterAPICreateAssumeRolePrincipalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPICreateAssumeRolePrincipalWithResponse indicates an expected call of ExternalClusterAPICreateAssumeRolePrincipalWithResponse. +func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPICreateAssumeRolePrincipalWithResponse(ctx, clusterId interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPICreateAssumeRolePrincipalWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPICreateAssumeRolePrincipalWithResponse), ctx, clusterId) +} + // ExternalClusterAPICreateClusterTokenWithResponse mocks base method. func (m *MockClientWithResponsesInterface) ExternalClusterAPICreateClusterTokenWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPICreateClusterTokenResponse, error) { m.ctrl.T.Helper() @@ -1708,6 +1783,21 @@ func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPICreate return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPICreateClusterTokenWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPICreateClusterTokenWithResponse), ctx, clusterId) } +// ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse mocks base method. +func (m *MockClientWithResponsesInterface) ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPIDeleteAssumeRolePrincipalResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse", ctx, clusterId) + ret0, _ := ret[0].(*sdk.ExternalClusterAPIDeleteAssumeRolePrincipalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse indicates an expected call of ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse. +func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse(ctx, clusterId interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPIDeleteAssumeRolePrincipalWithResponse), ctx, clusterId) +} + // ExternalClusterAPIDeleteClusterWithResponse mocks base method. func (m *MockClientWithResponsesInterface) ExternalClusterAPIDeleteClusterWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPIDeleteClusterResponse, error) { m.ctrl.T.Helper() @@ -1798,6 +1888,21 @@ func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPIDrainN return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIDrainNodeWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPIDrainNodeWithResponse), ctx, clusterId, nodeId, body) } +// ExternalClusterAPIGetAssumeRolePrincipalWithResponse mocks base method. +func (m *MockClientWithResponsesInterface) ExternalClusterAPIGetAssumeRolePrincipalWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPIGetAssumeRolePrincipalResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExternalClusterAPIGetAssumeRolePrincipalWithResponse", ctx, clusterId) + ret0, _ := ret[0].(*sdk.ExternalClusterAPIGetAssumeRolePrincipalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExternalClusterAPIGetAssumeRolePrincipalWithResponse indicates an expected call of ExternalClusterAPIGetAssumeRolePrincipalWithResponse. +func (mr *MockClientWithResponsesInterfaceMockRecorder) ExternalClusterAPIGetAssumeRolePrincipalWithResponse(ctx, clusterId interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExternalClusterAPIGetAssumeRolePrincipalWithResponse", reflect.TypeOf((*MockClientWithResponsesInterface)(nil).ExternalClusterAPIGetAssumeRolePrincipalWithResponse), ctx, clusterId) +} + // ExternalClusterAPIGetAssumeRoleUserWithResponse mocks base method. func (m *MockClientWithResponsesInterface) ExternalClusterAPIGetAssumeRoleUserWithResponse(ctx context.Context, clusterId string) (*sdk.ExternalClusterAPIGetAssumeRoleUserResponse, error) { m.ctrl.T.Helper() diff --git a/docs/data-sources/eks_user_arn.md b/docs/resources/eks_user_arn.md similarity index 71% rename from docs/data-sources/eks_user_arn.md rename to docs/resources/eks_user_arn.md index 5a4458e3..5e353d27 100644 --- a/docs/data-sources/eks_user_arn.md +++ b/docs/resources/eks_user_arn.md @@ -1,12 +1,12 @@ --- # generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "castai_eks_user_arn Data Source - terraform-provider-castai" +page_title: "castai_eks_user_arn Resource - terraform-provider-castai" subcategory: "" description: |- --- -# castai_eks_user_arn (Data Source) +# castai_eks_user_arn (Resource) diff --git a/docs/resources/rebalancing_schedule.md b/docs/resources/rebalancing_schedule.md index 5e84584a..527b3084 100644 --- a/docs/resources/rebalancing_schedule.md +++ b/docs/resources/rebalancing_schedule.md @@ -26,7 +26,7 @@ resource "castai_rebalancing_schedule" "spots" { node_ttl_seconds = 300 num_targeted_nodes = 3 rebalancing_min_nodes = 2 - keep_drain_timeout_nodes = true + keep_drain_timeout_nodes = false selector = jsonencode({ nodeSelectorTerms = [{ matchExpressions = [ diff --git a/examples/eks/eks_cluster_assumerole/castai.tf b/examples/eks/eks_cluster_assumerole/castai.tf index 0fd20439..c6dc42bb 100644 --- a/examples/eks/eks_cluster_assumerole/castai.tf +++ b/examples/eks/eks_cluster_assumerole/castai.tf @@ -7,7 +7,7 @@ locals { # Configure Data sources and providers required for CAST AI connection. data "aws_caller_identity" "current" {} -data "castai_eks_user_arn" "castai_user_arn" { +resource "castai_eks_user_arn" "castai_user_arn" { cluster_id = castai_eks_clusterid.cluster_id.id } diff --git a/examples/eks/eks_cluster_autoscaler_polices/castai.tf b/examples/eks/eks_cluster_autoscaler_polices/castai.tf index c0dfa756..fa5f448b 100644 --- a/examples/eks/eks_cluster_autoscaler_polices/castai.tf +++ b/examples/eks/eks_cluster_autoscaler_polices/castai.tf @@ -7,7 +7,7 @@ locals { # Configure Data sources and providers required for CAST AI connection. data "aws_caller_identity" "current" {} -data "castai_eks_user_arn" "castai_user_arn" { +resource "castai_eks_user_arn" "castai_user_arn" { cluster_id = castai_eks_clusterid.cluster_id.id } diff --git a/examples/eks/eks_cluster_custom_iam/castai.tf b/examples/eks/eks_cluster_custom_iam/castai.tf index 634e0d3f..61439fb1 100644 --- a/examples/eks/eks_cluster_custom_iam/castai.tf +++ b/examples/eks/eks_cluster_custom_iam/castai.tf @@ -3,7 +3,7 @@ # Configure Data sources and providers required for CAST AI connection. data "aws_caller_identity" "current" {} -data "castai_eks_user_arn" "castai_user_arn" { +resource "castai_eks_user_arn" "castai_user_arn" { cluster_id = castai_eks_clusterid.cluster_id.id } diff --git a/examples/eks/eks_cluster_optional_readonly/castai.tf b/examples/eks/eks_cluster_optional_readonly/castai.tf index 6ce853fa..9db32e6c 100644 --- a/examples/eks/eks_cluster_optional_readonly/castai.tf +++ b/examples/eks/eks_cluster_optional_readonly/castai.tf @@ -27,7 +27,7 @@ resource "castai_eks_cluster" "this" { assume_role_arn = var.readonly ? null: aws_iam_role.assume_role.arn } -data "castai_eks_user_arn" "castai_user_arn" { +resource "castai_eks_user_arn" "castai_user_arn" { cluster_id = castai_eks_clusterid.cluster_id.id } diff --git a/examples/eks/eks_cluster_optional_readonly/iam.tf b/examples/eks/eks_cluster_optional_readonly/iam.tf index 325997f3..156d178d 100644 --- a/examples/eks/eks_cluster_optional_readonly/iam.tf +++ b/examples/eks/eks_cluster_optional_readonly/iam.tf @@ -66,7 +66,7 @@ resource "aws_iam_role" "assume_role" { Action = "sts:AssumeRole" Effect = "Allow" Principal = { - AWS = data.castai_eks_user_arn.castai_user_arn.arn + AWS = castai_eks_user_arn.castai_user_arn.arn } Condition = { StringEquals = { diff --git a/examples/eks/eks_cluster_optional_readonly/versions.tf b/examples/eks/eks_cluster_optional_readonly/versions.tf index 70ee4499..5b2a0601 100644 --- a/examples/eks/eks_cluster_optional_readonly/versions.tf +++ b/examples/eks/eks_cluster_optional_readonly/versions.tf @@ -2,6 +2,7 @@ terraform { required_providers { castai = { source = "castai/castai" + version = "0.0.0-local" } kubernetes = { source = "hashicorp/kubernetes" diff --git a/examples/eks/eks_cluster_webshop/main.tf b/examples/eks/eks_cluster_webshop/main.tf index 86f6dacb..ee930819 100644 --- a/examples/eks/eks_cluster_webshop/main.tf +++ b/examples/eks/eks_cluster_webshop/main.tf @@ -45,7 +45,7 @@ resource "castai_eks_clusterid" "cluster_id" { cluster_name = var.cluster_name } -data "castai_eks_user_arn" "castai_user_arn" { +resource "castai_eks_user_arn" "castai_user_arn" { cluster_id = castai_eks_clusterid.cluster_id.id }