From 7e6016a04113ed67607b8d0a9e352cd74900eac8 Mon Sep 17 00:00:00 2001 From: Ilia Medvedev Date: Thu, 9 Jan 2025 15:45:39 +0200 Subject: [PATCH] add codefresh_current_account_user data source to get users by name or email in current account --- codefresh/data_current_account_user.go | 87 ++++++++++++++++++++++++++ codefresh/provider.go | 1 + 2 files changed, 88 insertions(+) create mode 100644 codefresh/data_current_account_user.go diff --git a/codefresh/data_current_account_user.go b/codefresh/data_current_account_user.go new file mode 100644 index 00000000..93b516ef --- /dev/null +++ b/codefresh/data_current_account_user.go @@ -0,0 +1,87 @@ +package codefresh + +import ( + "fmt" + + "github.com/codefresh-io/terraform-provider-codefresh/codefresh/cfclient" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func dataSourceCurrentAccountUser() *schema.Resource { + return &schema.Resource{ + Description: "Returns a user the current Codefresh account by name or email.", + Read: dataSourceCurrentAccountUserRead, + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + ExactlyOneOf: []string{"name", "email"}, + Optional: true, + }, + "email": { + Type: schema.TypeString, + ExactlyOneOf: []string{"name", "email"}, + Optional: true, + }, + }, + } +} + +func dataSourceCurrentAccountUserRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*cfclient.Client) + var currentAccount *cfclient.CurrentAccount + var err error + + currentAccount, err = client.GetCurrentAccount() + + if err != nil { + return err + } + + if currentAccount == nil { + return fmt.Errorf("data.codefresh_current_account - failed to get current_account") + } + + var ( + userAttributeName string + userAttributeValue string + ) + + if _email, _emailOk := d.GetOk("email"); _emailOk { + userAttributeName = "email" + userAttributeValue = _email.(string) + } else if _name, _nameOk := d.GetOk("name"); _nameOk { + userAttributeName = "name" + userAttributeValue = _name.(string) + } else { + return fmt.Errorf("data.codefresh_current_account_user - must specify name or email") + } + + return mapDataCurrentAccountUserToResource(currentAccount, d, userAttributeName, userAttributeValue) + +} + +func mapDataCurrentAccountUserToResource(currentAccount *cfclient.CurrentAccount, d *schema.ResourceData, userAttributeName string, userAttributeValue string) error { + + if currentAccount == nil || currentAccount.ID == "" { + return fmt.Errorf("data.codefresh_current_account - failed to mapDataCurrentAccountUserToResource no id for current account set") + } + + isFound := false + + + for _, user := range currentAccount.Users { + if (userAttributeName == "name" && user.UserName == userAttributeValue) || (userAttributeName == "email" && user.Email == userAttributeValue) { + isFound = true + d.SetId(user.ID) + d.Set("name", user.UserName) + d.Set("email", user.Email) + break + } + } + + if !isFound { + return fmt.Errorf("data.codefresh_current_account_user - cannot find user with %s %s", userAttributeName, userAttributeValue) + } + + return nil +} diff --git a/codefresh/provider.go b/codefresh/provider.go index fb30cad3..fafc1fa1 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_current_account_user": dataSourceCurrentAccountUser(), }, ResourcesMap: map[string]*schema.Resource{ "codefresh_account": resourceAccount(),