1package pagerduty 2 3import ( 4 "fmt" 5 "net/http" 6 7 "github.com/google/go-querystring/query" 8) 9 10// MaintenanceWindow is used to temporarily disable one or more services for a set period of time. 11type MaintenanceWindow struct { 12 APIObject 13 SequenceNumber uint `json:"sequence_number,omitempty"` 14 StartTime string `json:"start_time"` 15 EndTime string `json:"end_time"` 16 Description string `json:"description"` 17 Services []APIObject `json:"services"` 18 Teams []APIListObject `json:"teams"` 19 CreatedBy APIListObject `json:"created_by"` 20} 21 22// ListMaintenanceWindowsResponse is the data structur returned from calling the ListMaintenanceWindows API endpoint. 23type ListMaintenanceWindowsResponse struct { 24 APIListObject 25 MaintenanceWindows []MaintenanceWindow `json:"maintenance_windows"` 26} 27 28// ListMaintenanceWindowsOptions is the data structure used when calling the ListMaintenanceWindows API endpoint. 29type ListMaintenanceWindowsOptions struct { 30 APIListObject 31 Query string `url:"query,omitempty"` 32 Includes []string `url:"include,omitempty,brackets"` 33 TeamIDs []string `url:"team_ids,omitempty,brackets"` 34 ServiceIDs []string `url:"service_ids,omitempty,brackets"` 35 Filter string `url:"filter,omitempty,brackets"` 36} 37 38// ListMaintenanceWindows lists existing maintenance windows, optionally filtered by service and/or team, or whether they are from the past, present or future. 39func (c *Client) ListMaintenanceWindows(o ListMaintenanceWindowsOptions) (*ListMaintenanceWindowsResponse, error) { 40 v, err := query.Values(o) 41 if err != nil { 42 return nil, err 43 } 44 resp, err := c.get("/maintenance_windows?" + v.Encode()) 45 if err != nil { 46 return nil, err 47 } 48 var result ListMaintenanceWindowsResponse 49 return &result, c.decodeJSON(resp, &result) 50} 51 52// CreateMaintenanceWindows creates a new maintenance window for the specified services. 53func (c *Client) CreateMaintenanceWindows(m MaintenanceWindow) (*MaintenanceWindow, error) { 54 data := make(map[string]MaintenanceWindow) 55 data["maintenance_window"] = m 56 resp, err := c.post("/maintenance_windows", data, nil) 57 return getMaintenanceWindowFromResponse(c, resp, err) 58} 59 60// DeleteMaintenanceWindow deletes an existing maintenance window if it's in the future, or ends it if it's currently on-going. 61func (c *Client) DeleteMaintenanceWindow(id string) error { 62 _, err := c.delete("/maintenance_windows/" + id) 63 return err 64} 65 66// GetMaintenanceWindowOptions is the data structure used when calling the GetMaintenanceWindow API endpoint. 67type GetMaintenanceWindowOptions struct { 68 Includes []string `url:"include,omitempty,brackets"` 69} 70 71// GetMaintenanceWindow gets an existing maintenance window. 72func (c *Client) GetMaintenanceWindow(id string, o GetMaintenanceWindowOptions) (*MaintenanceWindow, error) { 73 v, err := query.Values(o) 74 if err != nil { 75 return nil, err 76 } 77 resp, err := c.get("/maintenance_windows/" + id + "?" + v.Encode()) 78 return getMaintenanceWindowFromResponse(c, resp, err) 79} 80 81// UpdateMaintenanceWindow updates an existing maintenance window. 82func (c *Client) UpdateMaintenanceWindow(m MaintenanceWindow) (*MaintenanceWindow, error) { 83 resp, err := c.put("/maintenance_windows/"+m.ID, m, nil) 84 return getMaintenanceWindowFromResponse(c, resp, err) 85} 86 87func getMaintenanceWindowFromResponse(c *Client, resp *http.Response, err error) (*MaintenanceWindow, error) { 88 if err != nil { 89 return nil, err 90 } 91 var target map[string]MaintenanceWindow 92 if dErr := c.decodeJSON(resp, &target); dErr != nil { 93 return nil, fmt.Errorf("Could not decode JSON response: %v", dErr) 94 } 95 rootNode := "maintenance_window" 96 t, nodeOK := target[rootNode] 97 if !nodeOK { 98 return nil, fmt.Errorf("JSON response does not have %s field", rootNode) 99 } 100 return &t, nil 101} 102