mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package victorops
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/wtfutil/wtf/logger"
|
|
)
|
|
|
|
// Fetch gets the current oncall users
|
|
func Fetch(apiID, apiKey string) ([]OnCallTeam, error) {
|
|
scheduleURL := "https://api.victorops.com/api-public/v1/oncall/current"
|
|
response, err := victorOpsRequest(scheduleURL, apiID, apiKey)
|
|
|
|
return response, err
|
|
}
|
|
|
|
/* ---------------- Unexported Functions ---------------- */
|
|
|
|
func victorOpsRequest(url string, apiID string, apiKey string) ([]OnCallTeam, error) {
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
logger.Log(fmt.Sprintf("Failed to initialize sessions to VictorOps. ERROR: %s", err))
|
|
return nil, err
|
|
}
|
|
|
|
req.Header.Set("X-VO-Api-Id", apiID)
|
|
req.Header.Set("X-VO-Api-Key", apiKey)
|
|
client := &http.Client{}
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
logger.Log(fmt.Sprintf("Failed to make request to VictorOps. ERROR: %s", err))
|
|
return nil, err
|
|
}
|
|
if resp.StatusCode != 200 {
|
|
return nil, fmt.Errorf("%s", resp.Status)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
response := &OnCallResponse{}
|
|
if err := json.NewDecoder(resp.Body).Decode(response); err != nil {
|
|
logger.Log(fmt.Sprintf("Failed to decode JSON response. ERROR: %s", err))
|
|
return nil, err
|
|
}
|
|
|
|
teams := parseTeams(response)
|
|
return teams, nil
|
|
}
|
|
|
|
func parseTeams(input *OnCallResponse) []OnCallTeam {
|
|
var teamResults []OnCallTeam
|
|
|
|
for _, data := range input.TeamsOnCall {
|
|
var team OnCallTeam
|
|
team.Name = data.Team.Name
|
|
team.Slug = data.Team.Slug
|
|
var userList []string
|
|
for _, userData := range data.OnCallNow {
|
|
escalationPolicy := userData.EscalationPolicy.Name
|
|
for _, user := range userData.Users {
|
|
userList = append(userList, user.OnCallUser.Username)
|
|
}
|
|
team.OnCall = append(team.OnCall, OnCall{escalationPolicy, strings.Join(userList, ", ")})
|
|
}
|
|
teamResults = append(teamResults, team)
|
|
}
|
|
|
|
return teamResults
|
|
}
|