diff --git a/codefresh/data_service_account.go b/codefresh/data_service_account.go new file mode 100644 index 00000000..b9480e46 --- /dev/null +++ b/codefresh/data_service_account.go @@ -0,0 +1,85 @@ +package codefresh + +import ( + "fmt" + + cfClient "github.com/codefresh-io/terraform-provider-codefresh/codefresh/cfclient" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func dataSourceServiceAccount() *schema.Resource { + return &schema.Resource{ + Description: "This data source retrieves a Codefresh service account by its ID or name.", + Read: dataSourceServiceAccountRead, + Schema: map[string]*schema.Schema{ + "_id": { + Type: schema.TypeString, + Optional: true, + }, + "name": { + Description: "Service account name", + Type: schema.TypeString, + Optional: true, + AtLeastOneOf: []string{"_id", "name"}, + }, + "assign_admin_role": { + Description: "Whether or not account admin role is assigned to the service account", + Type: schema.TypeBool, + Optional: true, + }, + "assigned_teams": { + Description: "A list of team IDs the service account is be assigned to", + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + } +} + +func dataSourceServiceAccountRead(d *schema.ResourceData, meta interface{}) error { + + client := meta.(*cfClient.Client) + var serviceAccount *cfClient.ServiceUser + var err error + + if _id, _idOk := d.GetOk("_id"); _idOk { + serviceAccount, err = client.GetServiceUserByID(_id.(string)) + } else if name, nameOk := d.GetOk("name"); nameOk { + serviceAccount, err = client.GetServiceUserByName(name.(string)) + } + + if err != nil { + return err + } + + if serviceAccount == nil { + return fmt.Errorf("data.codefresh_service_account - cannot find service account") + } + + return mapDataServiceAccountToResource(serviceAccount, d) + +} + +func mapDataServiceAccountToResource(serviceAccount *cfClient.ServiceUser, d *schema.ResourceData) error { + + if serviceAccount == nil || serviceAccount.ID == "" { + return fmt.Errorf("data.codefresh_service_account - failed to mapDataServiceAccountToResource") + } + + d.SetId(serviceAccount.ID) + d.Set("name", serviceAccount.Name) + d.Set("assign_admin_role", serviceAccount.HasAdminRole()) + + teamIds := []string{} + + for _, team := range serviceAccount.Teams { + teamIds = append(teamIds, team.ID) + } + + d.Set("assigned_teams", teamIds) + + return nil +} diff --git a/codefresh/provider.go b/codefresh/provider.go index e08d7a99..1121ccdb 100644 --- a/codefresh/provider.go +++ b/codefresh/provider.go @@ -53,6 +53,7 @@ func Provider() *schema.Provider { "codefresh_account_idp": dataSourceAccountIdp(), "codefresh_project": dataSourceProject(), "codefresh_account_gitops_settings": dataSourceAccountGitopsSettings(), + "codefresh_service_account": dataSourceServiceAccount(), }, ResourcesMap: map[string]*schema.Resource{ "codefresh_account": resourceAccount(), diff --git a/codefresh/resource_service_account.go b/codefresh/resource_service_account.go index 3347ca61..91d94ed2 100644 --- a/codefresh/resource_service_account.go +++ b/codefresh/resource_service_account.go @@ -140,14 +140,6 @@ func mapServiceAccountToResource(serviceAccount *cfclient.ServiceUser, d *schema return nil } -func flattenServiceAccountTeams(users []cfclient.TeamUser) []string { - res := []string{} - for _, user := range users { - res = append(res, user.ID) - } - return res -} - func mapResourceToServiceAccount(d *schema.ResourceData) *cfclient.ServiceUserCreateUpdate { return &cfclient.ServiceUserCreateUpdate{ diff --git a/docs/data-sources/service_account.md b/docs/data-sources/service_account.md new file mode 100644 index 00000000..7f3d625e --- /dev/null +++ b/docs/data-sources/service_account.md @@ -0,0 +1,29 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "codefresh_service_account Data Source - terraform-provider-codefresh" +subcategory: "" +description: |- + This data source retrieves a Codefresh service account by its ID or name. +--- + +# codefresh_service_account (Data Source) + +This data source retrieves a Codefresh service account by its ID or name. + + + + +## Schema + +### Optional + +- `_id` (String) +- `assign_admin_role` (Boolean) Whether or not account admin role is assigned to the service account +- `assigned_teams` (Set of String) A list of team IDs the service account is be assigned to +- `name` (String) Service account name + +### Read-Only + +- `id` (String) The ID of this resource. + +