Skip to content
This repository has been archived by the owner on Jun 27, 2021. It is now read-only.

Group member: update role #33

Merged
merged 8 commits into from
Oct 17, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 3 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,16 @@ services:
- docker
language: go
go:
- 1.9
- 1.9
- 1.11

before_install:
# Setup dependency management tool
- curl -L -s https://github.com/golang/dep/releases/download/v0.4.1/dep-linux-amd64 -o $GOPATH/bin/dep
- chmod +x $GOPATH/bin/dep

install:
- go get github.com/hashicorp/terraform
- dep ensure

script:
- 'if [ "${TRAVIS_BUILD_DIR}" != "${GOPATH}/src/github.com/DeviaVir/terraform-provider-gsuite" ]; then ln -s "${TRAVIS_BUILD_DIR}" "${GOPATH}/src/github.com/DeviaVir/terraform-provider-gsuite"; fi'
- dep ensure -v
- make test
- make
14 changes: 13 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ GOVERSION := 1.9.3
PROJECT := $(CURRENT_DIR:$(GOPATH)/src/%=%)
OWNER := $(notdir $(patsubst %/,%,$(dir $(PROJECT))))
NAME := $(notdir $(PROJECT))
VERSION := 0.1.8
VERSION := 0.1.9
EXTERNAL_TOOLS = \
github.com/golang/dep/cmd/dep

Expand Down Expand Up @@ -116,6 +116,18 @@ else
endif
.PHONY: dist

# sign in case you were unable to sign during dist
sign:
ifndef GPG_KEY
@echo "==> ERROR: No GPG key specified! Without a GPG key, this release cannot"
@echo " be signed. Set the environment variable GPG_KEY to the ID of"
@echo " the GPG key to continue."
@exit 127
else
@$(MAKE) -f "${MKFILE_PATH}" _compress _checksum _sign
endif
.PHONY: sign

# _cleanup removes any previous binaries
_cleanup:
@rm -rf "${CURRENT_DIR}/pkg/"
Expand Down
18 changes: 12 additions & 6 deletions gsuite/resource_group_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,11 @@ func resourceGroupMemberCreate(d *schema.ResourceData, meta interface{}) error {
})

if err != nil {
return fmt.Errorf("Error creating group member: %s", err)
return fmt.Errorf("error creating group member: %s", err)
}

d.SetId(createdGroupMember.Id)
log.Printf("[INFO] Created group: %s", createdGroupMember.Email)
log.Printf("[INFO] Created group member: %s", createdGroupMember.Email)
return resourceGroupMemberRead(d, meta)
}

Expand All @@ -100,10 +100,15 @@ func resourceGroupMemberUpdate(d *schema.ResourceData, meta interface{}) error {
nullFields := []string{}

if d.HasChange("email") {
log.Printf("[DEBUG] Updating groupMember email: %s", d.Get("email").(string))
log.Printf("[DEBUG] Updating groupMember email (recreating member): %s", d.Get("email").(string))
groupMember.Email = strings.ToLower(d.Get("email").(string))
}

if d.HasChange("role") {
log.Printf("[DEBUG] Updating groupMember role: %s to %s", d.Get("email").(string), d.Get("role").(string))
groupMember.Role = strings.ToUpper(d.Get("role").(string))
}

if len(nullFields) > 0 {
groupMember.NullFields = nullFields
}
Expand All @@ -116,7 +121,7 @@ func resourceGroupMemberUpdate(d *schema.ResourceData, meta interface{}) error {
})

if err != nil {
return fmt.Errorf("Error updating group member: %s", err)
return fmt.Errorf("error updating group member: %s", err)
}

log.Printf("[INFO] Updated groupMember: %s", updatedGroupMember.Email)
Expand All @@ -138,6 +143,7 @@ func resourceGroupMemberRead(d *schema.ResourceData, meta interface{}) error {
}

d.SetId(groupMember.Id)
d.Set("role", strings.ToUpper(groupMember.Role))
d.Set("email", strings.ToLower(groupMember.Email))
d.Set("etag", groupMember.Etag)
d.Set("kind", groupMember.Kind)
Expand Down Expand Up @@ -173,14 +179,14 @@ func resourceGroupMemberImporter(d *schema.ResourceData, meta interface{}) ([]*s
}

if len(s) < 2 {
return nil, fmt.Errorf("Import via [group]:[member email] or [group]/[member email]!")
return nil, fmt.Errorf("import via [group]:[member email] or [group]/[member email]")
}
group, member := strings.ToLower(s[0]), strings.ToLower(s[1])

