-
Notifications
You must be signed in to change notification settings - Fork 135
Add new resource opsgenie_team_membership, refs #65 #156
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
234637a
cbcbd5f
243a9ad
db3bf85
d747a0b
32844c4
2a7257a
73cf15e
80d2334
4e5f806
213ac5c
fdf87cc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
name: test | ||
on: | ||
push: | ||
branches: [ master ] | ||
pull_request: | ||
branches: [ master ] | ||
jobs: | ||
ci-test: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- | ||
name: Checkout | ||
uses: actions/checkout@v2 | ||
- | ||
name: Unshallow | ||
run: git fetch --prune --unshallow | ||
- | ||
name: Set up Go | ||
uses: actions/setup-go@v2 | ||
with: | ||
go-version: 1.14 | ||
- | ||
name: fmt check | ||
run: make fmtcheck | ||
|
||
- | ||
name: Test GoReleaser | ||
uses: goreleaser/goreleaser-action@v2 | ||
with: | ||
version: latest | ||
args: build --skip-validate --rm-dist |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
package opsgenie | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||
"github.com/opsgenie/opsgenie-go-sdk-v2/team" | ||
"log" | ||
"strings" | ||
) | ||
|
||
func resourceOpsGenieTeamMembership() *schema.Resource { //TODO encode the e-mail addrs (e.g. because of +)? https://github.com/opsgenie/opsgenie-go-sdk-v2/issues/62 | ||
return &schema.Resource{ | ||
Create: resourceOpsGenieTeamMembershipCreate, | ||
Read: handleNonExistentResource(resourceOpsGenieTeamMembershipRead), | ||
//Update: resourceOpsGenieTeamMembershipUpdate, // requires https://github.com/opsgenie/opsgenie-go-sdk-v2/issues/59 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I didn't quite understand the issue in go-sdk can you describe the issue There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's no way to update a member ship with go-sdk, that's why don't support it here too. Updating a membership would only involve changing a role without removing+adding the user from the team. |
||
Delete: resourceOpsGenieTeamMembershipDelete, | ||
Importer: &schema.ResourceImporter{ | ||
State: schema.ImportStatePassthrough, | ||
}, | ||
Schema: map[string]*schema.Schema{ | ||
"user_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
"role": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Default: "user", | ||
ForceNew: true, | ||
}, | ||
"team_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceOpsGenieTeamMembershipCreate(d *schema.ResourceData, meta interface{}) error { | ||
|
||
userID := d.Get("user_id").(string) | ||
role := d.Get("role").(string) | ||
teamID := d.Get("team_id").(string) | ||
|
||
log.Printf("[INFO] Adding user %q to team %q", teamID, userID) | ||
|
||
client, err := team.NewClient(meta.(*OpsgenieClient).client.Config) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// add member to team | ||
_, err = client.AddMember(context.Background(), &team.AddTeamMemberRequest{ | ||
TeamIdentifierType: team.Id, | ||
TeamIdentifierValue: teamID, | ||
User: team.User{ | ||
ID: userID, | ||
}, | ||
Role: role, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
d.SetId(buildTwoPartID(teamID, userID)) | ||
|
||
return resourceOpsGenieTeamMembershipRead(d, meta) | ||
} | ||
|
||
func resourceOpsGenieTeamMembershipRead(d *schema.ResourceData, meta interface{}) error { | ||
|
||
teamID, userID, err := parseTwoPartID(d.Id(), "teamID", "userID") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
getRequest := &team.GetTeamRequest{ | ||
IdentifierType: team.Id, | ||
IdentifierValue: teamID, | ||
} | ||
|
||
log.Printf("[INFO] Retrieving membership of user %q in team %q", userID, teamID) | ||
|
||
client, err := team.NewClient(meta.(*OpsgenieClient).client.Config) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
getResponse, err := client.Get(context.Background(), getRequest) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
role, err := getUserRole(userID, teamID, getResponse.Members) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
d.Set("user_id", userID) | ||
d.Set("role", role) | ||
d.Set("team_id", teamID) | ||
|
||
return nil | ||
} | ||
|
||
func resourceOpsGenieTeamMembershipDelete(d *schema.ResourceData, meta interface{}) error { | ||
userID := d.Get("user_id").(string) | ||
teamID := d.Get("team_id").(string) | ||
|
||
log.Printf("[INFO] Deleting membership of user %q in team %q", userID, teamID) | ||
|
||
client, err := team.NewClient(meta.(*OpsgenieClient).client.Config) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
_, err = client.RemoveMember(context.Background(), &team.RemoveTeamMemberRequest{ | ||
TeamIdentifierType: team.Id, | ||
TeamIdentifierValue: teamID, | ||
MemberIdentifierType: team.Id, | ||
arnisoph marked this conversation as resolved.
Show resolved
Hide resolved
|
||
MemberIdentifierValue: userID, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func getUserRole(userID string, teamID string, input []team.Member) (string, error) { | ||
role := "" | ||
|
||
for _, inputMember := range input { | ||
if inputMember.User.ID == userID { | ||
role = inputMember.Role | ||
return role, nil | ||
} | ||
} | ||
|
||
return "", fmt.Errorf("did not found user %q in team %q (%#v)", userID, teamID, input) | ||
} | ||
|
||
// format the strings into an id `a:b` | ||
func buildTwoPartID(a, b string) string { | ||
return fmt.Sprintf("%s:%s", a, b) | ||
} | ||
|
||
// return the pieces of id `left:right` as left, right | ||
func parseTwoPartID(id, left, right string) (string, string, error) { | ||
parts := strings.SplitN(id, ":", 2) | ||
if len(parts) != 2 { | ||
return "", "", fmt.Errorf("unexpected ID format %q, expected %s:%s", id, left, right) | ||
} | ||
|
||
return parts[0], parts[1], nil | ||
} |
Uh oh!
There was an error while loading. Please reload this page.