// Copyright 2019 Google LLC. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // syntax = "proto3"; package google.cloud.irm.v1alpha2; import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/cloud/irm/v1alpha2/incidents.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/timestamp.proto"; option cc_enable_arenas = true; option go_package = "google.golang.org/genproto/googleapis/cloud/irm/v1alpha2;irm"; option java_multiple_files = true; option java_package = "com.google.irm.service.v1alpha2.api"; // The Incident API for Incident Response & Management. service IncidentService { option (google.api.default_host) = "irm.googleapis.com"; option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform"; // Creates a new incident. rpc CreateIncident(CreateIncidentRequest) returns (Incident) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*}/incidents" body: "incident" }; option (google.api.method_signature) = "incident,parent"; } // Returns an incident by name. rpc GetIncident(GetIncidentRequest) returns (Incident) { option (google.api.http) = { get: "/v1alpha2/{name=projects/*/incidents/*}" }; option (google.api.method_signature) = "name"; } // Returns a list of incidents. // Incidents are ordered by start time, with the most recent incidents first. rpc SearchIncidents(SearchIncidentsRequest) returns (SearchIncidentsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*}/incidents:search" }; option (google.api.method_signature) = "parent,query,time_zone"; } // Updates an existing incident. rpc UpdateIncident(UpdateIncidentRequest) returns (Incident) { option (google.api.http) = { patch: "/v1alpha2/{incident.name=projects/*/incidents/*}" body: "incident" }; option (google.api.method_signature) = "incident,update_mask"; } // Returns a list of incidents that are "similar" to the specified incident // or signal. This functionality is provided on a best-effort basis and the // definition of "similar" is subject to change. rpc SearchSimilarIncidents(SearchSimilarIncidentsRequest) returns (SearchSimilarIncidentsResponse) { option (google.api.http) = { get: "/v1alpha2/{name=projects/*/incidents/*}:searchSimilar" additional_bindings { get: "/v1alpha2/{name=projects/*/signals/*}:searchSimilarIncidents" } }; option (google.api.method_signature) = "name"; } // Creates an annotation on an existing incident. Only 'text/plain' and // 'text/markdown' annotations can be created via this method. rpc CreateAnnotation(CreateAnnotationRequest) returns (Annotation) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*/incidents/*}/annotations" body: "annotation" }; option (google.api.method_signature) = "parent,annotation"; } // Lists annotations that are part of an incident. No assumptions should be // made on the content-type of the annotation returned. rpc ListAnnotations(ListAnnotationsRequest) returns (ListAnnotationsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*/incidents/*}/annotations" }; option (google.api.method_signature) = "parent"; } // Creates a tag on an existing incident. rpc CreateTag(CreateTagRequest) returns (Tag) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*/incidents/*}/tags" body: "tag" }; option (google.api.method_signature) = "parent,tag"; } // Deletes an existing tag. rpc DeleteTag(DeleteTagRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1alpha2/{name=projects/*/incidents/*/tags/*}" }; option (google.api.method_signature) = "name"; } // Lists tags that are part of an incident. rpc ListTags(ListTagsRequest) returns (ListTagsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*/incidents/*}/tags" }; option (google.api.method_signature) = "parent"; } // Creates a new signal. rpc CreateSignal(CreateSignalRequest) returns (Signal) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*}/signals" body: "signal" }; option (google.api.method_signature) = "parent,signal"; } // Lists signals that are part of an incident. // Signals are returned in reverse chronological order. // Note that search should not be relied on for critical functionality. It // has lower availability guarantees and might fail to return valid results. // Returned results might include stale or extraneous entries. rpc SearchSignals(SearchSignalsRequest) returns (SearchSignalsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*}/signals:search" }; option (google.api.method_signature) = "parent,query"; } // Finds a signal by other unique IDs. rpc LookupSignal(LookupSignalRequest) returns (Signal) { option (google.api.http) = { get: "/v1alpha2/signals:lookup" }; } // Returns a signal by name. rpc GetSignal(GetSignalRequest) returns (Signal) { option (google.api.http) = { get: "/v1alpha2/{name=projects/*/signals/*}" }; option (google.api.method_signature) = "name"; } // Updates an existing signal (for example, to assign/unassign it to an // incident). rpc UpdateSignal(UpdateSignalRequest) returns (Signal) { option (google.api.http) = { patch: "/v1alpha2/{signal.name=projects/*/signals/*}" body: "signal" }; option (google.api.method_signature) = "signal,update_mask"; } // Escalates an incident. rpc EscalateIncident(EscalateIncidentRequest) returns (EscalateIncidentResponse) { option (google.api.http) = { post: "/v1alpha2/{incident.name=projects/*/incidents/*}:escalate" body: "*" }; } // Creates a new artifact. rpc CreateArtifact(CreateArtifactRequest) returns (Artifact) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*/incidents/*}/artifacts" body: "artifact" }; option (google.api.method_signature) = "parent,artifact"; } // Returns a list of artifacts for an incident. rpc ListArtifacts(ListArtifactsRequest) returns (ListArtifactsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*/incidents/*}/artifacts" }; option (google.api.method_signature) = "parent"; } // Updates an existing artifact. rpc UpdateArtifact(UpdateArtifactRequest) returns (Artifact) { option (google.api.http) = { patch: "/v1alpha2/{artifact.name=projects/*/incidents/*/artifacts/*}" body: "artifact" }; option (google.api.method_signature) = "artifact,update_mask"; } // Deletes an existing artifact. rpc DeleteArtifact(DeleteArtifactRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1alpha2/{name=projects/*/incidents/*/artifacts/*}" }; option (google.api.method_signature) = "name"; } // Sends a summary of the shift for oncall handoff. rpc SendShiftHandoff(SendShiftHandoffRequest) returns (SendShiftHandoffResponse) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*}/shiftHandoff:send" body: "*" }; } // Creates a new subscription. // This will fail if: // a. there are too many (50) subscriptions in the incident already // b. a subscription using the given channel already exists rpc CreateSubscription(CreateSubscriptionRequest) returns (Subscription) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*/incidents/*}/subscriptions" body: "subscription" }; option (google.api.method_signature) = "parent,subscription"; } // Updates a subscription. rpc UpdateSubscription(UpdateSubscriptionRequest) returns (Subscription) { option (google.api.http) = { patch: "/v1alpha2/{subscription.name=projects/*/incidents/*/subscriptions/*}" body: "subscription" }; option (google.api.method_signature) = "subscription,update_mask"; } // Returns a list of subscriptions for an incident. rpc ListSubscriptions(ListSubscriptionsRequest) returns (ListSubscriptionsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*/incidents/*}/subscriptions" }; option (google.api.method_signature) = "parent"; } // Deletes an existing subscription. rpc DeleteSubscription(DeleteSubscriptionRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1alpha2/{name=projects/*/incidents/*/subscriptions/*}" }; option (google.api.method_signature) = "name"; } // Creates a role assignment on an existing incident. Normally, the user field // will be set when assigning a role to oneself, and the next field will be // set when proposing another user as the assignee. Setting the next field // directly to a user other than oneself is equivalent to proposing and // force-assigning the role to the user. rpc CreateIncidentRoleAssignment(CreateIncidentRoleAssignmentRequest) returns (IncidentRoleAssignment) { option (google.api.http) = { post: "/v1alpha2/{parent=projects/*/incidents/*}/roleAssignments" body: "*" }; option (google.api.method_signature) = "parent,incident_role_assignment"; } // Deletes an existing role assignment. rpc DeleteIncidentRoleAssignment(DeleteIncidentRoleAssignmentRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1alpha2/{name=projects/*/incidents/*/roleAssignments/*}" }; option (google.api.method_signature) = "name"; } // Lists role assignments that are part of an incident. rpc ListIncidentRoleAssignments(ListIncidentRoleAssignmentsRequest) returns (ListIncidentRoleAssignmentsResponse) { option (google.api.http) = { get: "/v1alpha2/{parent=projects/*/incidents/*}/roleAssignments" }; option (google.api.method_signature) = "parent"; } // Starts a role handover. The proposed assignee will receive an email // notifying them of the assignment. This will fail if a role handover is // already pending. // Handover to an oncall ladder is not permitted. Use // CreateIncidentRoleAssignment instead. rpc RequestIncidentRoleHandover(RequestIncidentRoleHandoverRequest) returns (IncidentRoleAssignment) { option (google.api.http) = { post: "/v1alpha2/{name=projects/*/incidents/*/roleAssignments/*}:requestHandover" body: "*" }; option (google.api.method_signature) = "name,new_assignee"; } // Confirms a role handover. This will fail if the 'proposed_assignee' field // of the IncidentRoleAssignment is not equal to the 'new_assignee' field of // the request. If the caller is not the new_assignee, // ForceIncidentRoleHandover should be used instead. rpc ConfirmIncidentRoleHandover(ConfirmIncidentRoleHandoverRequest) returns (IncidentRoleAssignment) { option (google.api.http) = { post: "/v1alpha2/{name=projects/*/incidents/*/roleAssignments/*}:confirmHandover" body: "*" }; option (google.api.method_signature) = "name,new_assignee"; } // Forces a role handover. This will fail if the 'proposed_assignee' field of // the IncidentRoleAssignment is not equal to the 'new_assignee' field of the // request. If the caller is the new_assignee, ConfirmIncidentRoleHandover // should be used instead. rpc ForceIncidentRoleHandover(ForceIncidentRoleHandoverRequest) returns (IncidentRoleAssignment) { option (google.api.http) = { post: "/v1alpha2/{name=projects/*/incidents/*/roleAssignments/*}:forceHandover" body: "*" }; option (google.api.method_signature) = "name,new_assignee"; } // Cancels a role handover. This will fail if the 'proposed_assignee' field of // the IncidentRoleAssignment is not equal to the 'new_assignee' field of the // request. rpc CancelIncidentRoleHandover(CancelIncidentRoleHandoverRequest) returns (IncidentRoleAssignment) { option (google.api.http) = { post: "/v1alpha2/{name=projects/*/incidents/*/roleAssignments/*}:cancelHandover" body: "*" }; option (google.api.method_signature) = "name,new_assignee"; } } // Request for the CreateIncident method. message CreateIncidentRequest { // Required. The incident to create. Incident incident = 1 [(google.api.field_behavior) = REQUIRED]; // Required. The resource name of the hosting Stackdriver project which the incident // belongs to. // The name is of the form `projects/{project_id_or_number}` // . string parent = 2 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; } // Request for the GetIncident method. message GetIncidentRequest { // Required. Resource name of the incident, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; } // Request for the UpdateIncident method. message UpdateIncidentRequest { // Required. The incident to update with the new values. Incident incident = 1 [(google.api.field_behavior) = REQUIRED]; // List of fields that should be updated. google.protobuf.FieldMask update_mask = 2; } // Request for the SearchSimilarIncidents method. message SearchSimilarIncidentsRequest { // Required. Resource name of the incident or signal, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; // Number of similar incidents to return. int32 page_size = 2; // Page token from an earlier query, as returned in 'next_page_token'. string page_token = 3; } // Response for the SearchSimilarIncidents method. message SearchSimilarIncidentsResponse { // A single search result, i.e. an incident with (potentially) additional // information. message Result { // An incident that is "similar" to the incident or signal specified in the // request. Incident incident = 1; } // The search results, ordered by descending relevance. repeated Result results = 1; // Page token to fetch the next set of similar incidents. string next_page_token = 2; } // Request for the CreateAnnotation method. message CreateAnnotationRequest { // Required. Resource name of the incident, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; // Required. Only annotation.content is an input argument. Annotation annotation = 2 [(google.api.field_behavior) = REQUIRED]; } // Request for the ListAnnotations method. message ListAnnotationsRequest { // Required. Resource name of the incident, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; // Number of annotations to return. int32 page_size = 2; // Page token from an earlier query, as returned in `next_page_token`. string page_token = 3; } // Response for the ListAnnotations method. message ListAnnotationsResponse { // List of annotations. repeated Annotation annotations = 1; // Page token to fetch the next set of annotations. string next_page_token = 2; } // Request for the CreateTag method. message CreateTagRequest { // Required. Resource name of the incident, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; // Required. Tag to create. Only tag.display_name is an input argument. Tag tag = 2 [(google.api.field_behavior) = REQUIRED]; } // Request for the DeleteTag method. message DeleteTagRequest { // Required. Resource name of the tag. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Tag" } ]; } // Request for the ListTagsForIncident method. message ListTagsRequest { // Required. Resource name of the incident, for example, // "projects/{project_id_or_number}/incidents/{incident_id}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "irm.googleapis.com/Incident" } ]; // Number of tags to return. int32 page_size = 2; // Page token from an earlier query, as returned in `next_page_token`. string page_token = 3; } // Response for the ListTagsForIncident method. message ListTagsResponse { // Tags. repeated Tag tags = 1; // Page token to fetch the next set of tags. string next_page_token = 2; } // Request for the CreateSignal method. message CreateSignalRequest { // Required. The resource name of the hosting Stackdriver project which requested // signal belongs to. string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Required. The signal to create. Signal signal = 2 [(google.api.field_behavior) = REQUIRED]; } // Request for the SearchSignals method. message SearchSignalsRequest { // Required. The resource name of the hosting Stackdriver project which requested // incidents belong to. string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // An expression that defines which signals to return. // // Search atoms can be used to match certain specific fields. Otherwise, // plain text will match text fields in the signal. // // Search atoms: // // * `start` - (timestamp) The time the signal was created. // * `title` - The title of the signal. // * `signal_state` - `open` or `closed`. State of the signal. // (e.g., `signal_state:open`) // // Timestamp formats: // // * yyyy-MM-dd - an absolute date, treated as a calendar-day-wide window. // In other words, the "<" operator will match dates before that date, the // ">" operator will match dates after that date, and the ":" operator will // match the entire day. // * yyyy-MM-ddTHH:mm - Same as above, but with minute resolution. // * yyyy-MM-ddTHH:mm:ss - Same as above, but with second resolution. // * Nd (e.g. 7d) - a relative number of days ago, treated as a moment in time // (as opposed to a day-wide span) a multiple of 24 hours ago (as opposed to // calendar days). In the case of daylight savings time, it will apply the // current timezone to both ends of the range. Note that exact matching // (e.g. `start:7d`) is unlikely to be useful because that would only match // signals created precisely at a particular instant in time. // // The absolute timestamp formats (everything starting with a year) can // optionally be followed with a UTC offset in +/-hh:mm format. Also, the 'T' // separating dates and times can optionally be replaced with a space. Note // that any timestamp containing a space or colon will need to be quoted. // // Examples: // // * `foo` - matches signals containing the word "foo" // * `"foo bar"` - matches signals containing the phrase "foo bar" // * `foo bar` or `foo AND bar` - matches signals containing the words // "foo" and "bar" // * `foo -bar` or `foo AND NOT bar` - matches signals containing the // word // "foo" but not the word "bar" // * `foo OR bar` - matches signals containing the word "foo" or the // word "bar" // * `start>2018-11-28` - matches signals which started after November // 11, 2018. // * `start<=2018-11-28` - matches signals which started on or before // November 11, 2018. // * `start:2018-11-28` - matches signals which started on November 11, // 2018. // * `start>"2018-11-28 01:02:03+04:00"` - matches signals which started // after November 11, 2018 at 1:02:03 AM according to the UTC+04 time // zone. // * `start>7d` - matches signals which started after the point in time // 7*24 hours ago // * `start>180d` - similar to 7d, but likely to cross the daylight savings // time boundary, so the end time will be 1 hour different from "now." // * `foo AND start>90d AND stagemedium`, // `severity<=minor`, etc.). // // Timestamp formats: // * yyyy-MM-dd - an absolute date, treated as a calendar-day-wide window. // In other words, the "<" operator will match dates before that date, the // ">" operator will match dates after that date, and the ":" or "=" // operators will match the entire day. // * Nd (for example, 7d) - a relative number of days ago, treated as a moment // in time (as opposed to a day-wide span). A multiple of 24 hours ago (as // opposed to calendar days). In the case of daylight savings time, it will // apply the current timezone to both ends of the range. Note that exact // matching (for example, `start:7d`) is unlikely to be useful because that // would only match incidents created precisely at a particular instant in // time. // // Examples: // // * `foo` - matches incidents containing the word "foo" // * `"foo bar"` - matches incidents containing the phrase "foo bar" // * `foo bar` or `foo AND bar` - matches incidents containing the words "foo" // and "bar" // * `foo -bar` or `foo AND NOT bar` - matches incidents containing the word // "foo" but not the word "bar" // * `foo OR bar` - matches incidents containing the word "foo" or the word // "bar" // * `start>2018-11-28` - matches incidents which started after November 11, // 2018. // * `start<=2018-11-28` - matches incidents which started on or before // November 11, 2018. // * `start:2018-11-28` - matches incidents which started on November 11, // 2018. // * `start>7d` - matches incidents which started after the point in time 7*24 // hours ago // * `start>180d` - similar to 7d, but likely to cross the daylight savings // time boundary, so the end time will be 1 hour different from "now." // * `foo AND start>90d AND stage