github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/opsgenie/resource_opsgenie_team.go (about)

     1  package opsgenie
     2  
     3  import (
     4  	"log"
     5  
     6  	"fmt"
     7  	"strings"
     8  
     9  	"regexp"
    10  
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  	"github.com/opsgenie/opsgenie-go-sdk/team"
    13  )
    14  
    15  func resourceOpsGenieTeam() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceOpsGenieTeamCreate,
    18  		Read:   resourceOpsGenieTeamRead,
    19  		Update: resourceOpsGenieTeamUpdate,
    20  		Delete: resourceOpsGenieTeamDelete,
    21  		Importer: &schema.ResourceImporter{
    22  			State: schema.ImportStatePassthrough,
    23  		},
    24  		Schema: map[string]*schema.Schema{
    25  			"name": {
    26  				Type:         schema.TypeString,
    27  				Required:     true,
    28  				ValidateFunc: validateOpsGenieTeamName,
    29  			},
    30  			"description": {
    31  				Type:     schema.TypeString,
    32  				Optional: true,
    33  			},
    34  			"member": {
    35  				Type:     schema.TypeList,
    36  				Optional: true,
    37  				Elem: &schema.Resource{
    38  					Schema: map[string]*schema.Schema{
    39  						"username": {
    40  							Type:     schema.TypeString,
    41  							Required: true,
    42  						},
    43  
    44  						"role": {
    45  							Type:         schema.TypeString,
    46  							Optional:     true,
    47  							Default:      "user",
    48  							ValidateFunc: validateOpsGenieTeamRole,
    49  						},
    50  					},
    51  				},
    52  			},
    53  		},
    54  	}
    55  }
    56  
    57  func resourceOpsGenieTeamCreate(d *schema.ResourceData, meta interface{}) error {
    58  	client := meta.(*OpsGenieClient).teams
    59  
    60  	name := d.Get("name").(string)
    61  	description := d.Get("description").(string)
    62  
    63  	createRequest := team.CreateTeamRequest{
    64  		Name:        name,
    65  		Description: description,
    66  		Members:     expandOpsGenieTeamMembers(d),
    67  	}
    68  
    69  	log.Printf("[INFO] Creating OpsGenie team '%s'", name)
    70  
    71  	createResponse, err := client.Create(createRequest)
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	err = checkOpsGenieResponse(createResponse.Code, createResponse.Status)
    77  	if err != nil {
    78  		return err
    79  	}
    80  
    81  	getRequest := team.GetTeamRequest{
    82  		Name: name,
    83  	}
    84  
    85  	getResponse, err := client.Get(getRequest)
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	d.SetId(getResponse.Id)
    91  
    92  	return resourceOpsGenieTeamRead(d, meta)
    93  }
    94  
    95  func resourceOpsGenieTeamRead(d *schema.ResourceData, meta interface{}) error {
    96  	client := meta.(*OpsGenieClient).teams
    97  
    98  	listRequest := team.ListTeamsRequest{}
    99  	listResponse, err := client.List(listRequest)
   100  	if err != nil {
   101  		return err
   102  	}
   103  
   104  	var found *team.GetTeamResponse
   105  	for _, team := range listResponse.Teams {
   106  		if team.Id == d.Id() {
   107  			found = &team
   108  			break
   109  		}
   110  	}
   111  
   112  	if found == nil {
   113  		d.SetId("")
   114  		log.Printf("[INFO] Team %q not found. Removing from state", d.Get("name").(string))
   115  		return nil
   116  	}
   117  
   118  	getRequest := team.GetTeamRequest{
   119  		Id: d.Id(),
   120  	}
   121  
   122  	getResponse, err := client.Get(getRequest)
   123  	if err != nil {
   124  		return err
   125  	}
   126  
   127  	d.Set("name", getResponse.Name)
   128  	d.Set("description", getResponse.Description)
   129  	d.Set("member", flattenOpsGenieTeamMembers(getResponse.Members))
   130  
   131  	return nil
   132  }
   133  
   134  func resourceOpsGenieTeamUpdate(d *schema.ResourceData, meta interface{}) error {
   135  	client := meta.(*OpsGenieClient).teams
   136  	name := d.Get("name").(string)
   137  	description := d.Get("description").(string)
   138  
   139  	updateRequest := team.UpdateTeamRequest{
   140  		Id:          d.Id(),
   141  		Name:        name,
   142  		Description: description,
   143  		Members:     expandOpsGenieTeamMembers(d),
   144  	}
   145  
   146  	log.Printf("[INFO] Updating OpsGenie team '%s'", name)
   147  
   148  	updateResponse, err := client.Update(updateRequest)
   149  	if err != nil {
   150  		return err
   151  	}
   152  
   153  	err = checkOpsGenieResponse(updateResponse.Code, updateResponse.Status)
   154  	if err != nil {
   155  		return err
   156  	}
   157  
   158  	return nil
   159  }
   160  
   161  func resourceOpsGenieTeamDelete(d *schema.ResourceData, meta interface{}) error {
   162  	log.Printf("[INFO] Deleting OpsGenie team '%s'", d.Get("name").(string))
   163  	client := meta.(*OpsGenieClient).teams
   164  
   165  	deleteRequest := team.DeleteTeamRequest{
   166  		Id: d.Id(),
   167  	}
   168  
   169  	_, err := client.Delete(deleteRequest)
   170  	if err != nil {
   171  		return err
   172  	}
   173  
   174  	return nil
   175  }
   176  
   177  func flattenOpsGenieTeamMembers(input []team.Member) []interface{} {
   178  	members := make([]interface{}, 0, len(input))
   179  	for _, inputMember := range input {
   180  		outputMember := make(map[string]interface{})
   181  		outputMember["username"] = inputMember.User
   182  		outputMember["role"] = inputMember.Role
   183  
   184  		members = append(members, outputMember)
   185  	}
   186  
   187  	return members
   188  }
   189  
   190  func expandOpsGenieTeamMembers(d *schema.ResourceData) []team.Member {
   191  	input := d.Get("member").([]interface{})
   192  
   193  	members := make([]team.Member, 0, len(input))
   194  	if input == nil {
   195  		return members
   196  	}
   197  
   198  	for _, v := range input {
   199  		config := v.(map[string]interface{})
   200  
   201  		username := config["username"].(string)
   202  		role := config["role"].(string)
   203  
   204  		member := team.Member{
   205  			User: username,
   206  			Role: role,
   207  		}
   208  
   209  		members = append(members, member)
   210  	}
   211  
   212  	return members
   213  }
   214  
   215  func validateOpsGenieTeamName(v interface{}, k string) (ws []string, errors []error) {
   216  	value := v.(string)
   217  	if !regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString(value) {
   218  		errors = append(errors, fmt.Errorf(
   219  			"only alpha numeric characters and underscores are allowed in %q: %q", k, value))
   220  	}
   221  
   222  	if len(value) >= 100 {
   223  		errors = append(errors, fmt.Errorf("%q cannot be longer than 100 characters: %q %d", k, value, len(value)))
   224  	}
   225  
   226  	return
   227  }
   228  
   229  func validateOpsGenieTeamRole(v interface{}, k string) (ws []string, errors []error) {
   230  	value := strings.ToLower(v.(string))
   231  	families := map[string]bool{
   232  		"admin": true,
   233  		"user":  true,
   234  	}
   235  
   236  	if !families[value] {
   237  		errors = append(errors, fmt.Errorf("OpsGenie Team Role can only be 'Admin' or 'User'"))
   238  	}
   239  
   240  	return
   241  }