148 lines
4.9 KiB
Go
148 lines
4.9 KiB
Go
|
package pagerduty
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/google/go-querystring/query"
|
||
|
)
|
||
|
|
||
|
// Acknowledgement is the data structure of an acknoledgement of an incident.
|
||
|
type Acknowledgement struct {
|
||
|
At string
|
||
|
Acknowledger APIObject
|
||
|
}
|
||
|
|
||
|
// PendingAction is the data structure for any pending actions on an incident.
|
||
|
type PendingAction struct {
|
||
|
Type string
|
||
|
At string
|
||
|
}
|
||
|
|
||
|
// Assignment is the data structure for an assignment of an incident
|
||
|
type Assignment struct {
|
||
|
At string
|
||
|
Assignee APIObject
|
||
|
}
|
||
|
|
||
|
// Incident is a normalized, de-duplicated event generated by a PagerDuty integration.
|
||
|
type Incident struct {
|
||
|
APIObject
|
||
|
IncidentNumber uint `json:"incident_number,omitempty"`
|
||
|
CreatedAt string `json:"created_at,omitempty"`
|
||
|
PendingActions []PendingAction `json:"pending_actions,omitempty"`
|
||
|
IncidentKey string `json:"incident_key,omitempty"`
|
||
|
Service APIObject `json:"service,omitempty"`
|
||
|
Assignments []Assignment `json:"assignments,omitempty"`
|
||
|
Acknowledgements []Acknowledgement `json:"acknowledgements,omitempty"`
|
||
|
LastStatusChangeAt string `json:"last_status_change_at,omitempty"`
|
||
|
LastStatusChangeBy APIObject `json:"last_status_change_by,omitempty"`
|
||
|
FirstTriggerLogEntry APIObject `json:"last_trigger_log_entry,omitempty"`
|
||
|
EscalationPolicy APIObject `json:"escalation_policy,omitempty"`
|
||
|
Teams []APIObject `json:"teams,omitempty"`
|
||
|
Urgency string `json:"urgency,omitempty"`
|
||
|
}
|
||
|
|
||
|
// ListIncidentsResponse is the response structure when calling the ListIncident API endpoint.
|
||
|
type ListIncidentsResponse struct {
|
||
|
APIListObject
|
||
|
Incidents []Incident `json:"incidents,omitempty"`
|
||
|
}
|
||
|
|
||
|
// ListIncidentsOptions is the structure used when passing parameters to the ListIncident API endpoint.
|
||
|
type ListIncidentsOptions struct {
|
||
|
APIListObject
|
||
|
Since string `url:"since,omitempty"`
|
||
|
Until string `url:"until,omitempty"`
|
||
|
DateRange string `url:"date_range,omitempty"`
|
||
|
Statuses []string `url:"statuses,omitempty,brackets"`
|
||
|
IncidentKey string `url:"incident_key,omitempty"`
|
||
|
ServiceIDs []string `url:"service_ids,omitempty,brackets"`
|
||
|
TeamIDs []string `url:"team_ids,omitempty,brackets"`
|
||
|
UserIDs []string `url:"user_ids,omitempty,brackets"`
|
||
|
Urgencies []string `url:"urgencies,omitempty,brackets"`
|
||
|
TimeZone string `url:"time_zone,omitempty"`
|
||
|
SortBy string `url:"sort_by,omitempty"`
|
||
|
Includes []string `url:"include,omitempty,brackets"`
|
||
|
}
|
||
|
|
||
|
// ListIncidents lists existing incidents.
|
||
|
func (c *Client) ListIncidents(o ListIncidentsOptions) (*ListIncidentsResponse, error) {
|
||
|
v, err := query.Values(o)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
resp, err := c.get("/incidents?" + v.Encode())
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var result ListIncidentsResponse
|
||
|
return &result, c.decodeJSON(resp, &result)
|
||
|
}
|
||
|
|
||
|
// ManageIncidents acknowledges, resolves, escalates, or reassigns one or more incidents.
|
||
|
func (c *Client) ManageIncidents(from string, incidents []Incident) error {
|
||
|
r := make(map[string][]Incident)
|
||
|
headers := make(map[string]string)
|
||
|
headers["From"] = from
|
||
|
r["incidents"] = incidents
|
||
|
_, e := c.put("/incidents", r, &headers)
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
// GetIncident shows detailed information about an incident.
|
||
|
func (c *Client) GetIncident(id string) (*Incident, error) {
|
||
|
resp, err := c.get("/incidents/" + id)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var result map[string]Incident
|
||
|
if err := c.decodeJSON(resp, &result); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
i, ok := result["incident"]
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf("JSON response does not have incident field")
|
||
|
}
|
||
|
return &i, nil
|
||
|
}
|
||
|
|
||
|
// IncidentNote is a note for the specified incident.
|
||
|
type IncidentNote struct {
|
||
|
ID string `json:"id,omitempty"`
|
||
|
User APIObject `json:"user,omitempty"`
|
||
|
Content string `json:"content,omitempty"`
|
||
|
CreatedAt string `json:"created_at,omitempty"`
|
||
|
}
|
||
|
|
||
|
// ListIncidentNotes lists existing notes for the specified incident.
|
||
|
func (c *Client) ListIncidentNotes(id string) ([]IncidentNote, error) {
|
||
|
resp, err := c.get("/incidents/" + id + "/notes")
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var result map[string][]IncidentNote
|
||
|
if err := c.decodeJSON(resp, &result); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
notes, ok := result["notes"]
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf("JSON response does not have notes field")
|
||
|
}
|
||
|
return notes, nil
|
||
|
}
|
||
|
|
||
|
// CreateIncidentNote creates a new note for the specified incident.
|
||
|
func (c *Client) CreateIncidentNote(id string, note IncidentNote) error {
|
||
|
data := make(map[string]IncidentNote)
|
||
|
data["note"] = note
|
||
|
_, err := c.post("/incidents/"+id+"/notes", data)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// SnoozeIncident sets an incident to not alert for a specified period of time.
|
||
|
func (c *Client) SnoozeIncident(id string, duration uint) error {
|
||
|
data := make(map[string]uint)
|
||
|
data["duration"] = duration
|
||
|
_, err := c.post("/incidents/"+id+"/snooze", data)
|
||
|
return err
|
||
|
}
|