id, err := config.directory.Members.Get(group, member).Do()

if err != nil {
return nil, fmt.Errorf("Error fetching member. Make sure the member exists: %s ", err)
return nil, fmt.Errorf("error fetching member, make sure the member exists: %s ", err)
}

d.SetId(id.Id)
Expand Down
27 changes: 12 additions & 15 deletions gsuite/resource_group_members.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func resourceGroupMembersRead(d *schema.ResourceData, meta interface{}) error {

groupEmail := d.Id()

members, err := getApiMembers(groupEmail, config)
members, err := getAPIMembers(groupEmail, config)

if err != nil {
return err
Expand Down Expand Up @@ -79,8 +79,8 @@ func resourceGroupMembersDelete(d *schema.ResourceData, meta interface{}) error
log.Printf("[DEBUG]: Deleting gsuite_group_members")
config := meta.(*Config)

for _, raw_member := range d.Get("member").(*schema.Set).List() {
member := raw_member.(map[string]interface{})
for _, rawMember := range d.Get("member").(*schema.Set).List() {
member := rawMember.(map[string]interface{})
deleteMember(member["email"].(string), d.Id(), config)
}

Expand Down Expand Up @@ -110,8 +110,8 @@ func membersToCfg(members []*directory.Member) []map[string]interface{} {
}

func resourceMembers(d *schema.ResourceData) (members []map[string]interface{}) {
for _, raw_member := range d.Get("member").(*schema.Set).List() {
member := raw_member.(map[string]interface{})
for _, rawMember := range d.Get("member").(*schema.Set).List() {
member := rawMember.(map[string]interface{})
members = append(members, member)
}
return members
Expand All @@ -125,7 +125,7 @@ func createOrUpdateGroupMembers(d *schema.ResourceData, meta interface{}) (strin
cfgMembers := resourceMembers(d)

// Get members from API
apiMembers, err := getApiMembers(groupEmail, config)
apiMembers, err := getAPIMembers(groupEmail, config)
if err != nil {
return groupEmail, fmt.Errorf("Error updating memberships: %v", err)
}
Expand Down Expand Up @@ -203,7 +203,7 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
}

// Upsert memberships which are present in the config, but not in the api
for email, _ := range cfgMap {
for email := range cfgMap {
err := upsertMember(email, gid, cfgMap[email]["role"].(string), config)
if err != nil {
return err
Expand All @@ -213,7 +213,7 @@ func reconcileMembers(d *schema.ResourceData, cfgMembers, apiMembers []map[strin
}

// Retrieve a group's members from the API
func getApiMembers(groupEmail string, config *Config) ([]*directory.Member, error) {
func getAPIMembers(groupEmail string, config *Config) ([]*directory.Member, error) {
// Get members from the API
groupMembers := make([]*directory.Member, 0)
token := ""
Expand All @@ -239,6 +239,7 @@ func getApiMembers(groupEmail string, config *Config) ([]*directory.Member, erro
}

func upsertMember(email, groupEmail, role string, config *Config) error {
var err error
groupMember := &directory.Member{
Role: strings.ToUpper(role),
Email: strings.ToLower(email),
Expand All @@ -247,10 +248,8 @@ func upsertMember(email, groupEmail, role string, config *Config) error {
// Check if the email address belongs to a user, or to a group
// we need to make sure, because we need to use different logic
var isGroup bool
var group *directory.Group
var err error
err = retry(func() error {
group, err = config.directory.Groups.Get(email).Do()
_, err := config.directory.Groups.Get(email).Do()
return err
})
isGroup = true
Expand All @@ -264,10 +263,8 @@ func upsertMember(email, groupEmail, role string, config *Config) error {
}

// Grab the group as a directory member of the current group
var currentMember *directory.Member
var err error
err = retry(func() error {
currentMember, err = config.directory.Members.Get(groupEmail, email).Do()
_, err := config.directory.Members.Get(groupEmail, email).Do()
return err
})

Expand Down Expand Up @@ -309,7 +306,7 @@ func upsertMember(email, groupEmail, role string, config *Config) error {
// When a user does not exist, the API returns a 400 "memberKey, required"
// Returning a friendly message
if gerr, ok := err.(*googleapi.Error); ok && (gerr.Errors[0].Reason == "required" && gerr.Code == 400) {
return fmt.Errorf("Error adding groupMember %s. Please make sure the user exists beforehand.", email)
return fmt.Errorf("error adding groupMember %s, please make sure the user exists beforehand", email)
}
return err
})
Expand Down