Skip to content

Commit

Permalink
feat: add organization_members resource (#221)
Browse files Browse the repository at this point in the history
Co-authored-by: Marcin Kaciuba <marcin.kaciuba@gmail.com>
  • Loading branch information
davex98 and aldor007 authored Sep 6, 2023
1 parent 4103e55 commit db2c6f0
Show file tree
Hide file tree
Showing 14 changed files with 1,175 additions and 2 deletions.
57 changes: 57 additions & 0 deletions castai/data_source_organization.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package castai

import (
"context"
"fmt"

"github.com/castai/terraform-provider-castai/castai/sdk"
"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"
)

const (
FieldOrganizationName = "name"
)

func dataSourceOrganization() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceOrganizationRead,
Description: "Retrieve organization ID",
Schema: map[string]*schema.Schema{
FieldOrganizationName: {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotWhiteSpace),
},
},
}
}

func dataSourceOrganizationRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*ProviderConfig).api

resp, err := client.ListOrganizationsWithResponse(ctx)
if err := sdk.CheckOKResponse(resp, err); err != nil {
return diag.FromErr(fmt.Errorf("retrieving organizations: %w", err))
}

organizationName := data.Get(FieldOrganizationName).(string)

var organizationID string
for _, organization := range resp.JSON200.Organizations {
if organizationName == organization.Name {
organizationID = *organization.Id
break
}
}

if organizationID == "" {
return diag.FromErr(fmt.Errorf("organization %s not found", organizationName))
}

data.SetId(organizationID)

return nil
}
113 changes: 113 additions & 0 deletions castai/data_source_organization_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package castai

import (
"bytes"
"context"
"io"
"net/http"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"

"github.com/castai/terraform-provider-castai/castai/sdk"
mock_sdk "github.com/castai/terraform-provider-castai/castai/sdk/mock"
"github.com/golang/mock/gomock"
"github.com/hashicorp/go-cty/cty"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/stretchr/testify/require"
)

func TestOrganizationDataSourceRead(t *testing.T) {
t.Parallel()

r := require.New(t)
mockClient := mock_sdk.NewMockClientInterface(gomock.NewController(t))

ctx := context.Background()
provider := &ProviderConfig{
api: &sdk.ClientWithResponses{
ClientInterface: mockClient,
},
}

body := io.NopCloser(bytes.NewReader([]byte(`{
"organizations": [
{
"id": "id-1",
"name": "Test 1",
"createdAt": "2023-04-18T16:03:18.800099Z",
"role": "owner"
},
{
"id": "id-2",
"name": "Test 2",
"createdAt": "2023-09-04T05:45:51.000552Z",
"role": "owner"
}
]
}`)))

mockClient.EXPECT().
ListOrganizations(gomock.Any()).
Return(&http.Response{StatusCode: 200, Body: body, Header: map[string][]string{"Content-Type": {"json"}}}, nil)

state := terraform.NewInstanceStateShimmedFromValue(cty.ObjectVal(map[string]cty.Value{}), 0)

resource := dataSourceOrganization()
data := resource.Data(state)
r.NoError(data.Set("name", "Test 1"))

result := resource.ReadContext(ctx, data, provider)
r.Nil(result)
r.False(result.HasError())
r.Equal(`ID = id-1
name = Test 1
Tainted = false
`, data.State().String())
}

func TestOrganizationDataSourceReadError(t *testing.T) {
t.Parallel()

r := require.New(t)
mockClient := mock_sdk.NewMockClientInterface(gomock.NewController(t))

ctx := context.Background()
provider := &ProviderConfig{
api: &sdk.ClientWithResponses{
ClientInterface: mockClient,
},
}

body := io.NopCloser(bytes.NewReader([]byte(`{
"organizations": [
{
"id": "id-1",
"name": "Test 1",
"createdAt": "2023-04-18T16:03:18.800099Z",
"role": "owner"
},
{
"id": "id-2",
"name": "Test 2",
"createdAt": "2023-09-04T05:45:51.000552Z",
"role": "owner"
}
]
}`)))

mockClient.EXPECT().
ListOrganizations(gomock.Any()).
Return(&http.Response{StatusCode: 200, Body: body, Header: map[string][]string{"Content-Type": {"json"}}}, nil)

state := terraform.NewInstanceStateShimmedFromValue(cty.ObjectVal(map[string]cty.Value{}), 0)

resource := dataSourceOrganization()
data := resource.Data(state)
r.NoError(data.Set("name", "non-existent"))

result := resource.ReadContext(ctx, data, provider)
r.True(result.HasError())
r.Equal("organization non-existent not found", result[0].Summary)
r.Equal(diag.Error, result[0].Severity)
}
3 changes: 3 additions & 0 deletions castai/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package castai
import (
"context"
"fmt"

"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"
Expand Down Expand Up @@ -45,11 +46,13 @@ func Provider(version string) *schema.Provider {
"castai_node_configuration_default": resourceNodeConfigurationDefault(),
"castai_eks_user_arn": resourceEKSClusterUserARN(),
"castai_reservations": resourceReservations(),
"castai_organization_members": resourceOrganizationMembers(),
},

DataSourcesMap: map[string]*schema.Resource{
"castai_eks_settings": dataSourceEKSSettings(),
"castai_gke_user_policies": dataSourceGKEPolicies(),
"castai_organization": dataSourceOrganization(),

// TODO: remove in next major release
"castai_eks_user_arn": dataSourceEKSClusterUserARN(),
Expand Down
Loading

0 comments on commit db2c6f0

Please sign in to comment.