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
}