-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feat: add new OIDC credentials creation and assigment (AWS data sourc…
…e) (#759) * Feat: add new OIDC credentials creation and assigment (AWS data source) * fix integration test by adding oidc to policy * revert integration test
- Loading branch information
1 parent
5a55606
commit 008ccd8
Showing
8 changed files
with
269 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package env0 | ||
|
||
import ( | ||
"context" | ||
|
||
"github.com/env0/terraform-provider-env0/client" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||
) | ||
|
||
func dataAwsOidcCredentials() *schema.Resource { | ||
return &schema.Resource{ | ||
ReadContext: dataAwsOidcCredentialRead, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"name": { | ||
Type: schema.TypeString, | ||
Description: "the name of the aws oidc credentials", | ||
Optional: true, | ||
ExactlyOneOf: []string{"name", "id"}, | ||
}, | ||
"id": { | ||
Type: schema.TypeString, | ||
Description: "the id of the aws oidc credentials", | ||
Optional: true, | ||
ExactlyOneOf: []string{"name", "id"}, | ||
}, | ||
"oidc_sub": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Description: "the jwt oidc sub", | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func dataAwsOidcCredentialRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { | ||
var credentials client.Credentials | ||
var err error | ||
|
||
id, ok := d.GetOk("id") | ||
if ok { | ||
credentials, err = getCredentialsById(id.(string), credentialsTypeToPrefixList[AWS_OIDC_TYPE], meta) | ||
} else { | ||
credentials, err = getCredentialsByName(d.Get("name").(string), credentialsTypeToPrefixList[AWS_OIDC_TYPE], meta) | ||
} | ||
|
||
if err != nil { | ||
return DataGetFailure("aws oidc credentials", id, err) | ||
} | ||
|
||
if err := writeResourceData(&credentials, d); err != nil { | ||
return diag.Errorf("schema resource data serialization failed: %v", err) | ||
} | ||
|
||
apiClient := meta.(client.ApiClientInterface) | ||
|
||
oidcSub, err := apiClient.OidcSub() | ||
if err != nil { | ||
return diag.Errorf("failed to get oidc sub: %v", err) | ||
} | ||
|
||
d.Set("oidc_sub", oidcSub) | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
package env0 | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
"testing" | ||
|
||
"github.com/env0/terraform-provider-env0/client" | ||
"github.com/env0/terraform-provider-env0/client/http" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" | ||
) | ||
|
||
func TestAwsOidcCredentialDataSource(t *testing.T) { | ||
credentials := client.Credentials{ | ||
Id: "id0", | ||
Name: "name0", | ||
Type: string(client.AwsOidcCredentialsType), | ||
} | ||
|
||
credentialsOther1 := client.Credentials{ | ||
Id: "id1", | ||
Name: "name1", | ||
Type: string(client.AwsOidcCredentialsType), | ||
} | ||
|
||
credentialsOther2 := client.Credentials{ | ||
Id: "id2", | ||
Name: "name2", | ||
Type: string(client.AwsAssumedRoleCredentialsType), | ||
} | ||
|
||
oidcSub := "oidc sub 123345 !!!" | ||
|
||
byName := map[string]interface{}{"name": credentials.Name} | ||
byId := map[string]interface{}{"id": credentials.Id} | ||
|
||
resourceType := "env0_aws_oidc_credentials" | ||
resourceName := "test_aws_oidc_credentials" | ||
accessor := dataSourceAccessor(resourceType, resourceName) | ||
|
||
getValidTestCase := func(input map[string]interface{}) resource.TestCase { | ||
return resource.TestCase{ | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: dataSourceConfigCreate(resourceType, resourceName, input), | ||
Check: resource.ComposeAggregateTestCheckFunc( | ||
resource.TestCheckResourceAttr(accessor, "id", credentials.Id), | ||
resource.TestCheckResourceAttr(accessor, "name", credentials.Name), | ||
resource.TestCheckResourceAttr(accessor, "oidc_sub", oidcSub), | ||
), | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
getErrorTestCase := func(input map[string]interface{}, expectedError string) resource.TestCase { | ||
return resource.TestCase{ | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: dataSourceConfigCreate(resourceType, resourceName, input), | ||
ExpectError: regexp.MustCompile(expectedError), | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
mockGetCredentials := func(returnValue client.Credentials) func(mockFunc *client.MockApiClientInterface) { | ||
return func(mock *client.MockApiClientInterface) { | ||
mock.EXPECT().CloudCredentials(credentials.Id).AnyTimes().Return(returnValue, nil) | ||
mock.EXPECT().OidcSub().AnyTimes().Return(oidcSub, nil) | ||
} | ||
} | ||
|
||
mockListCredentials := func(returnValue []client.Credentials) func(mockFunc *client.MockApiClientInterface) { | ||
return func(mock *client.MockApiClientInterface) { | ||
mock.EXPECT().CloudCredentialsList().AnyTimes().Return(returnValue, nil) | ||
mock.EXPECT().OidcSub().AnyTimes().Return(oidcSub, nil) | ||
} | ||
} | ||
|
||
t.Run("by id", func(t *testing.T) { | ||
runUnitTest(t, | ||
getValidTestCase(byId), | ||
mockGetCredentials(credentials), | ||
) | ||
}) | ||
|
||
t.Run("by name", func(t *testing.T) { | ||
runUnitTest(t, | ||
getValidTestCase(byName), | ||
mockListCredentials([]client.Credentials{credentials, credentialsOther1, credentialsOther2}), | ||
) | ||
}) | ||
|
||
t.Run("throw error when no name or id is supplied", func(t *testing.T) { | ||
runUnitTest(t, | ||
getErrorTestCase(map[string]interface{}{}, "one of `id,name` must be specified"), | ||
func(mock *client.MockApiClientInterface) {}, | ||
) | ||
}) | ||
|
||
t.Run("throw error when by name and more than one is returned", func(t *testing.T) { | ||
runUnitTest(t, | ||
getErrorTestCase(byName, "found multiple credentials"), | ||
mockListCredentials([]client.Credentials{credentials, credentialsOther1, credentialsOther2, credentials}), | ||
) | ||
}) | ||
|
||
t.Run("Throw error when by name and not found", func(t *testing.T) { | ||
runUnitTest(t, | ||
getErrorTestCase(byName, "not found"), | ||
mockListCredentials([]client.Credentials{credentialsOther1, credentialsOther2}), | ||
) | ||
}) | ||
|
||
t.Run("Throw error when by id and not found", func(t *testing.T) { | ||
runUnitTest(t, | ||
getErrorTestCase(byId, fmt.Sprintf("id %s not found", credentials.Id)), | ||
func(mock *client.MockApiClientInterface) { | ||
mock.EXPECT().CloudCredentials(credentials.Id).AnyTimes().Return(client.Credentials{}, http.NewMockFailedResponseError(404)) | ||
}, | ||
) | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
examples/data-sources/env0_aws_oidc_credentials/data-source.tf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
resource "env0_aws_oidc_credentials" "example" { | ||
name = "name" | ||
role_arn = "role_arn" | ||
} | ||
|
||
data "env0_aws_oidc_credentials" "by_id" { | ||
id = env0_aws_oidc_credentials.example.id | ||
} | ||
|
||
data "env0_aws_oidc_credentials" "by_name" { | ||
name = env0_aws_oidc_credentials.example.name | ||
} | ||
|
||
output "oidc_sub" { | ||
value = data.env0_aws_oidc_credentials.by_name.oidc_sub | ||
} |