github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/pagerduty/structure.go (about)

     1  package pagerduty
     2  
     3  import pagerduty "github.com/PagerDuty/go-pagerduty"
     4  
     5  // Expands an array of escalation rules into []pagerduty.EscalationRules
     6  func expandEscalationRules(list []interface{}) []pagerduty.EscalationRule {
     7  	result := make([]pagerduty.EscalationRule, 0, len(list))
     8  
     9  	for _, r := range list {
    10  		rule := r.(map[string]interface{})
    11  
    12  		escalationRule := &pagerduty.EscalationRule{
    13  			Delay: uint(rule["escalation_delay_in_minutes"].(int)),
    14  		}
    15  
    16  		for _, t := range rule["target"].([]interface{}) {
    17  			target := t.(map[string]interface{})
    18  			escalationRule.Targets = append(
    19  				escalationRule.Targets,
    20  				pagerduty.APIObject{
    21  					ID:   target["id"].(string),
    22  					Type: target["type"].(string),
    23  				},
    24  			)
    25  		}
    26  
    27  		result = append(result, *escalationRule)
    28  
    29  	}
    30  
    31  	return result
    32  }
    33  
    34  // Flattens an array of []pagerduty.EscalationRule into a map[string]interface{}
    35  func flattenEscalationRules(list []pagerduty.EscalationRule) []map[string]interface{} {
    36  	result := make([]map[string]interface{}, 0, len(list))
    37  
    38  	for _, i := range list {
    39  		r := make(map[string]interface{})
    40  		r["id"] = i.ID
    41  		r["escalation_delay_in_minutes"] = i.Delay
    42  
    43  		if len(i.Targets) > 0 {
    44  			targets := make([]map[string]interface{}, 0, len(i.Targets))
    45  			for _, t := range i.Targets {
    46  				targets = append(targets, map[string]interface{}{
    47  					"id":   t.ID,
    48  					"type": t.Type,
    49  				})
    50  			}
    51  			r["target"] = targets
    52  		}
    53  
    54  		result = append(result, r)
    55  	}
    56  
    57  	return result
    58  }
    59  
    60  // Expands an array of schedules into []pagerduty.Schedule
    61  func expandScheduleLayers(list []interface{}) []pagerduty.ScheduleLayer {
    62  	result := make([]pagerduty.ScheduleLayer, 0, len(list))
    63  
    64  	for _, l := range list {
    65  		layer := l.(map[string]interface{})
    66  
    67  		scheduleLayer := &pagerduty.ScheduleLayer{
    68  			Name:                      layer["name"].(string),
    69  			Start:                     layer["start"].(string),
    70  			End:                       layer["end"].(string),
    71  			RotationVirtualStart:      layer["rotation_virtual_start"].(string),
    72  			RotationTurnLengthSeconds: uint(layer["rotation_turn_length_seconds"].(int)),
    73  		}
    74  
    75  		if layer["id"] != "" {
    76  			scheduleLayer.ID = layer["id"].(string)
    77  		}
    78  
    79  		for _, u := range layer["users"].([]interface{}) {
    80  			scheduleLayer.Users = append(
    81  				scheduleLayer.Users,
    82  				pagerduty.UserReference{
    83  					User: pagerduty.APIObject{
    84  						ID:   u.(string),
    85  						Type: "user_reference",
    86  					},
    87  				},
    88  			)
    89  		}
    90  
    91  		for _, r := range layer["restriction"].([]interface{}) {
    92  			restriction := r.(map[string]interface{})
    93  			scheduleLayer.Restrictions = append(
    94  				scheduleLayer.Restrictions,
    95  				pagerduty.Restriction{
    96  					Type:            restriction["type"].(string),
    97  					StartTimeOfDay:  restriction["start_time_of_day"].(string),
    98  					StartDayOfWeek:  uint(restriction["start_day_of_week"].(int)),
    99  					DurationSeconds: uint(restriction["duration_seconds"].(int)),
   100  				},
   101  			)
   102  		}
   103  
   104  		result = append(result, *scheduleLayer)
   105  	}
   106  
   107  	return result
   108  }
   109  
   110  // Expands an array of teams into []pagerduty.APIReference
   111  func expandTeams(list []interface{}) []pagerduty.APIReference {
   112  	result := make([]pagerduty.APIReference, 0, len(list))
   113  
   114  	for _, l := range list {
   115  		team := &pagerduty.APIReference{
   116  			ID:   l.(string),
   117  			Type: "team_reference",
   118  		}
   119  
   120  		result = append(result, *team)
   121  	}
   122  
   123  	return result
   124  }
   125  
   126  // Flattens an array of []pagerduty.ScheduleLayer into a map[string]interface{}
   127  func flattenScheduleLayers(list []pagerduty.ScheduleLayer) []map[string]interface{} {
   128  	result := make([]map[string]interface{}, 0, len(list))
   129  
   130  	for _, i := range list {
   131  		r := make(map[string]interface{})
   132  		r["id"] = i.ID
   133  		r["name"] = i.Name
   134  		r["end"] = i.End
   135  		r["start"] = i.Start
   136  		r["rotation_virtual_start"] = i.RotationVirtualStart
   137  		r["rotation_turn_length_seconds"] = i.RotationTurnLengthSeconds
   138  
   139  		if len(i.Users) > 0 {
   140  			users := make([]string, 0, len(i.Users))
   141  			for _, u := range i.Users {
   142  				users = append(users, u.User.ID)
   143  			}
   144  			r["users"] = users
   145  		}
   146  
   147  		if len(i.Restrictions) > 0 {
   148  			restrictions := make([]map[string]interface{}, 0, len(i.Restrictions))
   149  			for _, r := range i.Restrictions {
   150  				restriction := map[string]interface{}{
   151  					"duration_seconds":  r.DurationSeconds,
   152  					"start_time_of_day": r.StartTimeOfDay,
   153  					"type":              r.Type,
   154  				}
   155  
   156  				if r.StartDayOfWeek > 0 {
   157  					restriction["start_day_of_week"] = r.StartDayOfWeek
   158  				}
   159  
   160  				restrictions = append(restrictions, restriction)
   161  			}
   162  			r["restriction"] = restrictions
   163  		}
   164  
   165  		result = append(result, r)
   166  	}
   167  
   168  	// Reverse the final result and return it
   169  	resultReversed := make([]map[string]interface{}, 0, len(result))
   170  
   171  	for i := len(result) - 1; i >= 0; i-- {
   172  		resultReversed = append(resultReversed, result[i])
   173  	}
   174  
   175  	return resultReversed
   176  }
   177  
   178  // Takes the result of flatmap.Expand for an array of strings
   179  // and returns a []string
   180  func expandStringList(configured []interface{}) []string {
   181  	vs := make([]string, 0, len(configured))
   182  	for _, v := range configured {
   183  		vs = append(vs, string(v.(string)))
   184  	}
   185  	return vs
   186  }
   187  
   188  // Expands attribute slice to incident urgency rule, returns it and true if successful
   189  func expandIncidentUrgencyRule(incidentUrgencyList interface{}) (*pagerduty.IncidentUrgencyRule, bool) {
   190  	i := incidentUrgencyList.([]interface{})
   191  
   192  	i, ok := incidentUrgencyList.([]interface{})
   193  	if !ok {
   194  		return nil, false
   195  	}
   196  
   197  	m, ok := i[0].(map[string]interface{})
   198  	if !ok || len(m) == 0 {
   199  		return nil, false
   200  	}
   201  
   202  	iur := pagerduty.IncidentUrgencyRule{}
   203  	if val, ok := m["type"]; ok {
   204  		iur.Type = val.(string)
   205  	}
   206  	if val, ok := m["urgency"]; ok {
   207  		iur.Urgency = val.(string)
   208  	}
   209  	if val, ok := m["during_support_hours"]; ok {
   210  		iur.DuringSupportHours = expandIncidentUrgencyType(val)
   211  	}
   212  	if val, ok := m["outside_support_hours"]; ok {
   213  		iur.OutsideSupportHours = expandIncidentUrgencyType(val)
   214  	}
   215  
   216  	return &iur, true
   217  }
   218  
   219  // Expands attribute to inline model
   220  func expandActionInlineModel(inlineModelVal interface{}) *pagerduty.InlineModel {
   221  	inlineModel := pagerduty.InlineModel{}
   222  
   223  	if slice, ok := inlineModelVal.([]interface{}); ok && len(slice) == 1 {
   224  		m := slice[0].(map[string]interface{})
   225  
   226  		if val, ok := m["type"]; ok {
   227  			inlineModel.Type = val.(string)
   228  		}
   229  		if val, ok := m["name"]; ok {
   230  			inlineModel.Name = val.(string)
   231  		}
   232  	}
   233  
   234  	return &inlineModel
   235  }
   236  
   237  // Expands attribute into incident urgency type
   238  func expandIncidentUrgencyType(attribute interface{}) *pagerduty.IncidentUrgencyType {
   239  	ict := pagerduty.IncidentUrgencyType{}
   240  
   241  	slice := attribute.([]interface{})
   242  	if len(slice) != 1 {
   243  		return &ict
   244  	}
   245  
   246  	m := slice[0].(map[string]interface{})
   247  
   248  	if val, ok := m["type"]; ok {
   249  		ict.Type = val.(string)
   250  	}
   251  	if val, ok := m["urgency"]; ok {
   252  		ict.Urgency = val.(string)
   253  	}
   254  
   255  	return &ict
   256  }
   257  
   258  // Returns service's incident urgency rule as slice of length one and bool indicating success
   259  func flattenIncidentUrgencyRule(service *pagerduty.Service) ([]interface{}, bool) {
   260  	if service.IncidentUrgencyRule.Type == "" && service.IncidentUrgencyRule.Urgency == "" {
   261  		return nil, false
   262  	}
   263  
   264  	m := map[string]interface{}{
   265  		"type":    service.IncidentUrgencyRule.Type,
   266  		"urgency": service.IncidentUrgencyRule.Urgency,
   267  	}
   268  
   269  	if dsh := service.IncidentUrgencyRule.DuringSupportHours; dsh != nil {
   270  		m["during_support_hours"] = flattenIncidentUrgencyType(dsh)
   271  	}
   272  	if osh := service.IncidentUrgencyRule.OutsideSupportHours; osh != nil {
   273  		m["outside_support_hours"] = flattenIncidentUrgencyType(osh)
   274  	}
   275  
   276  	return []interface{}{m}, true
   277  }
   278  
   279  func flattenIncidentUrgencyType(iut *pagerduty.IncidentUrgencyType) []interface{} {
   280  	incidenUrgencyType := map[string]interface{}{
   281  		"type":    iut.Type,
   282  		"urgency": iut.Urgency,
   283  	}
   284  	return []interface{}{incidenUrgencyType}
   285  }
   286  
   287  // Expands attribute to support hours
   288  func expandSupportHours(attribute interface{}) (sh *pagerduty.SupportHours) {
   289  	if slice, ok := attribute.([]interface{}); ok && len(slice) >= 1 {
   290  		m := slice[0].(map[string]interface{})
   291  		sh = &pagerduty.SupportHours{}
   292  
   293  		if val, ok := m["type"]; ok {
   294  			sh.Type = val.(string)
   295  		}
   296  		if val, ok := m["time_zone"]; ok {
   297  			sh.Timezone = val.(string)
   298  		}
   299  		if val, ok := m["start_time"]; ok {
   300  			sh.StartTime = val.(string)
   301  		}
   302  		if val, ok := m["end_time"]; ok {
   303  			sh.EndTime = val.(string)
   304  		}
   305  		if val, ok := m["days_of_week"]; ok {
   306  			daysOfWeekInt := val.([]interface{})
   307  			var daysOfWeek []uint
   308  
   309  			for _, i := range daysOfWeekInt {
   310  				daysOfWeek = append(daysOfWeek, uint(i.(int)))
   311  			}
   312  
   313  			sh.DaysOfWeek = daysOfWeek
   314  		}
   315  	}
   316  
   317  	return
   318  }
   319  
   320  // Returns service's support hours as slice of length one
   321  func flattenSupportHours(service *pagerduty.Service) []interface{} {
   322  	if service.SupportHours == nil {
   323  		return nil
   324  	}
   325  
   326  	m := map[string]interface{}{}
   327  
   328  	if s := service.SupportHours; s != nil {
   329  		m["type"] = s.Type
   330  		m["time_zone"] = s.Timezone
   331  		m["start_time"] = s.StartTime
   332  		m["end_time"] = s.EndTime
   333  		m["days_of_week"] = s.DaysOfWeek
   334  	}
   335  
   336  	return []interface{}{m}
   337  }
   338  
   339  // Expands attribute to scheduled action
   340  func expandScheduledActions(input interface{}) (scheduledActions []pagerduty.ScheduledAction) {
   341  	inputs := input.([]interface{})
   342  
   343  	for _, i := range inputs {
   344  		m := i.(map[string]interface{})
   345  		sa := pagerduty.ScheduledAction{}
   346  
   347  		if val, ok := m["type"]; ok {
   348  			sa.Type = val.(string)
   349  		}
   350  		if val, ok := m["to_urgency"]; ok {
   351  			sa.ToUrgency = val.(string)
   352  		}
   353  		if val, ok := m["at"]; ok {
   354  			sa.At = *expandActionInlineModel(val)
   355  		}
   356  
   357  		scheduledActions = append(scheduledActions, sa)
   358  	}
   359  
   360  	return scheduledActions
   361  }
   362  
   363  // Returns service's scheduled actions
   364  func flattenScheduledActions(service *pagerduty.Service) []interface{} {
   365  	scheduledActions := []interface{}{}
   366  
   367  	if sas := service.ScheduledActions; sas != nil {
   368  		for _, sa := range sas {
   369  			m := map[string]interface{}{}
   370  			m["to_urgency"] = sa.ToUrgency
   371  			m["type"] = sa.Type
   372  			if at, ok := scheduledActionsAt(sa.At); ok {
   373  				m["at"] = at
   374  			}
   375  			scheduledActions = append(scheduledActions, m)
   376  		}
   377  	}
   378  
   379  	return scheduledActions
   380  }
   381  
   382  // Returns service's scheduled action's at attribute as slice of length one
   383  func scheduledActionsAt(inlineModel pagerduty.InlineModel) ([]interface{}, bool) {
   384  	if inlineModel.Type == "" || inlineModel.Name == "" {
   385  		return nil, false
   386  	}
   387  
   388  	m := map[string]interface{}{"type": inlineModel.Type, "name": inlineModel.Name}
   389  	return []interface{}{m}, true
   390  }