From bbcaf54b83c9c8121ab86b867854884f2044ec6b Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Tue, 2 Apr 2024 17:57:03 +0100 Subject: [PATCH 1/6] Add Opsgenie annotation fix --- api/types/constants.go | 8 +- .../plugins/opsgenie/add-requester-role.png | Bin 127794 -> 0 bytes .../access-request-plugins/opsgenie.mdx | 11 +- integrations/access/accessrequest/app.go | 26 +++-- integrations/access/opsgenie/app.go | 38 ++++--- integrations/access/opsgenie/bot.go | 19 ++-- integrations/access/opsgenie/client.go | 66 +++++++++-- integrations/access/opsgenie/client_test.go | 5 +- integrations/access/opsgenie/config.go | 18 +++ .../access/opsgenie/fake_opsgenie_test.go | 104 +++++++++++++++++- integrations/access/opsgenie/types.go | 27 ++++- integrations/access/servicenow/app.go | 2 +- 12 files changed, 271 insertions(+), 53 deletions(-) delete mode 100644 docs/img/enterprise/plugins/opsgenie/add-requester-role.png diff --git a/api/types/constants.go b/api/types/constants.go index 5f0060753e3ef..12202ccd5e40f 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -708,10 +708,10 @@ const ( // DiscoveryAppIgnore specifies if a Kubernetes service should be ignored by discovery service. DiscoveryAppIgnore = TeleportNamespace + "/ignore" - // ReqAnnotationSchedulesLabel is the request annotation key at which schedules are stored for access plugins. - ReqAnnotationSchedulesLabel = "/schedules" - // ReqAnnotationNotifyServicesLabel is the request annotation key at which notify services are stored for access plugins. - ReqAnnotationNotifyServicesLabel = "/notify-services" + // ReqAnnotationApproveSchedulesLabel is the request annotation key at which schedules are stored for access plugins. + ReqAnnotationApproveSchedulesLabel = "/schedules" + // ReqAnnotationNotifySchedulesLabel is the request annotation key at which notify schedules are stored for access plugins. + ReqAnnotationNotifySchedulesLabel = "/notify-services" // CloudAWS identifies that a resource was discovered in AWS. CloudAWS = "AWS" diff --git a/docs/img/enterprise/plugins/opsgenie/add-requester-role.png b/docs/img/enterprise/plugins/opsgenie/add-requester-role.png deleted file mode 100644 index 4d7087ec04b75d6fc712288e9f6e37e85ea0aba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127794 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�sh2H&O#Zih_GtCd1>1L7d-3|lyeJAa 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�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 diff --git a/docs/pages/access-controls/access-request-plugins/opsgenie.mdx b/docs/pages/access-controls/access-request-plugins/opsgenie.mdx index 773dfa71ec547..3c729c19ecef3 100644 --- a/docs/pages/access-controls/access-request-plugins/opsgenie.mdx +++ b/docs/pages/access-controls/access-request-plugins/opsgenie.mdx @@ -60,8 +60,6 @@ To create a user first navigate to Management -> Access -> Roles Then select 'Create New Role' and create the requester role. -![Add user one](../../../img/enterprise/plugins/opsgenie/add-requester-role.png) - ``` kind: role version: v5 @@ -75,10 +73,13 @@ spec: - approve: 1 deny: 1 annotations: - teleport.dev/schedules: ['teleport-access-request-notifications'] + teleport.dev/notify-services: ['teleport-access-request-notifications'] + teleport.dev/schedules: ['teleport-access-alert-schedules'] ``` -The `teleport.dev/schedules` annotation specifies the schedule the alert will be be created for. +The `teleport.dev/notify-services` annotation specifies the schedules the alert will be created for. +The `teleport.dev/schedules` annotation specifies the schedules the alert will check, and auto approve the +Access Request if the requesting user is on-call. ### Create a user who will request access @@ -121,7 +122,7 @@ As the Teleport user `myuser`, create an Access Request for the `editor` role: In Opsgenie, you will see a new alert containing information about the Access Request in either the default schedule specified when enrolling the plugin, -or in the schedules specified by `teleport.dev/schedules` annotation in the requester's role. +or in the schedules specified by `teleport.dev/notify-services` annotation in the requester's role. ### Resolve the request diff --git a/integrations/access/accessrequest/app.go b/integrations/access/accessrequest/app.go index 94e3ea172c6c3..51b38109c2deb 100644 --- a/integrations/access/accessrequest/app.go +++ b/integrations/access/accessrequest/app.go @@ -352,16 +352,28 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) recipientSet.Add(common.Recipient{}) return recipientSet.ToSlice() case types.PluginTypeOpsgenie: - if recipients, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationSchedulesLabel]; ok { - for _, recipient := range recipients { - rec, err := a.bot.FetchRecipient(ctx, recipient) - if err != nil { - log.Warning(err) - } - recipientSet.Add(*rec) + // When both notify-services and approve-schedules are present, each is used for their own intended purpose. + recipients := make([]string, 0) + if approveSchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel]; ok { + if notifySchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel]; ok { + recipients = notifySchedules + } else { + // When only approve-schedules annotation is present + // it is used for both notifications and auto-approval to keep the behavior there is now. + recipients = approveSchedules } + } else { return recipientSet.ToSlice() } + for _, recipient := range recipients { + rec, err := a.bot.FetchRecipient(ctx, recipient) + if err != nil { + log.Warningf("Failed to fetch Opsgenie recipient: %v", err) + continue + } + recipientSet.Add(*rec) + } + return recipientSet.ToSlice() } validEmailSuggReviewers := []string{} diff --git a/integrations/access/opsgenie/app.go b/integrations/access/opsgenie/app.go index eb3df0ab47559..2ade58d2cd0b2 100644 --- a/integrations/access/opsgenie/app.go +++ b/integrations/access/opsgenie/app.go @@ -31,7 +31,6 @@ import ( tp "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/lib" "github.com/gravitational/teleport/integrations/lib/backoff" @@ -45,9 +44,9 @@ const ( // minServerVersion is the minimal teleport version the plugin supports. minServerVersion = "6.1.0" // initTimeout is used to bound execution time of health check and teleport version check. - initTimeout = time.Second * 10 + initTimeout = time.Second * 30 // handlerTimeout is used to bound the execution time of watcher event handler. - handlerTimeout = time.Second * 5 + handlerTimeout = time.Second * 30 // modifyPluginDataBackoffBase is an initial (minimum) backoff value. modifyPluginDataBackoffBase = time.Millisecond // modifyPluginDataBackoffMax is a backoff threshold @@ -141,10 +140,9 @@ func (a *App) init(ctx context.Context) error { defer cancel() var err error - if a.teleport == nil { - if a.teleport, err = common.GetTeleportClient(ctx, a.conf.Teleport); err != nil { - return trace.Wrap(err) - } + a.teleport, err = a.conf.GetTeleportClient(ctx) + if err != nil { + return trace.Wrap(err, "getting teleport client") } if _, err = a.checkTeleportVersion(ctx); err != nil { @@ -155,6 +153,13 @@ func (a *App) init(ctx context.Context) error { if err != nil { return trace.Wrap(err) } + + log := logger.Get(ctx) + log.Debug("Starting API health check...") + if err = a.opsgenie.CheckHealth(ctx); err != nil { + return trace.Wrap(err, "API health check failed") + } + log.Debug("API health check finished ok") return nil } @@ -269,7 +274,7 @@ func (a *App) onDeletedRequest(ctx context.Context, reqID string) error { } func (a *App) getNotifyServiceNames(req types.AccessRequest) ([]string, error) { - services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifyServicesLabel] + services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel] if !ok { return nil, trace.NotFound("notify services not specified") } @@ -277,7 +282,7 @@ func (a *App) getNotifyServiceNames(req types.AccessRequest) ([]string, error) { } func (a *App) getOnCallServiceNames(req types.AccessRequest) ([]string, error) { - services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationSchedulesLabel] + services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel] if !ok { return nil, trace.NotFound("on-call schedules not specified") } @@ -294,11 +299,16 @@ func (a *App) tryNotifyService(ctx context.Context, req types.AccessRequest) (bo } reqID := req.GetName() + annotations := types.Labels{} + for k, v := range req.GetSystemAnnotations() { + annotations[k] = v + } reqData := RequestData{ - User: req.GetUser(), - Roles: req.GetRoles(), - Created: req.GetCreationTime(), - RequestReason: req.GetRequestReason(), + User: req.GetUser(), + Roles: req.GetRoles(), + Created: req.GetCreationTime(), + RequestReason: req.GetRequestReason(), + SystemAnnotations: annotations, } // Create plugin data if it didn't exist before. @@ -429,7 +439,7 @@ func (a *App) tryApproveRequest(ctx context.Context, req types.AccessRequest) er if _, err := a.teleport.SubmitAccessReview(ctx, types.AccessReviewSubmission{ RequestID: req.GetName(), Review: types.AccessReview{ - Author: tp.SystemAccessApproverUserName, + Author: a.conf.TeleportUserName, ProposedState: types.RequestState_APPROVED, Reason: fmt.Sprintf("Access requested by user %s who is on call on service(s) %s", tp.SystemAccessApproverUserName, diff --git a/integrations/access/opsgenie/bot.go b/integrations/access/opsgenie/bot.go index 3c63d2881ca6c..fef4f82f42da2 100644 --- a/integrations/access/opsgenie/bot.go +++ b/integrations/access/opsgenie/bot.go @@ -60,13 +60,17 @@ func (b Bot) SendReviewReminders(ctx context.Context, recipients []common.Recipi } // BroadcastAccessRequestMessage creates an alert for the provided recipients (schedules) -func (b *Bot) BroadcastAccessRequestMessage(ctx context.Context, recipients []common.Recipient, reqID string, reqData pd.AccessRequestData) (data accessrequest.SentMessages, err error) { - schedules := []string{} - for _, recipient := range recipients { - schedules = append(schedules, recipient.Name) +func (b *Bot) BroadcastAccessRequestMessage(ctx context.Context, recipientSchedules []common.Recipient, reqID string, reqData pd.AccessRequestData) (data accessrequest.SentMessages, err error) { + notificationSchedules := make([]string, 0, len(recipientSchedules)) + for _, notifySchedule := range recipientSchedules { + notificationSchedules = append(notificationSchedules, notifySchedule.Name) } - if len(recipients) == 0 { - schedules = append(schedules, b.client.DefaultSchedules...) + autoApprovalSchedules := []string{} + if annotationAutoApprovalSchedules, ok := reqData.SystemAnnotations[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel]; ok { + autoApprovalSchedules = annotationAutoApprovalSchedules + } + if len(autoApprovalSchedules) == 0 { + autoApprovalSchedules = append(autoApprovalSchedules, b.client.DefaultSchedules...) } opsgenieReqData := RequestData{ User: reqData.User, @@ -79,7 +83,8 @@ func (b *Bot) BroadcastAccessRequestMessage(ctx context.Context, recipients []co Reason: reqData.ResolutionReason, }, SystemAnnotations: types.Labels{ - types.TeleportNamespace + types.ReqAnnotationSchedulesLabel: schedules, + types.TeleportNamespace + types.ReqAnnotationApproveSchedulesLabel: autoApprovalSchedules, + types.TeleportNamespace + types.ReqAnnotationNotifySchedulesLabel: notificationSchedules, }, } opsgenieData, err := b.client.CreateAlert(ctx, reqID, opsgenieReqData) diff --git a/integrations/access/opsgenie/client.go b/integrations/access/opsgenie/client.go index 9e63c3423767b..cc78b65298bbc 100644 --- a/integrations/access/opsgenie/client.go +++ b/integrations/access/opsgenie/client.go @@ -30,17 +30,24 @@ import ( "github.com/aws/aws-sdk-go/aws/defaults" "github.com/go-resty/resty/v2" "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/lib" + "github.com/gravitational/teleport/integrations/lib/backoff" "github.com/gravitational/teleport/integrations/lib/logger" ) const ( // alertKeyPrefix is the prefix for Alert's alias field used when creating an Alert. - alertKeyPrefix = "teleport-access-request" - heartbeatName = "teleport-access-heartbeat" + alertKeyPrefix = "teleport-access-request" + heartbeatName = "teleport-access-heartbeat" + ResponderTypeSchedule = "schedule" + ResponderTypeUser = "user" + + ResolveAlertRequestRetryInterval = time.Second * 10 + ResolveAlertRequestRetryTimeout = time.Minute * 2 ) var alertBodyTemplate = template.Must(template.New("alert body").Parse( @@ -135,11 +142,11 @@ func (og Client) CreateAlert(ctx context.Context, reqID string, reqData RequestD Message: fmt.Sprintf("Access request from %s", reqData.User), Alias: fmt.Sprintf("%s/%s", alertKeyPrefix, reqID), Description: bodyDetails, - Responders: og.getResponders(reqData), + Responders: og.getScheduleResponders(reqData), Priority: og.Priority, } - var result AlertResult + var result CreateAlertResult resp, err := og.client.NewRequest(). SetContext(ctx). SetBody(body). @@ -153,20 +160,60 @@ func (og Client) CreateAlert(ctx context.Context, reqID string, reqData RequestD if resp.IsError() { return OpsgenieData{}, errWrapper(resp.StatusCode(), string(resp.Body())) } + + // If this fails, Teleport request approval and auto-approval will still work, + // but incident in Opsgenie won't be auto-closed or updated as the alertID won't be available. + alertRequestResult, err := og.tryGetAlertRequestResult(ctx, result.RequestID) + if err != nil { + return OpsgenieData{}, trace.Wrap(err) + } + return OpsgenieData{ - AlertID: result.Alert.ID, + AlertID: alertRequestResult.Data.AlertID, }, nil } -func (og Client) getResponders(reqData RequestData) []Responder { +func (og Client) tryGetAlertRequestResult(ctx context.Context, reqID string) (GetAlertRequestResult, error) { + backoff := backoff.NewDecorr(ResolveAlertRequestRetryInterval, ResolveAlertRequestRetryTimeout, clockwork.NewRealClock()) + for { + alertRequestResult, err := og.getAlertRequestResult(ctx, reqID) + if err == nil { + logger.Get(ctx).Debugf("Got alert request result: %+v", alertRequestResult) + return alertRequestResult, nil + } + logger.Get(ctx).Debug("Failed to get alert request result:", err) + if err := backoff.Do(ctx); err != nil { + return GetAlertRequestResult{}, trace.Wrap(err) + } + } +} + +func (og Client) getAlertRequestResult(ctx context.Context, reqID string) (GetAlertRequestResult, error) { + var result GetAlertRequestResult + resp, err := og.client.NewRequest(). + SetContext(ctx). + SetResult(&result). + SetPathParams(map[string]string{"requestID": reqID}). + Get("v2/alerts/requests/{requestID}") + if err != nil { + return GetAlertRequestResult{}, trace.Wrap(err) + } + defer resp.RawResponse.Body.Close() + if resp.IsError() { + return GetAlertRequestResult{}, errWrapper(resp.StatusCode(), string(resp.Body())) + } + return result, nil +} + +func (og Client) getScheduleResponders(reqData RequestData) []Responder { schedules := og.DefaultSchedules - if reqSchedules, ok := reqData.SystemAnnotations[types.TeleportNamespace+types.ReqAnnotationSchedulesLabel]; ok { + if reqSchedules, ok := reqData.SystemAnnotations[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel]; ok { schedules = reqSchedules } responders := make([]Responder, 0, len(schedules)) for _, s := range schedules { responders = append(responders, Responder{ - Type: "schedule", + Type: ResponderTypeSchedule, ID: s, }) } @@ -231,12 +278,13 @@ func (og Client) GetOnCall(ctx context.Context, scheduleName string) (Responders SetContext(ctx). SetPathParams(map[string]string{"scheduleName": scheduleName}). SetQueryParams(map[string]string{ + // This is required to lookup schedules by name (as opposed to lookup by ID) "scheduleIdentifierType": "name", // When flat is enabled it returns the email addresses of on-call participants. "flat": "true", }). SetResult(&result). - Post("v2/schedules/{scheduleName}/on-calls") + Get("v2/schedules/{scheduleName}/on-calls") if err != nil { return RespondersResult{}, trace.Wrap(err) } diff --git a/integrations/access/opsgenie/client_test.go b/integrations/access/opsgenie/client_test.go index abe2caf072a4c..04e560bb27423 100644 --- a/integrations/access/opsgenie/client_test.go +++ b/integrations/access/opsgenie/client_test.go @@ -36,6 +36,9 @@ import ( func TestCreateAlert(t *testing.T) { recievedReq := "" testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { + if req.URL.Path != "/v2/alerts" { + return + } bodyBytes, err := io.ReadAll(req.Body) if err != nil { log.Fatal(err) @@ -56,7 +59,7 @@ func TestCreateAlert(t *testing.T) { Roles: []string{"role1", "role2"}, RequestReason: "someReason", SystemAnnotations: types.Labels{ - types.TeleportNamespace + types.ReqAnnotationSchedulesLabel: {"responder@teleport.com"}, + types.TeleportNamespace + types.ReqAnnotationNotifySchedulesLabel: {"responder@teleport.com"}, }, }) assert.NoError(t, err) diff --git a/integrations/access/opsgenie/config.go b/integrations/access/opsgenie/config.go index 1090967a587cf..5d0fec5705dec 100644 --- a/integrations/access/opsgenie/config.go +++ b/integrations/access/opsgenie/config.go @@ -19,6 +19,7 @@ package opsgenie import ( + "context" "net/url" "github.com/gravitational/trace" @@ -26,6 +27,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/auth" + "github.com/gravitational/teleport/integrations/access/common/teleport" ) // Config stores the full configuration for the teleport-opsgenie plugin to run. @@ -38,6 +40,14 @@ type Config struct { // AccessTokenProvider provides a method to get the bearer token // for use when authorizing to a 3rd-party provider API. AccessTokenProvider auth.AccessTokenProvider + + // Teleport is a handle to the client to use when communicating with + // the Teleport auth server. The ServiceNow app will create a gRPC-based + // client on startup if this is not set. + Client teleport.Client + // TeleportUserName is the name of the Teleport user that will act + // as the access request approver. + TeleportUserName string } // CheckAndSetDefaults checks the config struct for any logical errors, and sets default values @@ -73,6 +83,14 @@ func (c *Config) CheckAndSetDefaults() error { return nil } +// GetTeleportClient returns the configured Teleport client. +func (c *Config) GetTeleportClient(ctx context.Context) (teleport.Client, error) { + if c.Client != nil { + return c.Client, nil + } + return c.BaseConfig.GetTeleportClient(ctx) +} + // NewBot initializes the new Opsgenie message generator (OpsgenieBot) func (c *Config) NewBot(clusterName, webProxyAddr string) (common.MessagingBot, error) { webProxyURL, err := url.Parse(webProxyAddr) diff --git a/integrations/access/opsgenie/fake_opsgenie_test.go b/integrations/access/opsgenie/fake_opsgenie_test.go index 87fcf06ac2507..f1180f5fb73cf 100644 --- a/integrations/access/opsgenie/fake_opsgenie_test.go +++ b/integrations/access/opsgenie/fake_opsgenie_test.go @@ -99,7 +99,21 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { opsgenie.StoreAlert(alert) opsgenie.newAlerts <- alert - err = json.NewEncoder(rw).Encode(AlertResult{Alert: alert}) + err = json.NewEncoder(rw).Encode(opsgenie.CreateAlertResult{RequestID: alert.ID}) + panicIf(err) + }) + router.GET("/v2/alerts/requests/:requestID", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { + rw.Header().Add("Content-Type", "application/json") + rw.WriteHeader(http.StatusCreated) + + requestID := ps.ByName("requestID") + err := json.NewEncoder(rw).Encode(opsgenie.GetAlertRequestResult{ + Data: struct { + AlertID string `json:"alertId"` + }{ + AlertID: requestID, + }, + }) panicIf(err) }) router.POST("/v2/alerts/:alertID/close", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { @@ -142,7 +156,39 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { panicIf(err) }) - return opsgenie + router.GET("/v2/schedules/:scheduleName/on-calls", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { + rw.Header().Add("Content-Type", "application/json") + scheduleName := ps.ByName("scheduleName") + + // Check if exists + _, ok := mock.GetSchedule(scheduleName) + if !ok { + rw.WriteHeader(http.StatusNotFound) + return + } + + emails := mock.GetOnCallEmailsForSchedule(scheduleName) + + response := opsgenie.RespondersResult{ + Data: struct { + OnCallRecipients []string `json:"onCallRecipients,omitempty"` + }( + struct { + OnCallRecipients []string + }{ + OnCallRecipients: emails, + }, + ), + } + + rw.WriteHeader(http.StatusOK) + err := json.NewEncoder(rw).Encode(response) + panicIf(err) + }) + router.GET("/v2/heartbeats/teleport-access-heartbeat/ping", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { + rw.WriteHeader(http.StatusOK) + }) + return mock } func (s *FakeOpsgenie) URL() string { @@ -234,8 +280,62 @@ func (s *FakeOpsgenie) CheckNewAlertNote(ctx context.Context) (FakeAlertNote, er } } +// StoreSchedule upserts a schedule. To simplify the implementation, the schedule +// is not given a UUID, we use its name. This is possible because we get the on-call +// list in Client.GetOnCall() by passing the param "scheduleIdentifierType": "name". +// The function also creates a responder for the schedule and returns it. +// The schedule can then be directly notified as a responder, or queried for +// on-call users as a schedule. +func (s *FakeOpsgenie) StoreSchedule(scheduleName string, responders ...opsgenie.Responder) opsgenie.Responder { + key := fmt.Sprintf("schedule-%s", scheduleName) + s.objects.Store(key, responders) + responder := opsgenie.Responder{ + Name: scheduleName, + Type: opsgenie.ResponderTypeSchedule, + } + responder = s.StoreResponder(responder) + return responder +} + +// GetSchedule gets a schedule. +func (s *FakeOpsgenie) GetSchedule(scheduleName string) ([]opsgenie.Responder, bool) { + key := fmt.Sprintf("schedule-%s", scheduleName) + value, ok := s.objects.Load(key) + if !ok { + return nil, false + } + responders, ok := value.([]opsgenie.Responder) + if !ok { + panic("cannot cast schedule object as a responder slice") + } + return responders, true +} + func panicIf(err error) { if err != nil { log.Panicf("%v at %v", err, string(debug.Stack())) } } + +func (s *FakeOpsgenie) GetOnCallEmailsForSchedule(scheduleName string) []string { + var emails []string + responders, ok := s.GetSchedule(scheduleName) + if !ok { + return nil + } + for _, responder := range responders { + switch responder.Type { + case opsgenie.ResponderTypeSchedule: + emails = append(emails, s.GetOnCallEmailsForSchedule(responder.Name)...) + case opsgenie.ResponderTypeUser: + // If the responder is a user, we return its email + emails = append(emails, responder.Name) + default: + // We don't implement "team" and "escalation" responder types because + // we don't test those yet. + } + + } + + return emails +} diff --git a/integrations/access/opsgenie/types.go b/integrations/access/opsgenie/types.go index 6aa42993b89d3..daa1a993d8a11 100644 --- a/integrations/access/opsgenie/types.go +++ b/integrations/access/opsgenie/types.go @@ -46,13 +46,20 @@ type AlertBody struct { Priority string `json:"priority,omitempty"` } -// Responder represents an Opsgenie responder +// Responder represents an Opsgenie responder. +// A responder is an entity that receives an alert. +// It can be a user, a team, or a schedule. +// The OpsGenie access plugin interacts with 2 types of responders: +// - it sends notifications to schedule responders +// - for auto-approval it looks up who the responders are for a given +// schedule and approves the request if a responder name matches the +// requester name. type Responder struct { // Name is the name of the responder. Name string `json:"name,omitempty"` // Username is the opsgenie username of the responder. Username string `json:"username,omitempty"` - // Type is the type of responder team/user + // Type is the type of responder team/user/schedule. Type string `json:"type,omitempty"` // ID is the ID of the responder. ID string `json:"id,omitempty"` @@ -69,7 +76,7 @@ type RespondersResult struct { // AlertResult is a wrapper around Alert type AlertResult struct { // Alert contains the actual alert data. - Alert Alert `json:"alert"` + Alert Alert `json:"data"` } // AlertNote represents an Opsgenie alert note @@ -81,3 +88,17 @@ type AlertNote struct { // Note is the alert note. Note string `json:"note"` } + +// CreateAlertResult represents the resulting request information from an Opsgenie create alert request. +type CreateAlertResult struct { + Result string `json:"result"` + Took float64 `json:"took"` + RequestID string `json:"requestId"` +} + +// GetAlertRequestResult represents the response of a completed Opsgenie create alert request. +type GetAlertRequestResult struct { + Data struct { + AlertID string `json:"alertId"` + } `json:"data"` +} diff --git a/integrations/access/servicenow/app.go b/integrations/access/servicenow/app.go index 548c0bce7fa1d..b5e0488d034dd 100644 --- a/integrations/access/servicenow/app.go +++ b/integrations/access/servicenow/app.go @@ -317,7 +317,7 @@ func (a *App) onDeletedRequest(ctx context.Context, reqID string) error { } func (a *App) getOnCallServiceNames(req types.AccessRequest) ([]string, error) { - services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationSchedulesLabel] + services, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel] if !ok { return nil, trace.NotFound("on-call schedules not specified") } From eda3fed6abc25c0bad5a06af9f7cf749151dc3ab Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Wed, 10 Apr 2024 16:56:03 +0100 Subject: [PATCH 2/6] Fix behaviour when only notify label is set And add tests for accessrequest app --- integrations/access/accessrequest/app.go | 11 +- integrations/access/accessrequest/app_test.go | 100 ++++++++++++++++++ 2 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 integrations/access/accessrequest/app_test.go diff --git a/integrations/access/accessrequest/app.go b/integrations/access/accessrequest/app.go index 51b38109c2deb..5d1b5aeaa1f14 100644 --- a/integrations/access/accessrequest/app.go +++ b/integrations/access/accessrequest/app.go @@ -355,15 +355,10 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) // When both notify-services and approve-schedules are present, each is used for their own intended purpose. recipients := make([]string, 0) if approveSchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel]; ok { - if notifySchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel]; ok { - recipients = notifySchedules - } else { - // When only approve-schedules annotation is present - // it is used for both notifications and auto-approval to keep the behavior there is now. recipients = approveSchedules - } - } else { - return recipientSet.ToSlice() + } + if notifySchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel]; ok { + recipients = notifySchedules } for _, recipient := range recipients { rec, err := a.bot.FetchRecipient(ctx, recipient) diff --git a/integrations/access/accessrequest/app_test.go b/integrations/access/accessrequest/app_test.go new file mode 100644 index 0000000000000..4a992f143b634 --- /dev/null +++ b/integrations/access/accessrequest/app_test.go @@ -0,0 +1,100 @@ +package accessrequest + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/wrappers" + "github.com/gravitational/teleport/integrations/access/common" +) + +func TestOpsGenieGetMessageRecipients(t *testing.T) { + a := App{pluginType: types.PluginTypeOpsgenie, bot: testBot{}} + ctx := context.Background() + tests := []struct { + name string + annotations map[string][]string + expectedRecipients []common.Recipient + }{ + { + name: "no annotation", + annotations: map[string][]string{}, + expectedRecipients: []common.Recipient{}, + }, + { + name: "just notify-schedules", + annotations: map[string][]string{ + types.TeleportNamespace + types.ReqAnnotationNotifySchedulesLabel: {"foo", "bar"}, + }, + expectedRecipients: []common.Recipient{ + { + Name: "foo", + ID: "foo", + }, + { + Name: "bar", + ID: "bar", + }, + }, + }, + { + name: "just approval-schedules", + annotations: map[string][]string{ + types.TeleportNamespace + types.ReqAnnotationApproveSchedulesLabel: {"foo", "bar"}, + }, + expectedRecipients: []common.Recipient{ + { + Name: "foo", + ID: "foo", + }, + { + Name: "bar", + ID: "bar", + }, + }, + }, + { + name: "both notify and approval schedules", + annotations: map[string][]string{ + types.TeleportNamespace + types.ReqAnnotationNotifySchedulesLabel: {"foo", "bar"}, + types.TeleportNamespace + types.ReqAnnotationApproveSchedulesLabel: {"baz", "hello"}, + }, + expectedRecipients: []common.Recipient{ + { + Name: "foo", + ID: "foo", + }, + { + Name: "bar", + ID: "bar", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req := &types.AccessRequestV3{ + Spec: types.AccessRequestSpecV3{ + SystemAnnotations: wrappers.Traits(tt.annotations), + }, + } + recipients := a.getMessageRecipients(ctx, req) + require.Equal(t, tt.expectedRecipients, recipients) + }) + } + +} + +type testBot struct { + MessagingBot +} + +func (testBot) FetchRecipient(ctx context.Context, recipient string) (*common.Recipient, error) { + return &common.Recipient{ + Name: recipient, + ID: recipient, + }, nil +} From ac242c28e525fd064e350c8ac05b8ae6cffbbc88 Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Wed, 10 Apr 2024 17:23:33 +0100 Subject: [PATCH 3/6] Fix opsgenie tests --- .../access/opsgenie/fake_opsgenie_test.go | 26 +++++++++---------- integrations/access/opsgenie/opsgenie_test.go | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/integrations/access/opsgenie/fake_opsgenie_test.go b/integrations/access/opsgenie/fake_opsgenie_test.go index f1180f5fb73cf..f2dd32b3f7e66 100644 --- a/integrations/access/opsgenie/fake_opsgenie_test.go +++ b/integrations/access/opsgenie/fake_opsgenie_test.go @@ -99,7 +99,7 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { opsgenie.StoreAlert(alert) opsgenie.newAlerts <- alert - err = json.NewEncoder(rw).Encode(opsgenie.CreateAlertResult{RequestID: alert.ID}) + err = json.NewEncoder(rw).Encode(CreateAlertResult{RequestID: alert.ID}) panicIf(err) }) router.GET("/v2/alerts/requests/:requestID", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { @@ -107,7 +107,7 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { rw.WriteHeader(http.StatusCreated) requestID := ps.ByName("requestID") - err := json.NewEncoder(rw).Encode(opsgenie.GetAlertRequestResult{ + err := json.NewEncoder(rw).Encode(GetAlertRequestResult{ Data: struct { AlertID string `json:"alertId"` }{ @@ -161,15 +161,15 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { scheduleName := ps.ByName("scheduleName") // Check if exists - _, ok := mock.GetSchedule(scheduleName) + _, ok := opsgenie.GetSchedule(scheduleName) if !ok { rw.WriteHeader(http.StatusNotFound) return } - emails := mock.GetOnCallEmailsForSchedule(scheduleName) + emails := opsgenie.GetOnCallEmailsForSchedule(scheduleName) - response := opsgenie.RespondersResult{ + response := RespondersResult{ Data: struct { OnCallRecipients []string `json:"onCallRecipients,omitempty"` }( @@ -188,7 +188,7 @@ func NewFakeOpsgenie(concurrency int) *FakeOpsgenie { router.GET("/v2/heartbeats/teleport-access-heartbeat/ping", func(rw http.ResponseWriter, r *http.Request, ps httprouter.Params) { rw.WriteHeader(http.StatusOK) }) - return mock + return opsgenie } func (s *FakeOpsgenie) URL() string { @@ -286,25 +286,25 @@ func (s *FakeOpsgenie) CheckNewAlertNote(ctx context.Context) (FakeAlertNote, er // The function also creates a responder for the schedule and returns it. // The schedule can then be directly notified as a responder, or queried for // on-call users as a schedule. -func (s *FakeOpsgenie) StoreSchedule(scheduleName string, responders ...opsgenie.Responder) opsgenie.Responder { +func (s *FakeOpsgenie) StoreSchedule(scheduleName string, responders ...Responder) Responder { key := fmt.Sprintf("schedule-%s", scheduleName) s.objects.Store(key, responders) - responder := opsgenie.Responder{ + responder := Responder{ Name: scheduleName, - Type: opsgenie.ResponderTypeSchedule, + Type: ResponderTypeSchedule, } responder = s.StoreResponder(responder) return responder } // GetSchedule gets a schedule. -func (s *FakeOpsgenie) GetSchedule(scheduleName string) ([]opsgenie.Responder, bool) { +func (s *FakeOpsgenie) GetSchedule(scheduleName string) ([]Responder, bool) { key := fmt.Sprintf("schedule-%s", scheduleName) value, ok := s.objects.Load(key) if !ok { return nil, false } - responders, ok := value.([]opsgenie.Responder) + responders, ok := value.([]Responder) if !ok { panic("cannot cast schedule object as a responder slice") } @@ -325,9 +325,9 @@ func (s *FakeOpsgenie) GetOnCallEmailsForSchedule(scheduleName string) []string } for _, responder := range responders { switch responder.Type { - case opsgenie.ResponderTypeSchedule: + case ResponderTypeSchedule: emails = append(emails, s.GetOnCallEmailsForSchedule(responder.Name)...) - case opsgenie.ResponderTypeUser: + case ResponderTypeUser: // If the responder is a user, we return its email emails = append(emails, responder.Name) default: diff --git a/integrations/access/opsgenie/opsgenie_test.go b/integrations/access/opsgenie/opsgenie_test.go index 5a86d8cb177ef..75471c7f79ce0 100644 --- a/integrations/access/opsgenie/opsgenie_test.go +++ b/integrations/access/opsgenie/opsgenie_test.go @@ -39,7 +39,7 @@ import ( const ( NotifyServiceName = "Teleport Notifications" - NotifyServiceAnnotation = types.TeleportNamespace + types.ReqAnnotationNotifyServicesLabel + NotifyServiceAnnotation = types.TeleportNamespace + types.ReqAnnotationNotifySchedulesLabel ResponderName1 = "Responder 1" ResponderName2 = "Responder 2" ResponderName3 = "Responder 3" From 0d08d3cc2b497c4e21c86b5b63ed5a0989d43c39 Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Thu, 11 Apr 2024 15:25:34 +0100 Subject: [PATCH 4/6] Update servicenow tests to use new name for annotations --- integrations/access/servicenow/servicenow_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/access/servicenow/servicenow_test.go b/integrations/access/servicenow/servicenow_test.go index 105e172917053..ab1528c9fe1d9 100644 --- a/integrations/access/servicenow/servicenow_test.go +++ b/integrations/access/servicenow/servicenow_test.go @@ -38,7 +38,7 @@ import ( ) const ( - ScheduleAnnotation = types.TeleportNamespace + types.ReqAnnotationSchedulesLabel + ScheduleAnnotation = types.TeleportNamespace + types.ReqAnnotationApproveSchedulesLabel Schedule = "someRotaID" ResponderName1 = "ResponderID1" ResponderName2 = "RespondeID2" From c7f0764708348e4e93e036f31b0315e659705583 Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Thu, 11 Apr 2024 15:32:34 +0100 Subject: [PATCH 5/6] Appease linter --- integrations/access/accessrequest/app.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/access/accessrequest/app.go b/integrations/access/accessrequest/app.go index 5d1b5aeaa1f14..6dfd78470c460 100644 --- a/integrations/access/accessrequest/app.go +++ b/integrations/access/accessrequest/app.go @@ -355,10 +355,10 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) // When both notify-services and approve-schedules are present, each is used for their own intended purpose. recipients := make([]string, 0) if approveSchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationApproveSchedulesLabel]; ok { - recipients = approveSchedules + recipients = approveSchedules } if notifySchedules, ok := req.GetSystemAnnotations()[types.TeleportNamespace+types.ReqAnnotationNotifySchedulesLabel]; ok { - recipients = notifySchedules + recipients = notifySchedules } for _, recipient := range recipients { rec, err := a.bot.FetchRecipient(ctx, recipient) From ce686dce911b48c88634a0a29c241b89088a38e3 Mon Sep 17 00:00:00 2001 From: EdwardDowling Date: Mon, 15 Apr 2024 17:16:28 +0100 Subject: [PATCH 6/6] Add missing license --- integrations/access/accessrequest/app_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/integrations/access/accessrequest/app_test.go b/integrations/access/accessrequest/app_test.go index 4a992f143b634..a4ad5520bc224 100644 --- a/integrations/access/accessrequest/app_test.go +++ b/integrations/access/accessrequest/app_test.go @@ -1,3 +1,21 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + package accessrequest import (