diff --git a/odpf/siren/v1beta1/siren.proto b/odpf/siren/v1beta1/siren.proto new file mode 100644 index 00000000..d1e37b8e --- /dev/null +++ b/odpf/siren/v1beta1/siren.proto @@ -0,0 +1,634 @@ +syntax = "proto3"; +package odpf.siren.v1beta1; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/descriptor.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "validate/validate.proto"; + +option go_package = "github.com/odpf/proton/siren/v1beta1;sirenv1beta1"; +option java_multiple_files = true; +option java_package = "io.odpf.proton.siren"; +option java_outer_classname = "ServiceManager"; + +// These annotations are used when generating the OpenAPI file. +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + info: { + title: "Siren APIs"; + description: "Documentation of our Siren API with gRPC and\ngRPC-Gateway."; + version: "0.3.0"; + }; + schemes: HTTP; +}; + +service SirenService { + rpc Ping(PingRequest) returns (PingResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "ping"; + tags: "Ping"; + }; + + option (google.api.http) = { + get: "/ping" + }; + } + + + rpc ListProviders(ListProvidersRequest) returns (ListProvidersResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list providers"; + tags: "Provider"; + }; + + option (google.api.http) = { + get: "/v1beta1/providers" + }; + } + + rpc CreateProvider(CreateProviderRequest) returns (Provider) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "create a provider"; + tags: "Provider"; + }; + + option (google.api.http) = { + post: "/v1beta1/providers" + body: "*" + }; + } + + rpc GetProvider(GetProviderRequest) returns (Provider) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "get a provider"; + tags: "Provider"; + }; + + option (google.api.http) = { + get: "/v1beta1/providers/{id}" + }; + } + + rpc UpdateProvider(UpdateProviderRequest) returns (Provider) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "update a provider"; + tags: "Provider"; + }; + + option (google.api.http) = { + put: "/v1beta1/providers/{id}", + body: "*" + }; + } + + rpc DeleteProvider(DeleteProviderRequest) returns (google.protobuf.Empty) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "delete a provider"; + tags: "Provider"; + }; + + option (google.api.http) = { + delete: "/v1beta1/providers/{id}" + }; + } + + rpc SendReceiverNotification(SendReceiverNotificationRequest) returns (SendReceiverNotificationResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "send notification to receiver"; + tags: "Receiver"; + }; + + option (google.api.http) = { + post: "/v1beta1/receivers/{id}/send" + body: "*" + }; + } + + + rpc ListNamespaces(google.protobuf.Empty) returns (ListNamespacesResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list namespaces"; + tags: "Namespace"; + }; + + option (google.api.http) = { + get: "/v1beta1/namespaces" + }; + } + + rpc CreateNamespace(CreateNamespaceRequest) returns (Namespace) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "create a namespace"; + tags: "Namespace"; + }; + + option (google.api.http) = { + post: "/v1beta1/namespaces" + body: "*" + }; + } + + rpc GetNamespace(GetNamespaceRequest) returns (Namespace) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "get a namespace"; + tags: "Namespace"; + }; + + option (google.api.http) = { + get: "/v1beta1/namespaces/{id}" + }; + } + + rpc UpdateNamespace(UpdateNamespaceRequest) returns (Namespace) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "update a namespace"; + tags: "Namespace"; + }; + + option (google.api.http) = { + put: "/v1beta1/namespaces/{id}", + body: "*" + }; + } + + rpc DeleteNamespace(DeleteNamespaceRequest) returns (google.protobuf.Empty) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "delete a namespace"; + tags: "Namespace"; + }; + + option (google.api.http) = { + delete: "/v1beta1/namespaces/{id}" + }; + } + + + rpc ListReceivers(google.protobuf.Empty) returns (ListReceiversResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list receivers"; + tags: "Receiver"; + }; + + option (google.api.http) = { + get: "/v1beta1/receivers" + }; + } + + rpc CreateReceiver(CreateReceiverRequest) returns (Receiver) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "create a receiver"; + tags: "Receiver"; + }; + + option (google.api.http) = { + post: "/v1beta1/receivers" + body: "*" + }; + } + + rpc GetReceiver(GetReceiverRequest) returns (Receiver) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "get a receiver"; + tags: "Receiver"; + }; + + option (google.api.http) = { + get: "/v1beta1/receivers/{id}" + }; + } + + rpc UpdateReceiver(UpdateReceiverRequest) returns (Receiver) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "update a receiver"; + tags: "Receiver"; + }; + + option (google.api.http) = { + put: "/v1beta1/receivers/{id}", + body: "*" + }; + } + + rpc DeleteReceiver(DeleteReceiverRequest) returns (google.protobuf.Empty) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "delete a receiver"; + tags: "Receiver"; + }; + + option (google.api.http) = { + delete: "/v1beta1/receivers/{id}" + }; + } + + + rpc ListAlerts(ListAlertsRequest) returns (Alerts) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list alerts"; + tags: "Alert"; + }; + + option (google.api.http) = { + get: "/v1beta1/alerts/{provider_name}/{provider_id}" + }; + } + + rpc CreateCortexAlerts(CreateCortexAlertsRequest) returns (Alerts) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "create cortex alerts"; + tags: "Alert"; + }; + + option (google.api.http) = { + post: "/v1beta1/alerts/cortex/{provider_id}" + body: "*" + }; + } + + + rpc ListRules(ListRulesRequest) returns (ListRulesResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list rules"; + tags: "Rule"; + }; + + option (google.api.http) = { + get: "/v1beta1/rules" + }; + } + + rpc UpdateRule(UpdateRuleRequest) returns (UpdateRuleResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "add/update a rule"; + tags: "Rule"; + }; + + option (google.api.http) = { + put: "/v1beta1/rules" + body: "*" + }; + } + + + rpc ListTemplates(ListTemplatesRequest) returns (ListTemplatesResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "list templates"; + tags: "Template"; + }; + + option (google.api.http) = { + get: "/v1beta1/templates" + }; + } + + rpc GetTemplateByName(GetTemplateByNameRequest) returns (TemplateResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "get a template"; + tags: "Template"; + }; + + option (google.api.http) = { + get: "/v1beta1/templates/{name}" + }; + } + + rpc UpsertTemplate(UpsertTemplateRequest) returns (TemplateResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "add/update a template"; + tags: "Template"; + }; + + option (google.api.http) = { + put: "/v1beta1/templates", + body: "*" + }; + } + + rpc DeleteTemplate(DeleteTemplateRequest) returns (DeleteTemplateResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "delete a template"; + tags: "Template"; + }; + + option (google.api.http) = { + delete: "/v1beta1/templates/{name}", + }; + } + + rpc RenderTemplate(RenderTemplateRequest) returns (RenderTemplateResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "render a template"; + tags: "Template"; + }; + + option (google.api.http) = { + post: "/v1beta1/templates/{name}/render", + body: "*" + }; + } +} + +message PingRequest {} + +message PingResponse { + string message = 1; +} + +enum Types { + CORTEX = 0; +} + +message Provider { + uint64 id = 1; + string host = 2; + string urn = 3; + string name = 4; + string type = 5 [(validate.rules).string = {in: ["cortex"]}]; + google.protobuf.Struct credentials = 6; + map labels = 7; + google.protobuf.Timestamp created_at = 8; + google.protobuf.Timestamp updated_at = 9; +} + +message ListProvidersRequest { + string urn = 1; + string type = 2; +} + +message ListProvidersResponse { + repeated Provider providers = 1; +} + +message CreateProviderRequest { + string host = 1 [(validate.rules).string.uri = true]; + string urn = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string name = 3 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string type = 4 [(validate.rules).string = {in: ["cortex"]}]; + google.protobuf.Struct credentials = 5; + map labels = 6; +} + +message GetProviderRequest { + uint64 id = 1; +} + +message UpdateProviderRequest { + uint64 id = 1; + string host = 2 [(validate.rules).string.uri = true]; + string name = 3 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string type = 4 [(validate.rules).string = {in: ["cortex"]}]; + google.protobuf.Struct credentials = 5; + map labels = 6; +} + +message DeleteProviderRequest { + uint64 id = 1; +} + + +message Namespace { + uint64 id = 1; + string urn = 2; + string name = 3; + uint64 provider = 4; + google.protobuf.Struct credentials = 5; + map labels = 6; + google.protobuf.Timestamp created_at = 7; + google.protobuf.Timestamp updated_at = 8; +} + +message ListNamespacesResponse { + repeated Namespace namespaces = 1; +} + +message CreateNamespaceRequest { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string urn = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + uint64 provider = 3; + google.protobuf.Struct credentials = 4; + map labels = 5; + google.protobuf.Timestamp created_at = 6; + google.protobuf.Timestamp updated_at = 7; +} + +message GetNamespaceRequest { + uint64 id = 1; +} + +message UpdateNamespaceRequest { + uint64 id = 1; + string name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + uint64 provider = 3; + google.protobuf.Struct credentials = 4; + map labels = 5; +} + +message DeleteNamespaceRequest { + uint64 id = 1; +} + +message Receiver { + uint64 id = 1; + string name = 2; + string type = 3 [(validate.rules).string = {in: ["slack", "pagerduty", "http"]}]; + map labels = 4; + google.protobuf.Struct configurations = 5; + google.protobuf.Struct data = 6; + google.protobuf.Timestamp created_at = 7; + google.protobuf.Timestamp updated_at = 8; +} + +message ListReceiversResponse { + repeated Receiver receivers = 1; +} + +message CreateReceiverRequest { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_.-]+$"]; + string type = 2 [(validate.rules).string = {in: ["slack", "pagerduty", "http"]}]; + map labels = 3; + google.protobuf.Struct configurations = 4; +} + +message GetReceiverRequest { + uint64 id = 1; +} + +message UpdateReceiverRequest { + uint64 id = 1; + string name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_.-]+$"]; + string type = 3 [(validate.rules).string = {in: ["slack", "pagerduty", "http"]}]; + map labels = 4; + google.protobuf.Struct configurations = 5; +} + +message DeleteReceiverRequest { + uint64 id = 1; +} + +message SendReceiverNotificationRequest{ + uint64 id = 1; + message SlackPayload { + string message = 1; + string receiver_name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string receiver_type = 3 [(validate.rules).string = {in: ["channel", "user"]}]; + repeated google.protobuf.Struct blocks = 4; + } + + oneof data { + SlackPayload slack = 2; + } +} + +message SendReceiverNotificationResponse { + bool ok = 1; +} + +message ListAlertsRequest { + string provider_name = 1 [(validate.rules).string = {in: ["cortex"]}]; + uint64 provider_id = 2; + string resource_name = 3 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + uint64 start_time = 4; + uint64 end_time = 5; +} + +message Alerts { + repeated Alert alerts = 1; +} + +message Alert { + uint64 id = 1; + uint64 provider_id = 2; + string resource_name = 3; + string metric_name = 4; + string metric_value = 5; + string severity = 6; + string rule = 7; + google.protobuf.Timestamp triggered_at = 8; +} + +message CreateCortexAlertsRequest { + uint64 provider_id = 1; + repeated CortexAlert alerts = 2; +} + +message CortexAlert { + Annotations annotations = 1; + Labels labels = 2; + string status = 3; + google.protobuf.Timestamp starts_at=4; +} + +message Annotations { + string metric_name = 1; + string metric_value = 2; + string resource = 3; + string template = 4; +} + +message Labels { + string severity = 1; +} + +message Rule { + uint64 id = 1; + string name = 2; + bool enabled = 3; + string group_name = 4; + string namespace = 5; + string template = 6; + repeated Variables variables = 7; + google.protobuf.Timestamp created_at = 8; + google.protobuf.Timestamp updated_at = 9; + uint64 provider_namespace = 10 [(validate.rules).uint64.gte = 0];; +} + +message Variables { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string value = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string type = 3; + string description = 4; +} + + +message ListRulesRequest { + string name = 1; + string namespace = 2; + string group_name = 3; + string template = 4; + uint64 provider_namespace = 5; +} + +message ListRulesResponse { + repeated Rule rules = 1; +} + +message UpdateRuleResponse { + Rule rule = 1; +} + +message UpdateRuleRequest { + bool enabled = 1; + string group_name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string namespace = 3 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string template = 4 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + repeated Variables variables = 5; + uint64 provider_namespace = 6; +} + +message ListTemplatesRequest{ + string tag = 1; +} + +message TemplateVariables { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string type = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string default = 3; + string description = 4; +} + +message Template { + uint64 id = 1; + string name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string body = 3 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + repeated string tags = 4 [(validate.rules).repeated.min_items = 1]; + google.protobuf.Timestamp created_at = 5; + google.protobuf.Timestamp updated_at = 6; + repeated TemplateVariables variables = 7 [(validate.rules).repeated.min_items = 1]; +} + +message TemplateResponse { + Template template = 1; +} + +message UpsertTemplateRequest { + uint64 id = 1; + string name = 2 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + string body = 3; + repeated string tags = 4 [(validate.rules).repeated.min_items = 1]; + repeated TemplateVariables variables = 5 [(validate.rules).repeated.min_items = 1]; +} + +message ListTemplatesResponse { + repeated Template templates = 1; +} + +message GetTemplateByNameRequest { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; +} + +message DeleteTemplateRequest { + string name = 1; +} + +message DeleteTemplateResponse {} + +message RenderTemplateRequest { + string name = 1 [(validate.rules).string.pattern = "^[A-Za-z0-9_-]+$"]; + map variables = 2; +} + +message RenderTemplateResponse { + string body = 1; +}