diff --git a/Makefile b/Makefile index dfc1974b..f83bb830 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NAME="github.com/odpf/siren" LAST_COMMIT := $(shell git rev-parse --short HEAD) LAST_TAG := "$(shell git rev-list --tags --max-count=1)" APP_VERSION := "$(shell git describe --tags ${LAST_TAG})-next" -PROTON_COMMIT := "f21015688d165bec2d859c6fca284754dd81755f" +PROTON_COMMIT := "daa6a69e9351cbe3cc0413fb31263e7be60593c1" .PHONY: all build test clean dist vet proto install @@ -17,7 +17,7 @@ test: ## Run the tests go test -race $(shell go list ./... | grep -v /test/) -covermode=atomic -coverprofile=coverage.out e2e-test: ## Run all e2e tests - go test -v -race ./test/e2e_test/... -coverprofile=coverage.out --timeout 180s + go test -v -race ./test/e2e_test/... -coverprofile=coverage.out --timeout 300s coverage: ## Print code coverage go test -race -coverprofile coverage.out -covermode=atomic ./... && go tool cover -html=coverage.out diff --git a/core/alert/alert.go b/core/alert/alert.go index 21006960..5678f70d 100644 --- a/core/alert/alert.go +++ b/core/alert/alert.go @@ -14,6 +14,7 @@ type Repository interface { type Alert struct { ID uint64 `json:"id"` ProviderID uint64 `json:"provider_id"` + NamespaceID uint64 `json:"namespace_id"` ResourceName string `json:"resource_name"` MetricName string `json:"metric_name"` MetricValue string `json:"metric_value"` diff --git a/core/alert/filter.go b/core/alert/filter.go index 7baaf976..7892e7b8 100644 --- a/core/alert/filter.go +++ b/core/alert/filter.go @@ -3,6 +3,7 @@ package alert type Filter struct { ResourceName string ProviderID uint64 + NamespaceID uint64 StartTime int64 EndTime int64 } diff --git a/core/alert/mocks/alert_repository.go b/core/alert/mocks/alert_repository.go index 18225c80..3c47dfbc 100644 --- a/core/alert/mocks/alert_repository.go +++ b/core/alert/mocks/alert_repository.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -43,8 +43,8 @@ type AlertRepository_Create_Call struct { } // Create is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *alert.Alert +// - _a0 context.Context +// - _a1 *alert.Alert func (_e *AlertRepository_Expecter) Create(_a0 interface{}, _a1 interface{}) *AlertRepository_Create_Call { return &AlertRepository_Create_Call{Call: _e.mock.On("Create", _a0, _a1)} } @@ -90,8 +90,8 @@ type AlertRepository_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 alert.Filter +// - _a0 context.Context +// - _a1 alert.Filter func (_e *AlertRepository_Expecter) List(_a0 interface{}, _a1 interface{}) *AlertRepository_List_Call { return &AlertRepository_List_Call{Call: _e.mock.On("List", _a0, _a1)} } diff --git a/core/alert/mocks/alert_transformer.go b/core/alert/mocks/alert_transformer.go index 6b3964e2..f2648613 100644 --- a/core/alert/mocks/alert_transformer.go +++ b/core/alert/mocks/alert_transformer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -23,13 +23,13 @@ func (_m *AlertTransformer) EXPECT() *AlertTransformer_Expecter { return &AlertTransformer_Expecter{mock: &_m.Mock} } -// TransformToAlerts provides a mock function with given fields: ctx, providerID, body -func (_m *AlertTransformer) TransformToAlerts(ctx context.Context, providerID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { - ret := _m.Called(ctx, providerID, body) +// TransformToAlerts provides a mock function with given fields: ctx, providerID, namespaceID, body +func (_m *AlertTransformer) TransformToAlerts(ctx context.Context, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { + ret := _m.Called(ctx, providerID, namespaceID, body) var r0 []*alert.Alert - if rf, ok := ret.Get(0).(func(context.Context, uint64, map[string]interface{}) []*alert.Alert); ok { - r0 = rf(ctx, providerID, body) + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64, map[string]interface{}) []*alert.Alert); ok { + r0 = rf(ctx, providerID, namespaceID, body) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*alert.Alert) @@ -37,15 +37,15 @@ func (_m *AlertTransformer) TransformToAlerts(ctx context.Context, providerID ui } var r1 int - if rf, ok := ret.Get(1).(func(context.Context, uint64, map[string]interface{}) int); ok { - r1 = rf(ctx, providerID, body) + if rf, ok := ret.Get(1).(func(context.Context, uint64, uint64, map[string]interface{}) int); ok { + r1 = rf(ctx, providerID, namespaceID, body) } else { r1 = ret.Get(1).(int) } var r2 error - if rf, ok := ret.Get(2).(func(context.Context, uint64, map[string]interface{}) error); ok { - r2 = rf(ctx, providerID, body) + if rf, ok := ret.Get(2).(func(context.Context, uint64, uint64, map[string]interface{}) error); ok { + r2 = rf(ctx, providerID, namespaceID, body) } else { r2 = ret.Error(2) } @@ -59,16 +59,17 @@ type AlertTransformer_TransformToAlerts_Call struct { } // TransformToAlerts is a helper method to define mock.On call -// - ctx context.Context -// - providerID uint64 -// - body map[string]interface{} -func (_e *AlertTransformer_Expecter) TransformToAlerts(ctx interface{}, providerID interface{}, body interface{}) *AlertTransformer_TransformToAlerts_Call { - return &AlertTransformer_TransformToAlerts_Call{Call: _e.mock.On("TransformToAlerts", ctx, providerID, body)} +// - ctx context.Context +// - providerID uint64 +// - namespaceID uint64 +// - body map[string]interface{} +func (_e *AlertTransformer_Expecter) TransformToAlerts(ctx interface{}, providerID interface{}, namespaceID interface{}, body interface{}) *AlertTransformer_TransformToAlerts_Call { + return &AlertTransformer_TransformToAlerts_Call{Call: _e.mock.On("TransformToAlerts", ctx, providerID, namespaceID, body)} } -func (_c *AlertTransformer_TransformToAlerts_Call) Run(run func(ctx context.Context, providerID uint64, body map[string]interface{})) *AlertTransformer_TransformToAlerts_Call { +func (_c *AlertTransformer_TransformToAlerts_Call) Run(run func(ctx context.Context, providerID uint64, namespaceID uint64, body map[string]interface{})) *AlertTransformer_TransformToAlerts_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(map[string]interface{})) + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64), args[3].(map[string]interface{})) }) return _c } diff --git a/core/alert/provider_plugin.go b/core/alert/provider_plugin.go index 42bf0d5c..0b5f9715 100644 --- a/core/alert/provider_plugin.go +++ b/core/alert/provider_plugin.go @@ -6,5 +6,5 @@ import ( //go:generate mockery --name=AlertTransformer -r --case underscore --with-expecter --structname AlertTransformer --filename alert_transformer.go --output=./mocks type AlertTransformer interface { - TransformToAlerts(ctx context.Context, providerID uint64, body map[string]interface{}) ([]*Alert, int, error) + TransformToAlerts(ctx context.Context, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*Alert, int, error) } diff --git a/core/alert/service.go b/core/alert/service.go index 791a9971..7558a212 100644 --- a/core/alert/service.go +++ b/core/alert/service.go @@ -18,13 +18,13 @@ func NewService(repository Repository, registry map[string]AlertTransformer) *Se return &Service{repository, registry} } -func (s *Service) CreateAlerts(ctx context.Context, providerType string, providerID uint64, body map[string]interface{}) ([]*Alert, int, error) { +func (s *Service) CreateAlerts(ctx context.Context, providerType string, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*Alert, int, error) { pluginService, err := s.getProviderPluginService(providerType) if err != nil { return nil, 0, err } - alerts, firingLen, err := pluginService.TransformToAlerts(ctx, providerID, body) + alerts, firingLen, err := pluginService.TransformToAlerts(ctx, providerID, namespaceID, body) if err != nil { return nil, 0, err } diff --git a/core/alert/service_test.go b/core/alert/service_test.go index 2b50febb..6b38cea6 100644 --- a/core/alert/service_test.go +++ b/core/alert/service_test.go @@ -116,7 +116,7 @@ func TestService_Create(t *testing.T) { { name: "should return error if TransformToAlerts return error", setup: func(ar *mocks.AlertRepository, at *mocks.AlertTransformer) { - at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return(nil, 0, errors.New("some error")) + at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return(nil, 0, errors.New("some error")) }, alertsToBeCreated: alertsToBeCreated, wantErr: true, @@ -124,7 +124,7 @@ func TestService_Create(t *testing.T) { { name: "should call repository Create method with proper arguments", setup: func(ar *mocks.AlertRepository, at *mocks.AlertTransformer) { - at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ + at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ {ID: 1, ProviderID: 1, ResourceName: "foo", Severity: "CRITICAL", MetricName: "lag", MetricValue: "20", Rule: "lagHigh", TriggeredAt: timenow}, }, 1, nil) @@ -140,7 +140,7 @@ func TestService_Create(t *testing.T) { { name: "should return error not found if repository return err relation", setup: func(ar *mocks.AlertRepository, at *mocks.AlertTransformer) { - at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ + at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ {ID: 1, ProviderID: 1, ResourceName: "foo", Severity: "CRITICAL", MetricName: "lag", MetricValue: "20", Rule: "lagHigh", TriggeredAt: timenow}, }, 1, nil) @@ -152,7 +152,7 @@ func TestService_Create(t *testing.T) { { name: "should handle errors from repository", setup: func(ar *mocks.AlertRepository, at *mocks.AlertTransformer) { - at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ + at.EXPECT().TransformToAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]interface {}")).Return([]*alert.Alert{ {ID: 1, ProviderID: 1, ResourceName: "foo", Severity: "CRITICAL", MetricName: "lag", MetricValue: "20", Rule: "lagHigh", TriggeredAt: timenow}, }, 1, nil) @@ -177,7 +177,7 @@ func TestService_Create(t *testing.T) { svc := alert.NewService(repositoryMock, map[string]alert.AlertTransformer{ testType: alertTransformerMock, }) - actualAlerts, firingLen, err := svc.CreateAlerts(ctx, testType, 1, tc.alertsToBeCreated) + actualAlerts, firingLen, err := svc.CreateAlerts(ctx, testType, 1, 1, tc.alertsToBeCreated) if tc.wantErr { if err == nil { t.Error("error should not be nil") diff --git a/core/namespace/mocks/config_syncer.go b/core/namespace/mocks/config_syncer.go index 00fffe7f..7a6ad650 100644 --- a/core/namespace/mocks/config_syncer.go +++ b/core/namespace/mocks/config_syncer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -23,13 +23,13 @@ func (_m *ConfigSyncer) EXPECT() *ConfigSyncer_Expecter { return &ConfigSyncer_Expecter{mock: &_m.Mock} } -// SyncRuntimeConfig provides a mock function with given fields: ctx, namespaceURN, prov -func (_m *ConfigSyncer) SyncRuntimeConfig(ctx context.Context, namespaceURN string, prov provider.Provider) error { - ret := _m.Called(ctx, namespaceURN, prov) +// SyncRuntimeConfig provides a mock function with given fields: ctx, namespaceID, namespaceURN, prov +func (_m *ConfigSyncer) SyncRuntimeConfig(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider) error { + ret := _m.Called(ctx, namespaceID, namespaceURN, prov) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, provider.Provider) error); ok { - r0 = rf(ctx, namespaceURN, prov) + if rf, ok := ret.Get(0).(func(context.Context, uint64, string, provider.Provider) error); ok { + r0 = rf(ctx, namespaceID, namespaceURN, prov) } else { r0 = ret.Error(0) } @@ -43,16 +43,17 @@ type ConfigSyncer_SyncRuntimeConfig_Call struct { } // SyncRuntimeConfig is a helper method to define mock.On call -// - ctx context.Context -// - namespaceURN string -// - prov provider.Provider -func (_e *ConfigSyncer_Expecter) SyncRuntimeConfig(ctx interface{}, namespaceURN interface{}, prov interface{}) *ConfigSyncer_SyncRuntimeConfig_Call { - return &ConfigSyncer_SyncRuntimeConfig_Call{Call: _e.mock.On("SyncRuntimeConfig", ctx, namespaceURN, prov)} +// - ctx context.Context +// - namespaceID uint64 +// - namespaceURN string +// - prov provider.Provider +func (_e *ConfigSyncer_Expecter) SyncRuntimeConfig(ctx interface{}, namespaceID interface{}, namespaceURN interface{}, prov interface{}) *ConfigSyncer_SyncRuntimeConfig_Call { + return &ConfigSyncer_SyncRuntimeConfig_Call{Call: _e.mock.On("SyncRuntimeConfig", ctx, namespaceID, namespaceURN, prov)} } -func (_c *ConfigSyncer_SyncRuntimeConfig_Call) Run(run func(ctx context.Context, namespaceURN string, prov provider.Provider)) *ConfigSyncer_SyncRuntimeConfig_Call { +func (_c *ConfigSyncer_SyncRuntimeConfig_Call) Run(run func(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider)) *ConfigSyncer_SyncRuntimeConfig_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string), args[2].(provider.Provider)) + run(args[0].(context.Context), args[1].(uint64), args[2].(string), args[3].(provider.Provider)) }) return _c } diff --git a/core/namespace/mocks/encryptor.go b/core/namespace/mocks/encryptor.go index 04e4d2f3..75c95c91 100644 --- a/core/namespace/mocks/encryptor.go +++ b/core/namespace/mocks/encryptor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -48,7 +48,7 @@ type Encryptor_Decrypt_Call struct { } // Decrypt is a helper method to define mock.On call -// - str secret.MaskableString +// - str secret.MaskableString func (_e *Encryptor_Expecter) Decrypt(str interface{}) *Encryptor_Decrypt_Call { return &Encryptor_Decrypt_Call{Call: _e.mock.On("Decrypt", str)} } @@ -92,7 +92,7 @@ type Encryptor_Encrypt_Call struct { } // Encrypt is a helper method to define mock.On call -// - str secret.MaskableString +// - str secret.MaskableString func (_e *Encryptor_Expecter) Encrypt(str interface{}) *Encryptor_Encrypt_Call { return &Encryptor_Encrypt_Call{Call: _e.mock.On("Encrypt", str)} } diff --git a/core/namespace/mocks/namespace_repository.go b/core/namespace/mocks/namespace_repository.go index 08b266b6..9216ff6c 100644 --- a/core/namespace/mocks/namespace_repository.go +++ b/core/namespace/mocks/namespace_repository.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,7 +42,7 @@ type NamespaceRepository_Commit_Call struct { } // Commit is a helper method to define mock.On call -// - ctx context.Context +// - ctx context.Context func (_e *NamespaceRepository_Expecter) Commit(ctx interface{}) *NamespaceRepository_Commit_Call { return &NamespaceRepository_Commit_Call{Call: _e.mock.On("Commit", ctx)} } @@ -79,8 +79,8 @@ type NamespaceRepository_Create_Call struct { } // Create is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *namespace.EncryptedNamespace +// - _a0 context.Context +// - _a1 *namespace.EncryptedNamespace func (_e *NamespaceRepository_Expecter) Create(_a0 interface{}, _a1 interface{}) *NamespaceRepository_Create_Call { return &NamespaceRepository_Create_Call{Call: _e.mock.On("Create", _a0, _a1)} } @@ -117,8 +117,8 @@ type NamespaceRepository_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *NamespaceRepository_Expecter) Delete(_a0 interface{}, _a1 interface{}) *NamespaceRepository_Delete_Call { return &NamespaceRepository_Delete_Call{Call: _e.mock.On("Delete", _a0, _a1)} } @@ -164,8 +164,8 @@ type NamespaceRepository_Get_Call struct { } // Get is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *NamespaceRepository_Expecter) Get(_a0 interface{}, _a1 interface{}) *NamespaceRepository_Get_Call { return &NamespaceRepository_Get_Call{Call: _e.mock.On("Get", _a0, _a1)} } @@ -211,7 +211,7 @@ type NamespaceRepository_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context +// - _a0 context.Context func (_e *NamespaceRepository_Expecter) List(_a0 interface{}) *NamespaceRepository_List_Call { return &NamespaceRepository_List_Call{Call: _e.mock.On("List", _a0)} } @@ -248,8 +248,8 @@ type NamespaceRepository_Rollback_Call struct { } // Rollback is a helper method to define mock.On call -// - ctx context.Context -// - err error +// - ctx context.Context +// - err error func (_e *NamespaceRepository_Expecter) Rollback(ctx interface{}, err interface{}) *NamespaceRepository_Rollback_Call { return &NamespaceRepository_Rollback_Call{Call: _e.mock.On("Rollback", ctx, err)} } @@ -286,8 +286,8 @@ type NamespaceRepository_Update_Call struct { } // Update is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *namespace.EncryptedNamespace +// - _a0 context.Context +// - _a1 *namespace.EncryptedNamespace func (_e *NamespaceRepository_Expecter) Update(_a0 interface{}, _a1 interface{}) *NamespaceRepository_Update_Call { return &NamespaceRepository_Update_Call{Call: _e.mock.On("Update", _a0, _a1)} } @@ -326,7 +326,7 @@ type NamespaceRepository_WithTransaction_Call struct { } // WithTransaction is a helper method to define mock.On call -// - ctx context.Context +// - ctx context.Context func (_e *NamespaceRepository_Expecter) WithTransaction(ctx interface{}) *NamespaceRepository_WithTransaction_Call { return &NamespaceRepository_WithTransaction_Call{Call: _e.mock.On("WithTransaction", ctx)} } diff --git a/core/namespace/mocks/provider_service.go b/core/namespace/mocks/provider_service.go index 01dc4187..297e4bb7 100644 --- a/core/namespace/mocks/provider_service.go +++ b/core/namespace/mocks/provider_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -52,8 +52,8 @@ type ProviderService_Get_Call struct { } // Get is a helper method to define mock.On call -// - ctx context.Context -// - id uint64 +// - ctx context.Context +// - id uint64 func (_e *ProviderService_Expecter) Get(ctx interface{}, id interface{}) *ProviderService_Get_Call { return &ProviderService_Get_Call{Call: _e.mock.On("Get", ctx, id)} } diff --git a/core/namespace/mocks/transactor.go b/core/namespace/mocks/transactor.go index a1f343be..9b66c4b0 100644 --- a/core/namespace/mocks/transactor.go +++ b/core/namespace/mocks/transactor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -41,7 +41,7 @@ type Transactor_Commit_Call struct { } // Commit is a helper method to define mock.On call -// - ctx context.Context +// - ctx context.Context func (_e *Transactor_Expecter) Commit(ctx interface{}) *Transactor_Commit_Call { return &Transactor_Commit_Call{Call: _e.mock.On("Commit", ctx)} } @@ -78,8 +78,8 @@ type Transactor_Rollback_Call struct { } // Rollback is a helper method to define mock.On call -// - ctx context.Context -// - err error +// - ctx context.Context +// - err error func (_e *Transactor_Expecter) Rollback(ctx interface{}, err interface{}) *Transactor_Rollback_Call { return &Transactor_Rollback_Call{Call: _e.mock.On("Rollback", ctx, err)} } @@ -118,7 +118,7 @@ type Transactor_WithTransaction_Call struct { } // WithTransaction is a helper method to define mock.On call -// - ctx context.Context +// - ctx context.Context func (_e *Transactor_Expecter) WithTransaction(ctx interface{}) *Transactor_WithTransaction_Call { return &Transactor_WithTransaction_Call{Call: _e.mock.On("WithTransaction", ctx)} } diff --git a/core/namespace/provider_plugin.go b/core/namespace/provider_plugin.go index 9933e136..ceeecf7a 100644 --- a/core/namespace/provider_plugin.go +++ b/core/namespace/provider_plugin.go @@ -8,5 +8,5 @@ import ( //go:generate mockery --name=ConfigSyncer -r --case underscore --with-expecter --structname ConfigSyncer --filename config_syncer.go --output=./mocks type ConfigSyncer interface { - SyncRuntimeConfig(ctx context.Context, namespaceURN string, prov provider.Provider) error + SyncRuntimeConfig(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider) error } diff --git a/core/namespace/service.go b/core/namespace/service.go index 63426879..9219061f 100644 --- a/core/namespace/service.go +++ b/core/namespace/service.go @@ -84,7 +84,7 @@ func (s *Service) Create(ctx context.Context, ns *Namespace) error { return err } - if err := pluginService.SyncRuntimeConfig(ctx, ns.URN, *prov); err != nil { + if err := pluginService.SyncRuntimeConfig(ctx, encryptedNamespace.ID, ns.URN, *prov); err != nil { if err := s.repository.Rollback(ctx, err); err != nil { return err } @@ -159,7 +159,7 @@ func (s *Service) Update(ctx context.Context, ns *Namespace) error { return err } - if err := pluginService.SyncRuntimeConfig(ctx, ns.URN, ns.Provider); err != nil { + if err := pluginService.SyncRuntimeConfig(ctx, encryptedNamespace.ID, ns.URN, ns.Provider); err != nil { if err := s.repository.Rollback(ctx, err); err != nil { return err } diff --git a/core/namespace/service_test.go b/core/namespace/service_test.go index 5e968653..52852402 100644 --- a/core/namespace/service_test.go +++ b/core/namespace/service_test.go @@ -313,7 +313,7 @@ func TestService_CreateNamespace(t *testing.T) { Namespace: tc.NSpace, CredentialString: "some-ciphertext", }).Return(nil) - cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(errors.New("some error")) + cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(errors.New("some error")) rr.EXPECT().Rollback(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("*errors.errorString")).Return(nil) }, NSpace: &namespace.Namespace{ @@ -333,7 +333,7 @@ func TestService_CreateNamespace(t *testing.T) { Namespace: tc.NSpace, CredentialString: "some-ciphertext", }).Return(nil) - cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(nil) + cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(nil) rr.EXPECT().Commit(mock.AnythingOfType("*context.emptyCtx")).Return(nil) }, NSpace: &namespace.Namespace{ @@ -620,7 +620,7 @@ func TestService_UpdateNamespace(t *testing.T) { Namespace: tc.NSpace, CredentialString: "some-ciphertext", }).Return(nil) - cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(errors.New("some error")) + cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(errors.New("some error")) rr.EXPECT().Rollback(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("*errors.errorString")).Return(nil) }, NSpace: &namespace.Namespace{ @@ -641,7 +641,7 @@ func TestService_UpdateNamespace(t *testing.T) { Namespace: tc.NSpace, CredentialString: "some-ciphertext", }).Return(nil) - cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(nil) + cs.EXPECT().SyncRuntimeConfig(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("string"), mock.AnythingOfType("provider.Provider")).Return(nil) rr.EXPECT().Commit(mock.AnythingOfType("*context.emptyCtx")).Return(nil) }, NSpace: &namespace.Namespace{ diff --git a/core/notification/mocks/notifier.go b/core/notification/mocks/notifier.go index ce4c4487..f8799d2c 100644 --- a/core/notification/mocks/notifier.go +++ b/core/notification/mocks/notifier.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -87,8 +87,8 @@ type Notifier_PostHookQueueTransformConfigs_Call struct { } // PostHookQueueTransformConfigs is a helper method to define mock.On call -// - ctx context.Context -// - notificationConfigMap map[string]interface{} +// - ctx context.Context +// - notificationConfigMap map[string]interface{} func (_e *Notifier_Expecter) PostHookQueueTransformConfigs(ctx interface{}, notificationConfigMap interface{}) *Notifier_PostHookQueueTransformConfigs_Call { return &Notifier_PostHookQueueTransformConfigs_Call{Call: _e.mock.On("PostHookQueueTransformConfigs", ctx, notificationConfigMap)} } @@ -134,8 +134,8 @@ type Notifier_PreHookQueueTransformConfigs_Call struct { } // PreHookQueueTransformConfigs is a helper method to define mock.On call -// - ctx context.Context -// - notificationConfigMap map[string]interface{} +// - ctx context.Context +// - notificationConfigMap map[string]interface{} func (_e *Notifier_Expecter) PreHookQueueTransformConfigs(ctx interface{}, notificationConfigMap interface{}) *Notifier_PreHookQueueTransformConfigs_Call { return &Notifier_PreHookQueueTransformConfigs_Call{Call: _e.mock.On("PreHookQueueTransformConfigs", ctx, notificationConfigMap)} } @@ -179,8 +179,8 @@ type Notifier_Send_Call struct { } // Send is a helper method to define mock.On call -// - ctx context.Context -// - message notification.Message +// - ctx context.Context +// - message notification.Message func (_e *Notifier_Expecter) Send(ctx interface{}, message interface{}) *Notifier_Send_Call { return &Notifier_Send_Call{Call: _e.mock.On("Send", ctx, message)} } diff --git a/core/notification/mocks/queuer.go b/core/notification/mocks/queuer.go index c14d557a..3f28e26e 100644 --- a/core/notification/mocks/queuer.go +++ b/core/notification/mocks/queuer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -44,8 +44,8 @@ type Queuer_Cleanup_Call struct { } // Cleanup is a helper method to define mock.On call -// - ctx context.Context -// - filter queues.FilterCleanup +// - ctx context.Context +// - filter queues.FilterCleanup func (_e *Queuer_Expecter) Cleanup(ctx interface{}, filter interface{}) *Queuer_Cleanup_Call { return &Queuer_Cleanup_Call{Call: _e.mock.On("Cleanup", ctx, filter)} } @@ -82,10 +82,10 @@ type Queuer_Dequeue_Call struct { } // Dequeue is a helper method to define mock.On call -// - ctx context.Context -// - receiverTypes []string -// - batchSize int -// - handlerFn func(context.Context , []notification.Message) error +// - ctx context.Context +// - receiverTypes []string +// - batchSize int +// - handlerFn func(context.Context , []notification.Message) error func (_e *Queuer_Expecter) Dequeue(ctx interface{}, receiverTypes interface{}, batchSize interface{}, handlerFn interface{}) *Queuer_Dequeue_Call { return &Queuer_Dequeue_Call{Call: _e.mock.On("Dequeue", ctx, receiverTypes, batchSize, handlerFn)} } @@ -129,8 +129,8 @@ type Queuer_Enqueue_Call struct { } // Enqueue is a helper method to define mock.On call -// - ctx context.Context -// - ms ...notification.Message +// - ctx context.Context +// - ms ...notification.Message func (_e *Queuer_Expecter) Enqueue(ctx interface{}, ms ...interface{}) *Queuer_Enqueue_Call { return &Queuer_Enqueue_Call{Call: _e.mock.On("Enqueue", append([]interface{}{ctx}, ms...)...)} @@ -174,8 +174,8 @@ type Queuer_ErrorCallback_Call struct { } // ErrorCallback is a helper method to define mock.On call -// - ctx context.Context -// - ms notification.Message +// - ctx context.Context +// - ms notification.Message func (_e *Queuer_Expecter) ErrorCallback(ctx interface{}, ms interface{}) *Queuer_ErrorCallback_Call { return &Queuer_ErrorCallback_Call{Call: _e.mock.On("ErrorCallback", ctx, ms)} } @@ -212,7 +212,7 @@ type Queuer_Stop_Call struct { } // Stop is a helper method to define mock.On call -// - ctx context.Context +// - ctx context.Context func (_e *Queuer_Expecter) Stop(ctx interface{}) *Queuer_Stop_Call { return &Queuer_Stop_Call{Call: _e.mock.On("Stop", ctx)} } @@ -249,8 +249,8 @@ type Queuer_SuccessCallback_Call struct { } // SuccessCallback is a helper method to define mock.On call -// - ctx context.Context -// - ms notification.Message +// - ctx context.Context +// - ms notification.Message func (_e *Queuer_Expecter) SuccessCallback(ctx interface{}, ms interface{}) *Queuer_SuccessCallback_Call { return &Queuer_SuccessCallback_Call{Call: _e.mock.On("SuccessCallback", ctx, ms)} } diff --git a/core/notification/mocks/receiver_service.go b/core/notification/mocks/receiver_service.go index 3e47870d..923c8514 100644 --- a/core/notification/mocks/receiver_service.go +++ b/core/notification/mocks/receiver_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -59,9 +59,9 @@ type ReceiverService_Get_Call struct { } // Get is a helper method to define mock.On call -// - ctx context.Context -// - id uint64 -// - gopts ...receiver.GetOption +// - ctx context.Context +// - id uint64 +// - gopts ...receiver.GetOption func (_e *ReceiverService_Expecter) Get(ctx interface{}, id interface{}, gopts ...interface{}) *ReceiverService_Get_Call { return &ReceiverService_Get_Call{Call: _e.mock.On("Get", append([]interface{}{ctx, id}, gopts...)...)} diff --git a/core/notification/mocks/subscription_service.go b/core/notification/mocks/subscription_service.go index 0759f820..3ece2d67 100644 --- a/core/notification/mocks/subscription_service.go +++ b/core/notification/mocks/subscription_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -23,13 +23,13 @@ func (_m *SubscriptionService) EXPECT() *SubscriptionService_Expecter { return &SubscriptionService_Expecter{mock: &_m.Mock} } -// MatchByLabels provides a mock function with given fields: ctx, labels -func (_m *SubscriptionService) MatchByLabels(ctx context.Context, labels map[string]string) ([]subscription.Subscription, error) { - ret := _m.Called(ctx, labels) +// MatchByLabels provides a mock function with given fields: ctx, namespaceID, labels +func (_m *SubscriptionService) MatchByLabels(ctx context.Context, namespaceID uint64, labels map[string]string) ([]subscription.Subscription, error) { + ret := _m.Called(ctx, namespaceID, labels) var r0 []subscription.Subscription - if rf, ok := ret.Get(0).(func(context.Context, map[string]string) []subscription.Subscription); ok { - r0 = rf(ctx, labels) + if rf, ok := ret.Get(0).(func(context.Context, uint64, map[string]string) []subscription.Subscription); ok { + r0 = rf(ctx, namespaceID, labels) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]subscription.Subscription) @@ -37,8 +37,8 @@ func (_m *SubscriptionService) MatchByLabels(ctx context.Context, labels map[str } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, map[string]string) error); ok { - r1 = rf(ctx, labels) + if rf, ok := ret.Get(1).(func(context.Context, uint64, map[string]string) error); ok { + r1 = rf(ctx, namespaceID, labels) } else { r1 = ret.Error(1) } @@ -52,15 +52,16 @@ type SubscriptionService_MatchByLabels_Call struct { } // MatchByLabels is a helper method to define mock.On call -// - ctx context.Context -// - labels map[string]string -func (_e *SubscriptionService_Expecter) MatchByLabels(ctx interface{}, labels interface{}) *SubscriptionService_MatchByLabels_Call { - return &SubscriptionService_MatchByLabels_Call{Call: _e.mock.On("MatchByLabels", ctx, labels)} +// - ctx context.Context +// - namespaceID uint64 +// - labels map[string]string +func (_e *SubscriptionService_Expecter) MatchByLabels(ctx interface{}, namespaceID interface{}, labels interface{}) *SubscriptionService_MatchByLabels_Call { + return &SubscriptionService_MatchByLabels_Call{Call: _e.mock.On("MatchByLabels", ctx, namespaceID, labels)} } -func (_c *SubscriptionService_MatchByLabels_Call) Run(run func(ctx context.Context, labels map[string]string)) *SubscriptionService_MatchByLabels_Call { +func (_c *SubscriptionService_MatchByLabels_Call) Run(run func(ctx context.Context, namespaceID uint64, labels map[string]string)) *SubscriptionService_MatchByLabels_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(map[string]string)) + run(args[0].(context.Context), args[1].(uint64), args[2].(map[string]string)) }) return _c } diff --git a/core/notification/notification.go b/core/notification/notification.go index b7862edd..aad7489f 100644 --- a/core/notification/notification.go +++ b/core/notification/notification.go @@ -8,7 +8,7 @@ import ( // Notification is a model of notification type Notification struct { - ID string + ID string `json:"id"` Data map[string]interface{} `json:"data"` Labels map[string]string `json:"labels"` ValidDurationString string `json:"valid_duration"` diff --git a/core/notification/service.go b/core/notification/service.go index 6e06bb16..b64093da 100644 --- a/core/notification/service.go +++ b/core/notification/service.go @@ -16,7 +16,7 @@ import ( //go:generate mockery --name=SubscriptionService -r --case underscore --with-expecter --structname SubscriptionService --filename subscription_service.go --output=./mocks type SubscriptionService interface { - MatchByLabels(ctx context.Context, labels map[string]string) ([]subscription.Subscription, error) + MatchByLabels(ctx context.Context, namespaceID uint64, labels map[string]string) ([]subscription.Subscription, error) } //go:generate mockery --name=ReceiverService -r --case underscore --with-expecter --structname ReceiverService --filename receiver_service.go --output=./mocks @@ -115,8 +115,8 @@ func (ns *NotificationService) DispatchToReceiver(ctx context.Context, n Notific return nil } -func (ns *NotificationService) DispatchToSubscribers(ctx context.Context, n Notification) error { - subscriptions, err := ns.subscriptionService.MatchByLabels(ctx, n.Labels) +func (ns *NotificationService) DispatchToSubscribers(ctx context.Context, namespaceID uint64, n Notification) error { + subscriptions, err := ns.subscriptionService.MatchByLabels(ctx, namespaceID, n.Labels) if err != nil { return err } diff --git a/core/notification/service_test.go b/core/notification/service_test.go index a37aa685..1e959cb8 100644 --- a/core/notification/service_test.go +++ b/core/notification/service_test.go @@ -130,7 +130,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { name: "should return error if there is an error when matching labels", setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") - ss.EXPECT().MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")).Return(nil, errors.New("some error")) + ss.EXPECT().MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")).Return(nil, errors.New("some error")) }, wantErr: true, }, @@ -139,7 +139,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") ss.EXPECT(). - MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")). + MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")). Return([]subscription.Subscription{ { Receivers: []subscription.Receiver{ @@ -156,7 +156,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { name: "should return error if there is no matching subscription", setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") - ss.EXPECT().MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")).Return(nil, nil) + ss.EXPECT().MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")).Return(nil, nil) }, wantErr: true, }, @@ -165,7 +165,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") ss.EXPECT(). - MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")). + MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")). Return([]subscription.Subscription{ { Receivers: []subscription.Receiver{ @@ -186,7 +186,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") ss.EXPECT(). - MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")). + MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")). Return([]subscription.Subscription{ { Receivers: []subscription.Receiver{ @@ -208,7 +208,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") ss.EXPECT(). - MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")). + MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")). Return([]subscription.Subscription{ { Receivers: []subscription.Receiver{ @@ -233,7 +233,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { setup: func(ss *mocks.SubscriptionService, q *mocks.Queuer, n *mocks.Notifier) { q.EXPECT().Type().Return("postgresql") ss.EXPECT(). - MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("map[string]string")). + MatchByLabels(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("map[string]string")). Return([]subscription.Subscription{ { Receivers: []subscription.Receiver{ @@ -271,7 +271,7 @@ func TestNotificationService_DispatchToSubscribers(t *testing.T) { testPluginType: mockNotifier, }) - if err := ns.DispatchToSubscribers(context.Background(), tc.n); (err != nil) != tc.wantErr { + if err := ns.DispatchToSubscribers(context.Background(), 1, tc.n); (err != nil) != tc.wantErr { t.Errorf("NotificationService.Dispatch() error = %v, wantErr %v", err, tc.wantErr) } diff --git a/core/subscription/service.go b/core/subscription/service.go index 15e14b24..fd2fa36c 100644 --- a/core/subscription/service.go +++ b/core/subscription/service.go @@ -100,12 +100,11 @@ func (s *Service) Delete(ctx context.Context, id uint64) error { return nil } -// TODO we might want to add filter by namespace id too here -// to filter by tenant -func (s *Service) MatchByLabels(ctx context.Context, labels map[string]string) ([]Subscription, error) { +func (s *Service) MatchByLabels(ctx context.Context, namespaceID uint64, labels map[string]string) ([]Subscription, error) { // fetch all subscriptions by matching labels. subscriptionsByLabels, err := s.repository.List(ctx, Filter{ - Labels: labels, + NamespaceID: namespaceID, + Labels: labels, }) if err != nil { return nil, err diff --git a/docker-compose.yaml b/docker-compose.yaml index 387ad937..afea3feb 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -42,6 +42,7 @@ services: depends_on: - minio1 - cortex-am + minio1: image: quay.io/minio/minio:RELEASE.2022-09-07T22-25-02Z volumes: @@ -90,7 +91,7 @@ services: - cortex-all # Collector otel-collector: - image: otel/opentelemetry-collector-contrib + image: otel/opentelemetry-collector-contrib:0.66.0 command: [ "--config=/etc/otel-collector-config.yaml" ] volumes: - ./docker/otel-collector-config.yaml:/etc/otel-collector-config.yaml diff --git a/docker/otel-collector-config.yaml b/docker/otel-collector-config.yaml index 87cf7688..5e8ac5e1 100644 --- a/docker/otel-collector-config.yaml +++ b/docker/otel-collector-config.yaml @@ -9,6 +9,17 @@ exporters: endpoint: https://otlp.nr-data.net:4317 headers: "api-key": "NEW_RELIC_API_KEY" + prometheusremotewrite: + endpoint: http://host.docker.internal:9009/api/v1/push + tls: + insecure: true + headers: + X-Scope-OrgID: odpf + external_labels: + service: siren + team: odpf-infra + environment: development + host: local logging: loglevel: debug @@ -30,4 +41,4 @@ service: metrics: receivers: [opencensus] processors: [batch] - exporters: [otlp, logging] \ No newline at end of file + exporters: [prometheusremotewrite,otlp, logging] \ No newline at end of file diff --git a/docker/single_process_cortex.yaml b/docker/single_process_cortex.yaml index 4bc20b5b..04488237 100644 --- a/docker/single_process_cortex.yaml +++ b/docker/single_process_cortex.yaml @@ -2,9 +2,7 @@ # This configuration should not be used in production. # It is only for getting started and development. -# Disable the requirement that every request to Cortex has a -# X-Scope-OrgID header. `fake` will be substituted in instead. -auth_enabled: false +auth_enabled: true server: http_listen_port: 9009 @@ -118,4 +116,18 @@ alertmanager: alertmanager_storage: backend: local local: - path: tmp/cortex/alertmanager \ No newline at end of file + path: tmp/cortex/alertmanager + +querier: + active_query_tracker_dir: /data/active-query-tracker + +query_range: + split_queries_by_interval: 24h + align_queries_with_step: true + cache_results: true + results_cache: + cache: + memcached: + expiration: 1h + memcached_client: + timeout: 1s \ No newline at end of file diff --git a/docs/docs/concepts/plugin.md b/docs/docs/concepts/plugin.md index 2a53c416..b98c8c12 100644 --- a/docs/docs/concepts/plugin.md +++ b/docs/docs/concepts/plugin.md @@ -22,7 +22,7 @@ type ProviderPlugin interface { TransformToAlerts(ctx context.Context, providerID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) // ConfigSyncer - SyncRuntimeConfig(ctx context.Context, namespaceURN string, prov provider.Provider) error + SyncRuntimeConfig(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider) error // RuleUploader UpsertRule(ctx context.Context, namespaceURN string, prov provider.Provider, rl *rule.Rule, templateToUpdate *template.Template) error diff --git a/docs/docs/reference/api.md b/docs/docs/reference/api.md index 54adb952..22d83496 100644 --- a/docs/docs/reference/api.md +++ b/docs/docs/reference/api.md @@ -20,6 +20,7 @@ list alerts | resource_name | query | | No | string | | start_time | query | | No | string (uint64) | | end_time | query | | No | string (uint64) | +| namespace_id | query | | No | string (uint64) | ##### Responses @@ -48,6 +49,29 @@ create alerts | 200 | A successful response. | [CreateAlertsResponse](#createalertsresponse) | | default | An unexpected error response. | [Status](#status) | +### /v1beta1/alerts/{provider_type}/{provider_id}/{namespace_id} + +#### POST +##### Summary + +create alerts with namespace + +##### Parameters + +| Name | Located in | Description | Required | Schema | +| ---- | ---------- | ----------- | -------- | ---- | +| provider_type | path | | Yes | string | +| provider_id | path | | Yes | string (uint64) | +| namespace_id | path | | Yes | string (uint64) | +| body | body | | Yes | object | + +##### Responses + +| Code | Description | Schema | +| ---- | ----------- | ------ | +| 200 | A successful response. | [CreateAlertsWithNamespaceResponse](#createalertswithnamespaceresponse) | +| default | An unexpected error response. | [Status](#status) | + ### /v1beta1/namespaces #### GET @@ -580,6 +604,7 @@ render a template | id | string (uint64) | | No | | metric_name | string | | No | | metric_value | string | | No | +| namespace_id | string (uint64) | | No | | provider_id | string (uint64) | | No | | resource_name | string | | No | | rule | string | | No | @@ -598,6 +623,12 @@ render a template | ---- | ---- | ----------- | -------- | | alerts | [ [Alert](#alert) ] | | No | +#### CreateAlertsWithNamespaceResponse + +| Name | Type | Description | Required | +| ---- | ---- | ----------- | -------- | +| alerts | [ [Alert](#alert) ] | | No | + #### CreateNamespaceRequest | Name | Type | Description | Required | diff --git a/internal/api/api.go b/internal/api/api.go index 87be6f9c..89200f11 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -15,7 +15,7 @@ import ( //go:generate mockery --name=AlertService -r --case underscore --with-expecter --structname AlertService --filename alert_service.go --output=./mocks type AlertService interface { - CreateAlerts(ctx context.Context, providerType string, providerID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) + CreateAlerts(ctx context.Context, providerType string, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) List(context.Context, alert.Filter) ([]alert.Alert, error) } @@ -73,7 +73,7 @@ type TemplateService interface { //go:generate mockery --name=NotificationService -r --case underscore --with-expecter --structname NotificationService --filename notification_service.go --output=./mocks type NotificationService interface { DispatchToReceiver(ctx context.Context, n notification.Notification, receiverID uint64) error - DispatchToSubscribers(ctx context.Context, n notification.Notification) error + DispatchToSubscribers(ctx context.Context, namespaceID uint64, n notification.Notification) error } type Deps struct { diff --git a/internal/api/mocks/alert_service.go b/internal/api/mocks/alert_service.go index 9a6a7913..df92bb2b 100644 --- a/internal/api/mocks/alert_service.go +++ b/internal/api/mocks/alert_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -23,13 +23,13 @@ func (_m *AlertService) EXPECT() *AlertService_Expecter { return &AlertService_Expecter{mock: &_m.Mock} } -// CreateAlerts provides a mock function with given fields: ctx, providerType, providerID, body -func (_m *AlertService) CreateAlerts(ctx context.Context, providerType string, providerID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { - ret := _m.Called(ctx, providerType, providerID, body) +// CreateAlerts provides a mock function with given fields: ctx, providerType, providerID, namespaceID, body +func (_m *AlertService) CreateAlerts(ctx context.Context, providerType string, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { + ret := _m.Called(ctx, providerType, providerID, namespaceID, body) var r0 []*alert.Alert - if rf, ok := ret.Get(0).(func(context.Context, string, uint64, map[string]interface{}) []*alert.Alert); ok { - r0 = rf(ctx, providerType, providerID, body) + if rf, ok := ret.Get(0).(func(context.Context, string, uint64, uint64, map[string]interface{}) []*alert.Alert); ok { + r0 = rf(ctx, providerType, providerID, namespaceID, body) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*alert.Alert) @@ -37,15 +37,15 @@ func (_m *AlertService) CreateAlerts(ctx context.Context, providerType string, p } var r1 int - if rf, ok := ret.Get(1).(func(context.Context, string, uint64, map[string]interface{}) int); ok { - r1 = rf(ctx, providerType, providerID, body) + if rf, ok := ret.Get(1).(func(context.Context, string, uint64, uint64, map[string]interface{}) int); ok { + r1 = rf(ctx, providerType, providerID, namespaceID, body) } else { r1 = ret.Get(1).(int) } var r2 error - if rf, ok := ret.Get(2).(func(context.Context, string, uint64, map[string]interface{}) error); ok { - r2 = rf(ctx, providerType, providerID, body) + if rf, ok := ret.Get(2).(func(context.Context, string, uint64, uint64, map[string]interface{}) error); ok { + r2 = rf(ctx, providerType, providerID, namespaceID, body) } else { r2 = ret.Error(2) } @@ -59,17 +59,18 @@ type AlertService_CreateAlerts_Call struct { } // CreateAlerts is a helper method to define mock.On call -// - ctx context.Context -// - providerType string -// - providerID uint64 -// - body map[string]interface{} -func (_e *AlertService_Expecter) CreateAlerts(ctx interface{}, providerType interface{}, providerID interface{}, body interface{}) *AlertService_CreateAlerts_Call { - return &AlertService_CreateAlerts_Call{Call: _e.mock.On("CreateAlerts", ctx, providerType, providerID, body)} +// - ctx context.Context +// - providerType string +// - providerID uint64 +// - namespaceID uint64 +// - body map[string]interface{} +func (_e *AlertService_Expecter) CreateAlerts(ctx interface{}, providerType interface{}, providerID interface{}, namespaceID interface{}, body interface{}) *AlertService_CreateAlerts_Call { + return &AlertService_CreateAlerts_Call{Call: _e.mock.On("CreateAlerts", ctx, providerType, providerID, namespaceID, body)} } -func (_c *AlertService_CreateAlerts_Call) Run(run func(ctx context.Context, providerType string, providerID uint64, body map[string]interface{})) *AlertService_CreateAlerts_Call { +func (_c *AlertService_CreateAlerts_Call) Run(run func(ctx context.Context, providerType string, providerID uint64, namespaceID uint64, body map[string]interface{})) *AlertService_CreateAlerts_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string), args[2].(uint64), args[3].(map[string]interface{})) + run(args[0].(context.Context), args[1].(string), args[2].(uint64), args[3].(uint64), args[4].(map[string]interface{})) }) return _c } @@ -108,8 +109,8 @@ type AlertService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 alert.Filter +// - _a0 context.Context +// - _a1 alert.Filter func (_e *AlertService_Expecter) List(_a0 interface{}, _a1 interface{}) *AlertService_List_Call { return &AlertService_List_Call{Call: _e.mock.On("List", _a0, _a1)} } diff --git a/internal/api/mocks/namespace_service.go b/internal/api/mocks/namespace_service.go index daa564ea..c86da659 100644 --- a/internal/api/mocks/namespace_service.go +++ b/internal/api/mocks/namespace_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,8 +42,8 @@ type NamespaceService_Create_Call struct { } // Create is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *namespace.Namespace +// - _a0 context.Context +// - _a1 *namespace.Namespace func (_e *NamespaceService_Expecter) Create(_a0 interface{}, _a1 interface{}) *NamespaceService_Create_Call { return &NamespaceService_Create_Call{Call: _e.mock.On("Create", _a0, _a1)} } @@ -80,8 +80,8 @@ type NamespaceService_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *NamespaceService_Expecter) Delete(_a0 interface{}, _a1 interface{}) *NamespaceService_Delete_Call { return &NamespaceService_Delete_Call{Call: _e.mock.On("Delete", _a0, _a1)} } @@ -127,8 +127,8 @@ type NamespaceService_Get_Call struct { } // Get is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *NamespaceService_Expecter) Get(_a0 interface{}, _a1 interface{}) *NamespaceService_Get_Call { return &NamespaceService_Get_Call{Call: _e.mock.On("Get", _a0, _a1)} } @@ -174,7 +174,7 @@ type NamespaceService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context +// - _a0 context.Context func (_e *NamespaceService_Expecter) List(_a0 interface{}) *NamespaceService_List_Call { return &NamespaceService_List_Call{Call: _e.mock.On("List", _a0)} } @@ -211,8 +211,8 @@ type NamespaceService_Update_Call struct { } // Update is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *namespace.Namespace +// - _a0 context.Context +// - _a1 *namespace.Namespace func (_e *NamespaceService_Expecter) Update(_a0 interface{}, _a1 interface{}) *NamespaceService_Update_Call { return &NamespaceService_Update_Call{Call: _e.mock.On("Update", _a0, _a1)} } diff --git a/internal/api/mocks/notification_service.go b/internal/api/mocks/notification_service.go index 278bb34f..83df4b0d 100644 --- a/internal/api/mocks/notification_service.go +++ b/internal/api/mocks/notification_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,9 +42,9 @@ type NotificationService_DispatchToReceiver_Call struct { } // DispatchToReceiver is a helper method to define mock.On call -// - ctx context.Context -// - n notification.Notification -// - receiverID uint64 +// - ctx context.Context +// - n notification.Notification +// - receiverID uint64 func (_e *NotificationService_Expecter) DispatchToReceiver(ctx interface{}, n interface{}, receiverID interface{}) *NotificationService_DispatchToReceiver_Call { return &NotificationService_DispatchToReceiver_Call{Call: _e.mock.On("DispatchToReceiver", ctx, n, receiverID)} } @@ -61,13 +61,13 @@ func (_c *NotificationService_DispatchToReceiver_Call) Return(_a0 error) *Notifi return _c } -// DispatchToSubscribers provides a mock function with given fields: ctx, n -func (_m *NotificationService) DispatchToSubscribers(ctx context.Context, n notification.Notification) error { - ret := _m.Called(ctx, n) +// DispatchToSubscribers provides a mock function with given fields: ctx, namespaceID, n +func (_m *NotificationService) DispatchToSubscribers(ctx context.Context, namespaceID uint64, n notification.Notification) error { + ret := _m.Called(ctx, namespaceID, n) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, notification.Notification) error); ok { - r0 = rf(ctx, n) + if rf, ok := ret.Get(0).(func(context.Context, uint64, notification.Notification) error); ok { + r0 = rf(ctx, namespaceID, n) } else { r0 = ret.Error(0) } @@ -81,15 +81,16 @@ type NotificationService_DispatchToSubscribers_Call struct { } // DispatchToSubscribers is a helper method to define mock.On call -// - ctx context.Context -// - n notification.Notification -func (_e *NotificationService_Expecter) DispatchToSubscribers(ctx interface{}, n interface{}) *NotificationService_DispatchToSubscribers_Call { - return &NotificationService_DispatchToSubscribers_Call{Call: _e.mock.On("DispatchToSubscribers", ctx, n)} +// - ctx context.Context +// - namespaceID uint64 +// - n notification.Notification +func (_e *NotificationService_Expecter) DispatchToSubscribers(ctx interface{}, namespaceID interface{}, n interface{}) *NotificationService_DispatchToSubscribers_Call { + return &NotificationService_DispatchToSubscribers_Call{Call: _e.mock.On("DispatchToSubscribers", ctx, namespaceID, n)} } -func (_c *NotificationService_DispatchToSubscribers_Call) Run(run func(ctx context.Context, n notification.Notification)) *NotificationService_DispatchToSubscribers_Call { +func (_c *NotificationService_DispatchToSubscribers_Call) Run(run func(ctx context.Context, namespaceID uint64, n notification.Notification)) *NotificationService_DispatchToSubscribers_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(notification.Notification)) + run(args[0].(context.Context), args[1].(uint64), args[2].(notification.Notification)) }) return _c } diff --git a/internal/api/mocks/provider_service.go b/internal/api/mocks/provider_service.go index 91336f21..e9f722b8 100644 --- a/internal/api/mocks/provider_service.go +++ b/internal/api/mocks/provider_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,8 +42,8 @@ type ProviderService_Create_Call struct { } // Create is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *provider.Provider +// - _a0 context.Context +// - _a1 *provider.Provider func (_e *ProviderService_Expecter) Create(_a0 interface{}, _a1 interface{}) *ProviderService_Create_Call { return &ProviderService_Create_Call{Call: _e.mock.On("Create", _a0, _a1)} } @@ -80,8 +80,8 @@ type ProviderService_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *ProviderService_Expecter) Delete(_a0 interface{}, _a1 interface{}) *ProviderService_Delete_Call { return &ProviderService_Delete_Call{Call: _e.mock.On("Delete", _a0, _a1)} } @@ -127,8 +127,8 @@ type ProviderService_Get_Call struct { } // Get is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *ProviderService_Expecter) Get(_a0 interface{}, _a1 interface{}) *ProviderService_Get_Call { return &ProviderService_Get_Call{Call: _e.mock.On("Get", _a0, _a1)} } @@ -174,8 +174,8 @@ type ProviderService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 provider.Filter +// - _a0 context.Context +// - _a1 provider.Filter func (_e *ProviderService_Expecter) List(_a0 interface{}, _a1 interface{}) *ProviderService_List_Call { return &ProviderService_List_Call{Call: _e.mock.On("List", _a0, _a1)} } @@ -212,8 +212,8 @@ type ProviderService_Update_Call struct { } // Update is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *provider.Provider +// - _a0 context.Context +// - _a1 *provider.Provider func (_e *ProviderService_Expecter) Update(_a0 interface{}, _a1 interface{}) *ProviderService_Update_Call { return &ProviderService_Update_Call{Call: _e.mock.On("Update", _a0, _a1)} } diff --git a/internal/api/mocks/receiver_service.go b/internal/api/mocks/receiver_service.go index f3827dc4..ef3e5f8c 100644 --- a/internal/api/mocks/receiver_service.go +++ b/internal/api/mocks/receiver_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,8 +42,8 @@ type ReceiverService_Create_Call struct { } // Create is a helper method to define mock.On call -// - ctx context.Context -// - rcv *receiver.Receiver +// - ctx context.Context +// - rcv *receiver.Receiver func (_e *ReceiverService_Expecter) Create(ctx interface{}, rcv interface{}) *ReceiverService_Create_Call { return &ReceiverService_Create_Call{Call: _e.mock.On("Create", ctx, rcv)} } @@ -80,8 +80,8 @@ type ReceiverService_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - ctx context.Context -// - id uint64 +// - ctx context.Context +// - id uint64 func (_e *ReceiverService_Expecter) Delete(ctx interface{}, id interface{}) *ReceiverService_Delete_Call { return &ReceiverService_Delete_Call{Call: _e.mock.On("Delete", ctx, id)} } @@ -134,9 +134,9 @@ type ReceiverService_Get_Call struct { } // Get is a helper method to define mock.On call -// - ctx context.Context -// - id uint64 -// - gopts ...receiver.GetOption +// - ctx context.Context +// - id uint64 +// - gopts ...receiver.GetOption func (_e *ReceiverService_Expecter) Get(ctx interface{}, id interface{}, gopts ...interface{}) *ReceiverService_Get_Call { return &ReceiverService_Get_Call{Call: _e.mock.On("Get", append([]interface{}{ctx, id}, gopts...)...)} @@ -189,8 +189,8 @@ type ReceiverService_List_Call struct { } // List is a helper method to define mock.On call -// - ctx context.Context -// - flt receiver.Filter +// - ctx context.Context +// - flt receiver.Filter func (_e *ReceiverService_Expecter) List(ctx interface{}, flt interface{}) *ReceiverService_List_Call { return &ReceiverService_List_Call{Call: _e.mock.On("List", ctx, flt)} } @@ -227,8 +227,8 @@ type ReceiverService_Update_Call struct { } // Update is a helper method to define mock.On call -// - ctx context.Context -// - rcv *receiver.Receiver +// - ctx context.Context +// - rcv *receiver.Receiver func (_e *ReceiverService_Expecter) Update(ctx interface{}, rcv interface{}) *ReceiverService_Update_Call { return &ReceiverService_Update_Call{Call: _e.mock.On("Update", ctx, rcv)} } diff --git a/internal/api/mocks/rule_service.go b/internal/api/mocks/rule_service.go index 19d2e65a..1ddbc7c2 100644 --- a/internal/api/mocks/rule_service.go +++ b/internal/api/mocks/rule_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -51,8 +51,8 @@ type RuleService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 rule.Filter +// - _a0 context.Context +// - _a1 rule.Filter func (_e *RuleService_Expecter) List(_a0 interface{}, _a1 interface{}) *RuleService_List_Call { return &RuleService_List_Call{Call: _e.mock.On("List", _a0, _a1)} } @@ -89,8 +89,8 @@ type RuleService_Upsert_Call struct { } // Upsert is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *rule.Rule +// - _a0 context.Context +// - _a1 *rule.Rule func (_e *RuleService_Expecter) Upsert(_a0 interface{}, _a1 interface{}) *RuleService_Upsert_Call { return &RuleService_Upsert_Call{Call: _e.mock.On("Upsert", _a0, _a1)} } diff --git a/internal/api/mocks/subscription_service.go b/internal/api/mocks/subscription_service.go index 31fa1fbc..71c25c8d 100644 --- a/internal/api/mocks/subscription_service.go +++ b/internal/api/mocks/subscription_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,8 +42,8 @@ type SubscriptionService_Create_Call struct { } // Create is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *subscription.Subscription +// - _a0 context.Context +// - _a1 *subscription.Subscription func (_e *SubscriptionService_Expecter) Create(_a0 interface{}, _a1 interface{}) *SubscriptionService_Create_Call { return &SubscriptionService_Create_Call{Call: _e.mock.On("Create", _a0, _a1)} } @@ -80,8 +80,8 @@ type SubscriptionService_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *SubscriptionService_Expecter) Delete(_a0 interface{}, _a1 interface{}) *SubscriptionService_Delete_Call { return &SubscriptionService_Delete_Call{Call: _e.mock.On("Delete", _a0, _a1)} } @@ -127,8 +127,8 @@ type SubscriptionService_Get_Call struct { } // Get is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 +// - _a0 context.Context +// - _a1 uint64 func (_e *SubscriptionService_Expecter) Get(_a0 interface{}, _a1 interface{}) *SubscriptionService_Get_Call { return &SubscriptionService_Get_Call{Call: _e.mock.On("Get", _a0, _a1)} } @@ -174,8 +174,8 @@ type SubscriptionService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 subscription.Filter +// - _a0 context.Context +// - _a1 subscription.Filter func (_e *SubscriptionService_Expecter) List(_a0 interface{}, _a1 interface{}) *SubscriptionService_List_Call { return &SubscriptionService_List_Call{Call: _e.mock.On("List", _a0, _a1)} } @@ -212,8 +212,8 @@ type SubscriptionService_Update_Call struct { } // Update is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *subscription.Subscription +// - _a0 context.Context +// - _a1 *subscription.Subscription func (_e *SubscriptionService_Expecter) Update(_a0 interface{}, _a1 interface{}) *SubscriptionService_Update_Call { return &SubscriptionService_Update_Call{Call: _e.mock.On("Update", _a0, _a1)} } diff --git a/internal/api/mocks/template_service.go b/internal/api/mocks/template_service.go index 7c7d78ec..0a1d3a1d 100644 --- a/internal/api/mocks/template_service.go +++ b/internal/api/mocks/template_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.16.0. DO NOT EDIT. package mocks @@ -42,8 +42,8 @@ type TemplateService_Delete_Call struct { } // Delete is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 string +// - _a0 context.Context +// - _a1 string func (_e *TemplateService_Expecter) Delete(_a0 interface{}, _a1 interface{}) *TemplateService_Delete_Call { return &TemplateService_Delete_Call{Call: _e.mock.On("Delete", _a0, _a1)} } @@ -89,8 +89,8 @@ type TemplateService_GetByName_Call struct { } // GetByName is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 string +// - _a0 context.Context +// - _a1 string func (_e *TemplateService_Expecter) GetByName(_a0 interface{}, _a1 interface{}) *TemplateService_GetByName_Call { return &TemplateService_GetByName_Call{Call: _e.mock.On("GetByName", _a0, _a1)} } @@ -136,8 +136,8 @@ type TemplateService_List_Call struct { } // List is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 template.Filter +// - _a0 context.Context +// - _a1 template.Filter func (_e *TemplateService_Expecter) List(_a0 interface{}, _a1 interface{}) *TemplateService_List_Call { return &TemplateService_List_Call{Call: _e.mock.On("List", _a0, _a1)} } @@ -181,9 +181,9 @@ type TemplateService_Render_Call struct { } // Render is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 string -// - _a2 map[string]string +// - _a0 context.Context +// - _a1 string +// - _a2 map[string]string func (_e *TemplateService_Expecter) Render(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TemplateService_Render_Call { return &TemplateService_Render_Call{Call: _e.mock.On("Render", _a0, _a1, _a2)} } @@ -220,8 +220,8 @@ type TemplateService_Upsert_Call struct { } // Upsert is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *template.Template +// - _a0 context.Context +// - _a1 *template.Template func (_e *TemplateService_Expecter) Upsert(_a0 interface{}, _a1 interface{}) *TemplateService_Upsert_Call { return &TemplateService_Upsert_Call{Call: _e.mock.On("Upsert", _a0, _a1)} } diff --git a/internal/api/v1beta1/alert.go b/internal/api/v1beta1/alert.go index bb09413c..9a1a8269 100644 --- a/internal/api/v1beta1/alert.go +++ b/internal/api/v1beta1/alert.go @@ -42,11 +42,33 @@ func (s *GRPCServer) ListAlerts(ctx context.Context, req *sirenv1beta1.ListAlert } func (s *GRPCServer) CreateAlerts(ctx context.Context, req *sirenv1beta1.CreateAlertsRequest) (*sirenv1beta1.CreateAlertsResponse, error) { - createdAlerts, firingLen, err := s.alertService.CreateAlerts(ctx, req.GetProviderType(), req.GetProviderId(), req.GetBody().AsMap()) + items, err := s.createAlerts(ctx, req.GetProviderType(), req.GetProviderId(), 0, req.GetBody().AsMap()) if err != nil { return nil, s.generateRPCErr(err) } + return &sirenv1beta1.CreateAlertsResponse{ + Alerts: items, + }, nil +} + +func (s *GRPCServer) CreateAlertsWithNamespace(ctx context.Context, req *sirenv1beta1.CreateAlertsWithNamespaceRequest) (*sirenv1beta1.CreateAlertsWithNamespaceResponse, error) { + items, err := s.createAlerts(ctx, req.GetProviderType(), req.GetProviderId(), req.GetNamespaceId(), req.GetBody().AsMap()) + if err != nil { + return nil, s.generateRPCErr(err) + } + + return &sirenv1beta1.CreateAlertsWithNamespaceResponse{ + Alerts: items, + }, nil +} + +func (s *GRPCServer) createAlerts(ctx context.Context, providerType string, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*sirenv1beta1.Alert, error) { + createdAlerts, firingLen, err := s.alertService.CreateAlerts(ctx, providerType, providerID, namespaceID, body) + if err != nil { + return nil, err + } + items := []*sirenv1beta1.Alert{} for _, item := range createdAlerts { alertHistoryItem := &sirenv1beta1.Alert{ @@ -62,20 +84,16 @@ func (s *GRPCServer) CreateAlerts(ctx context.Context, req *sirenv1beta1.CreateA items = append(items, alertHistoryItem) } - result := &sirenv1beta1.CreateAlertsResponse{ - Alerts: items, - } - // Publish to notification service for _, a := range createdAlerts { n := AlertPBToNotification(a, firingLen, a.GroupKey, time.Now()) - if err := s.notificationService.DispatchToSubscribers(ctx, n); err != nil { + if err := s.notificationService.DispatchToSubscribers(ctx, namespaceID, n); err != nil { s.logger.Warn("failed to send alert as notification", "err", err, "notification", n) } } - return result, nil + return items, nil } // Transform alerts and populate Data and Labels to be interpolated to the system-default template diff --git a/internal/api/v1beta1/alert_test.go b/internal/api/v1beta1/alert_test.go index 17a31620..c1b6b696 100644 --- a/internal/api/v1beta1/alert_test.go +++ b/internal/api/v1beta1/alert_test.go @@ -169,9 +169,9 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { Rule: "random", TriggeredAt: timenow, }} - mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), payload). + mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), payload). Return(dummyAlerts, 1, nil).Once() - mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("notification.Notification")).Return(nil) + mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("notification.Notification")).Return(nil) dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService, NotificationService: mockNotificationService}) @@ -276,9 +276,9 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { Rule: "random", TriggeredAt: timenow, }} - mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), payload). + mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), payload). Return(dummyAlerts, 1, nil).Once() - mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("notification.Notification")).Return(nil) + mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("notification.Notification")).Return(nil) dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService, NotificationService: mockNotificationService}) @@ -298,7 +298,7 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { mockedAlertService := &mocks.AlertService{} dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService}) - mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), payload). + mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), payload). Return(nil, 0, errors.New("random error")).Once() res, err := dummyGRPCServer.CreateAlerts(context.Background(), dummyReq) @@ -456,9 +456,9 @@ func TestGRPCServer_CreateAlertHistory(t *testing.T) { dummyGRPCServer := v1beta1.NewGRPCServer(nil, log.NewNoop(), &api.Deps{AlertService: mockedAlertService, NotificationService: mockNotificationService}) - mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), payload). + mockedAlertService.EXPECT().CreateAlerts(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("string"), mock.AnythingOfType("uint64"), mock.AnythingOfType("uint64"), payload). Return(dummyAlerts, 2, nil).Once() - mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("notification.Notification")).Return(nil) + mockNotificationService.EXPECT().DispatchToSubscribers(mock.AnythingOfType("*context.emptyCtx"), mock.AnythingOfType("uint64"), mock.AnythingOfType("notification.Notification")).Return(nil) res, err := dummyGRPCServer.CreateAlerts(context.Background(), dummyReq) assert.Equal(t, 1, len(res.GetAlerts())) diff --git a/internal/store/model/alerts.go b/internal/store/model/alerts.go index 842c1697..4dd8539f 100644 --- a/internal/store/model/alerts.go +++ b/internal/store/model/alerts.go @@ -1,22 +1,24 @@ package model import ( + "database/sql" "time" "github.com/odpf/siren/core/alert" ) type Alert struct { - ID uint64 `db:"id"` - ProviderID uint64 `db:"provider_id"` - ResourceName string `db:"resource_name"` - MetricName string `db:"metric_name"` - MetricValue string `db:"metric_value"` - Severity string `db:"severity"` - Rule string `db:"rule"` - TriggeredAt time.Time `db:"triggered_at"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` + ID uint64 `db:"id"` + NamespaceID sql.NullInt64 `db:"namespace_id"` + ProviderID uint64 `db:"provider_id"` + ResourceName string `db:"resource_name"` + MetricName string `db:"metric_name"` + MetricValue string `db:"metric_value"` + Severity string `db:"severity"` + Rule string `db:"rule"` + TriggeredAt time.Time `db:"triggered_at"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` } func (a *Alert) FromDomain(alrt alert.Alert) { @@ -30,10 +32,21 @@ func (a *Alert) FromDomain(alrt alert.Alert) { a.TriggeredAt = alrt.TriggeredAt a.CreatedAt = alrt.CreatedAt a.UpdatedAt = alrt.UpdatedAt + + if alrt.NamespaceID == 0 { + a.NamespaceID = sql.NullInt64{ + Valid: false, + } + } else { + a.NamespaceID = sql.NullInt64{ + Valid: true, + Int64: int64(alrt.NamespaceID), + } + } } func (a *Alert) ToDomain() *alert.Alert { - return &alert.Alert{ + alrt := &alert.Alert{ ID: a.ID, ProviderID: a.ProviderID, ResourceName: a.ResourceName, @@ -45,4 +58,10 @@ func (a *Alert) ToDomain() *alert.Alert { CreatedAt: a.CreatedAt, UpdatedAt: a.UpdatedAt, } + + if a.NamespaceID.Valid { + alrt.NamespaceID = uint64(a.NamespaceID.Int64) + } + + return alrt } diff --git a/internal/store/postgres/alerts.go b/internal/store/postgres/alerts.go index 39cb83ce..0de1af6e 100644 --- a/internal/store/postgres/alerts.go +++ b/internal/store/postgres/alerts.go @@ -12,8 +12,8 @@ import ( ) const alertInsertQuery = ` -INSERT INTO alerts (provider_id, resource_name, metric_name, metric_value, severity, rule, triggered_at, created_at, updated_at) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) +INSERT INTO alerts (provider_id, namespace_id, resource_name, metric_name, metric_value, severity, rule, triggered_at, created_at, updated_at) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, now(), now()) RETURNING * ` @@ -52,14 +52,13 @@ func (r AlertRepository) Create(ctx context.Context, alrt *alert.Alert) error { var newAlertModel model.Alert if err := r.client.QueryRowxContext(ctx, pgc.OpInsert, r.tableName, alertInsertQuery, alertModel.ProviderID, + alertModel.NamespaceID, alertModel.ResourceName, alertModel.MetricName, alertModel.MetricValue, alertModel.Severity, alertModel.Rule, alertModel.TriggeredAt, - alertModel.CreatedAt, - alertModel.UpdatedAt, ).StructScan(&newAlertModel); err != nil { err := pgc.CheckError(err) if errors.Is(err, pgc.ErrForeignKeyViolation) { @@ -73,6 +72,9 @@ func (r AlertRepository) Create(ctx context.Context, alrt *alert.Alert) error { func (r AlertRepository) List(ctx context.Context, flt alert.Filter) ([]alert.Alert, error) { var queryBuilder = alertListQueryBuilder + if flt.NamespaceID != 0 { + queryBuilder = queryBuilder.Where("namespace_id = ?", flt.NamespaceID) + } if flt.ResourceName != "" { queryBuilder = queryBuilder.Where("resource_name = ?", flt.ResourceName) } diff --git a/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.down.sql b/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.down.sql new file mode 100644 index 00000000..f609acca --- /dev/null +++ b/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE + alerts +DROP COLUMN IF EXISTS namespace_id; \ No newline at end of file diff --git a/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.up.sql b/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.up.sql new file mode 100644 index 00000000..f2778be9 --- /dev/null +++ b/internal/store/postgres/migrations/000003_add_alert_namespace_id_column.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE + alerts +ADD COLUMN IF NOT EXISTS namespace_id bigint REFERENCES namespaces(id); \ No newline at end of file diff --git a/internal/store/postgres/migrations/000004_create_index_subscription_namespace.down.sql b/internal/store/postgres/migrations/000004_create_index_subscription_namespace.down.sql new file mode 100644 index 00000000..36bb2528 --- /dev/null +++ b/internal/store/postgres/migrations/000004_create_index_subscription_namespace.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS subscriptions_idx_namespace; \ No newline at end of file diff --git a/internal/store/postgres/migrations/000004_create_index_subscription_namespace.up.sql b/internal/store/postgres/migrations/000004_create_index_subscription_namespace.up.sql new file mode 100644 index 00000000..21bf8b6a --- /dev/null +++ b/internal/store/postgres/migrations/000004_create_index_subscription_namespace.up.sql @@ -0,0 +1 @@ +CREATE INDEX IF NOT EXISTS subscriptions_idx_namespace ON subscriptions(namespace_id); \ No newline at end of file diff --git a/internal/store/postgres/subscription.go b/internal/store/postgres/subscription.go index 3dbd2822..8606e0c4 100644 --- a/internal/store/postgres/subscription.go +++ b/internal/store/postgres/subscription.go @@ -56,18 +56,16 @@ func NewSubscriptionRepository(client *pgc.Client) *SubscriptionRepository { func (r *SubscriptionRepository) List(ctx context.Context, flt subscription.Filter) ([]subscription.Subscription, error) { var queryBuilder = subscriptionListQueryBuilder - // If filter by Labels and namespace ID exist, filter by namespace should be done in app - // to make use of search by labels with GIN index + if flt.NamespaceID != 0 { + queryBuilder = queryBuilder.Where("namespace_id = ?", flt.NamespaceID) + } + if len(flt.Labels) != 0 { labelsJSON, err := json.Marshal(flt.Labels) if err != nil { return nil, errors.ErrInvalid.WithCausef("problem marshalling json to string with err: %s", err.Error()) } queryBuilder = queryBuilder.Where(fmt.Sprintf("match <@ '%s'::jsonb", string(json.RawMessage(labelsJSON)))) - } else { - if flt.NamespaceID != 0 { - queryBuilder = queryBuilder.Where("namespace_id = ?", flt.NamespaceID) - } } query, args, err := queryBuilder.PlaceholderFormat(sq.Dollar).ToSql() diff --git a/pkg/telemetry/application.go b/pkg/telemetry/application.go index 1907007d..8a4bc7ad 100644 --- a/pkg/telemetry/application.go +++ b/pkg/telemetry/application.go @@ -4,11 +4,8 @@ import ( "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" - "go.opentelemetry.io/otel/metric/global" ) -var Meter = global.MeterProvider().Meter("siren") - var ( TagReceiverType = tag.MustNewKey("receiver_type") TagRoutingMethod = tag.MustNewKey("routing_method") diff --git a/plugins/providers/base/service.go b/plugins/providers/base/service.go index 2a99d533..606a7a52 100644 --- a/plugins/providers/base/service.go +++ b/plugins/providers/base/service.go @@ -12,7 +12,7 @@ import ( // UnimplementedService is a base receiver provider service layer type UnimplementedService struct{} -func (s *UnimplementedService) SyncRuntimeConfig(ctx context.Context, namespaceURN string, prov provider.Provider) error { +func (s *UnimplementedService) SyncRuntimeConfig(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider) error { return nil } diff --git a/plugins/providers/cortex/config.go b/plugins/providers/cortex/config.go index a4d69db7..022e1d9e 100644 --- a/plugins/providers/cortex/config.go +++ b/plugins/providers/cortex/config.go @@ -14,12 +14,17 @@ var ( ) type AppConfig struct { - GroupWaitDuration string `mapstructure:"group_wait" yaml:"group_wait" default:"30s"` - WebhookBaseAPI string `mapstructure:"webhook_base_api" yaml:"webhook_base_api" default:"http://localhost:8080/v1beta1/alerts/cortex"` - HTTPClient httpclient.Config `mapstructure:"http_client" yaml:"http_client"` + // https://prometheus.io/docs/alerting/latest/configuration/#route + GroupWaitDuration string `mapstructure:"group_wait" yaml:"group_wait" default:"30s"` + GroupIntervalDuration string `mapstructure:"group_interval" yaml:"group_interval" default:"5m"` + RepeatIntervalDuration string `mapstructure:"repeat_interval" yaml:"repeat_interval" default:"4h"` + WebhookBaseAPI string `mapstructure:"webhook_base_api" yaml:"webhook_base_api" default:"http://localhost:8080/v1beta1/alerts/cortex"` + HTTPClient httpclient.Config `mapstructure:"http_client" yaml:"http_client"` } type TemplateConfig struct { - GroupWaitDuration string - WebhookURL string + GroupWaitDuration string + GroupIntervalDuration string `mapstructure:"group_interval" yaml:"group_interval" default:"5m"` + RepeatIntervalDuration string `mapstructure:"repeat_interval" yaml:"repeat_interval" default:"4h"` + WebhookURL string } diff --git a/plugins/providers/cortex/config/config.goyaml b/plugins/providers/cortex/config/config.goyaml index 884d9682..ad1d5b37 100644 --- a/plugins/providers/cortex/config/config.goyaml +++ b/plugins/providers/cortex/config/config.goyaml @@ -18,5 +18,5 @@ route: - time_stamp - identifier group_wait: [[.GroupWaitDuration]] - group_interval: 30m - repeat_interval: 4h \ No newline at end of file + group_interval: [[.GroupIntervalDuration]] + repeat_interval: [[.RepeatIntervalDuration]] \ No newline at end of file diff --git a/plugins/providers/cortex/service.go b/plugins/providers/cortex/service.go index f042598c..fdb68e93 100644 --- a/plugins/providers/cortex/service.go +++ b/plugins/providers/cortex/service.go @@ -62,7 +62,7 @@ func NewPluginService(logger log.Logger, appConfig AppConfig, opts ...ServiceOpt } // TransformToAlerts is a function to transform alert body in hook API to []*alert.Alert -func (s *PluginService) TransformToAlerts(ctx context.Context, providerID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { +func (s *PluginService) TransformToAlerts(ctx context.Context, providerID uint64, namespaceID uint64, body map[string]interface{}) ([]*alert.Alert, int, error) { var groupAlert = &GroupAlert{} if err := mapstructure.Decode(body, groupAlert); err != nil { return nil, 0, err @@ -93,9 +93,10 @@ func (s *PluginService) TransformToAlerts(ctx context.Context, providerID uint64 alrt := &alert.Alert{ ProviderID: providerID, + NamespaceID: namespaceID, ResourceName: item.Annotations["resource"], - MetricName: item.Annotations["metricName"], - MetricValue: item.Annotations["metricValue"], + MetricName: item.Annotations["metric_name"], + MetricValue: item.Annotations["metric_value"], Severity: severity, Rule: item.Annotations["template"], TriggeredAt: startsAt, @@ -123,16 +124,18 @@ func (s *PluginService) TransformToAlerts(ctx context.Context, providerID uint64 } // SyncRuntimeConfig synchronizes runtime configuration of provider -func (s *PluginService) SyncRuntimeConfig(ctx context.Context, namespaceURN string, prov provider.Provider) error { +func (s *PluginService) SyncRuntimeConfig(ctx context.Context, namespaceID uint64, namespaceURN string, prov provider.Provider) error { if s.appConfig.WebhookBaseAPI == "" { return errors.New("Cortex webhook base api string in config cannot be empty") } - webhookURL := fmt.Sprintf("%s/%d", s.appConfig.WebhookBaseAPI, prov.ID) + webhookURL := fmt.Sprintf("%s/%d/%d", s.appConfig.WebhookBaseAPI, prov.ID, namespaceID) tmplConfig := TemplateConfig{ - GroupWaitDuration: s.appConfig.GroupWaitDuration, - WebhookURL: webhookURL, + GroupWaitDuration: s.appConfig.GroupWaitDuration, + GroupIntervalDuration: s.appConfig.GroupIntervalDuration, + RepeatIntervalDuration: s.appConfig.RepeatIntervalDuration, + WebhookURL: webhookURL, } cfg, err := s.generateAlertmanagerConfig(tmplConfig) diff --git a/plugins/receivers/pagerduty/config/default_alert_template_body_v1.goyaml b/plugins/receivers/pagerduty/config/default_alert_template_body_v1.goyaml index 76151834..db2c9f07 100644 --- a/plugins/receivers/pagerduty/config/default_alert_template_body_v1.goyaml +++ b/plugins/receivers/pagerduty/config/default_alert_template_body_v1.goyaml @@ -7,17 +7,17 @@ unknown [[- end]] [[- end]] -[[ define "pagerduty.details" ]]\n -Labels:\n -[[ range $index, $element := .Labels ]]- [[ $index ]] = [[ $element ]]\n -[[ end ]] -Annotations:\n -[[ range $index, $element := .Data ]]- [[ $index ]] = [[ $element ]]\n -[[ end ]][[if .Data.generatorUrl ]]Source: [[ .Data.generatorUrl ]][[ end ]] -[[ end ]] event_type: "[[template "pagerduty.event_type" . ]]" [[if .Data.id]]incident_key: "[[.Data.id]]"[[ end ]] -description: ([[ .Data.status | toUpper ]][[ if .Data.numAlertsFiring ]][[ if eq .Data.status "firing" ]]:[[ .Data.numAlertsFiring ]][[ end ]][[ end ]]) [[ .Labels | joinStringValues " " ]] -client: "Siren" +description: ([[ .Data.status | toUpper ]][[ if eq .Data.status "firing" ]]:[[ .Data.numAlertsFiring ]][[ end ]]) + [[- if eq .Data.status "resolved" ]] ~([[ .Labels.severity | toUpper ]])~ + [[- else ]] *([[ .Labels.severity | toUpper ]])* + [[- end]] [[ .Labels.alertname ]] +client: Siren details: - [[ .Data.status ]]: "[[template "pagerduty.details" . ]]" \ No newline at end of file + Labels: + [[ range $index, $element := .Labels ]]- [[ $index ]] = [[ $element ]] + [[ end ]] + Annotations: + [[ range $index, $element := .Data ]]- [[ $index ]] = [[ $element ]] + [[ end ]][[if .Data.generatorUrl ]]Source: [[ .Data.generatorUrl ]][[ end ]] \ No newline at end of file diff --git a/proto/odpf/siren/v1beta1/siren.pb.go b/proto/odpf/siren/v1beta1/siren.pb.go index 8e870a57..60a310b4 100644 --- a/proto/odpf/siren/v1beta1/siren.pb.go +++ b/proto/odpf/siren/v1beta1/siren.pb.go @@ -2688,6 +2688,7 @@ type Alert struct { Severity string `protobuf:"bytes,6,opt,name=severity,proto3" json:"severity,omitempty"` Rule string `protobuf:"bytes,7,opt,name=rule,proto3" json:"rule,omitempty"` TriggeredAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=triggered_at,json=triggeredAt,proto3" json:"triggered_at,omitempty"` + NamespaceId uint64 `protobuf:"varint,9,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"` } func (x *Alert) Reset() { @@ -2778,6 +2779,13 @@ func (x *Alert) GetTriggeredAt() *timestamppb.Timestamp { return nil } +func (x *Alert) GetNamespaceId() uint64 { + if x != nil { + return x.NamespaceId + } + return 0 +} + type ListAlertsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2788,6 +2796,7 @@ type ListAlertsRequest struct { ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` StartTime uint64 `protobuf:"varint,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` EndTime uint64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + NamespaceId uint64 `protobuf:"varint,6,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"` } func (x *ListAlertsRequest) Reset() { @@ -2857,6 +2866,13 @@ func (x *ListAlertsRequest) GetEndTime() uint64 { return 0 } +func (x *ListAlertsRequest) GetNamespaceId() uint64 { + if x != nil { + return x.NamespaceId + } + return 0 +} + type ListAlertsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3014,6 +3030,124 @@ func (x *CreateAlertsResponse) GetAlerts() []*Alert { return nil } +type CreateAlertsWithNamespaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProviderType string `protobuf:"bytes,1,opt,name=provider_type,json=providerType,proto3" json:"provider_type,omitempty"` + ProviderId uint64 `protobuf:"varint,2,opt,name=provider_id,json=providerId,proto3" json:"provider_id,omitempty"` + Body *structpb.Struct `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + NamespaceId uint64 `protobuf:"varint,4,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"` +} + +func (x *CreateAlertsWithNamespaceRequest) Reset() { + *x = CreateAlertsWithNamespaceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAlertsWithNamespaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAlertsWithNamespaceRequest) ProtoMessage() {} + +func (x *CreateAlertsWithNamespaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAlertsWithNamespaceRequest.ProtoReflect.Descriptor instead. +func (*CreateAlertsWithNamespaceRequest) Descriptor() ([]byte, []int) { + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{52} +} + +func (x *CreateAlertsWithNamespaceRequest) GetProviderType() string { + if x != nil { + return x.ProviderType + } + return "" +} + +func (x *CreateAlertsWithNamespaceRequest) GetProviderId() uint64 { + if x != nil { + return x.ProviderId + } + return 0 +} + +func (x *CreateAlertsWithNamespaceRequest) GetBody() *structpb.Struct { + if x != nil { + return x.Body + } + return nil +} + +func (x *CreateAlertsWithNamespaceRequest) GetNamespaceId() uint64 { + if x != nil { + return x.NamespaceId + } + return 0 +} + +type CreateAlertsWithNamespaceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Alerts []*Alert `protobuf:"bytes,1,rep,name=alerts,proto3" json:"alerts,omitempty"` +} + +func (x *CreateAlertsWithNamespaceResponse) Reset() { + *x = CreateAlertsWithNamespaceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAlertsWithNamespaceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAlertsWithNamespaceResponse) ProtoMessage() {} + +func (x *CreateAlertsWithNamespaceResponse) ProtoReflect() protoreflect.Message { + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAlertsWithNamespaceResponse.ProtoReflect.Descriptor instead. +func (*CreateAlertsWithNamespaceResponse) Descriptor() ([]byte, []int) { + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{53} +} + +func (x *CreateAlertsWithNamespaceResponse) GetAlerts() []*Alert { + if x != nil { + return x.Alerts + } + return nil +} + type Annotations struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3028,7 +3162,7 @@ type Annotations struct { func (x *Annotations) Reset() { *x = Annotations{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[52] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3041,7 +3175,7 @@ func (x *Annotations) String() string { func (*Annotations) ProtoMessage() {} func (x *Annotations) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[52] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3054,7 +3188,7 @@ func (x *Annotations) ProtoReflect() protoreflect.Message { // Deprecated: Use Annotations.ProtoReflect.Descriptor instead. func (*Annotations) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{52} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{54} } func (x *Annotations) GetMetricName() string { @@ -3096,7 +3230,7 @@ type Labels struct { func (x *Labels) Reset() { *x = Labels{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[53] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3109,7 +3243,7 @@ func (x *Labels) String() string { func (*Labels) ProtoMessage() {} func (x *Labels) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[53] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3122,7 +3256,7 @@ func (x *Labels) ProtoReflect() protoreflect.Message { // Deprecated: Use Labels.ProtoReflect.Descriptor instead. func (*Labels) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{53} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{55} } func (x *Labels) GetSeverity() string { @@ -3152,7 +3286,7 @@ type Rule struct { func (x *Rule) Reset() { *x = Rule{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[54] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3165,7 +3299,7 @@ func (x *Rule) String() string { func (*Rule) ProtoMessage() {} func (x *Rule) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[54] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3178,7 +3312,7 @@ func (x *Rule) ProtoReflect() protoreflect.Message { // Deprecated: Use Rule.ProtoReflect.Descriptor instead. func (*Rule) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{54} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{56} } func (x *Rule) GetId() uint64 { @@ -3265,7 +3399,7 @@ type Variables struct { func (x *Variables) Reset() { *x = Variables{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[55] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3278,7 +3412,7 @@ func (x *Variables) String() string { func (*Variables) ProtoMessage() {} func (x *Variables) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[55] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3291,7 +3425,7 @@ func (x *Variables) ProtoReflect() protoreflect.Message { // Deprecated: Use Variables.ProtoReflect.Descriptor instead. func (*Variables) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{55} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{57} } func (x *Variables) GetName() string { @@ -3337,7 +3471,7 @@ type ListRulesRequest struct { func (x *ListRulesRequest) Reset() { *x = ListRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[56] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3350,7 +3484,7 @@ func (x *ListRulesRequest) String() string { func (*ListRulesRequest) ProtoMessage() {} func (x *ListRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[56] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3363,7 +3497,7 @@ func (x *ListRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRulesRequest.ProtoReflect.Descriptor instead. func (*ListRulesRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{56} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{58} } func (x *ListRulesRequest) GetName() string { @@ -3412,7 +3546,7 @@ type ListRulesResponse struct { func (x *ListRulesResponse) Reset() { *x = ListRulesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[57] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3425,7 +3559,7 @@ func (x *ListRulesResponse) String() string { func (*ListRulesResponse) ProtoMessage() {} func (x *ListRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[57] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3438,7 +3572,7 @@ func (x *ListRulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRulesResponse.ProtoReflect.Descriptor instead. func (*ListRulesResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{57} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{59} } func (x *ListRulesResponse) GetRules() []*Rule { @@ -3464,7 +3598,7 @@ type UpdateRuleRequest struct { func (x *UpdateRuleRequest) Reset() { *x = UpdateRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[58] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3477,7 +3611,7 @@ func (x *UpdateRuleRequest) String() string { func (*UpdateRuleRequest) ProtoMessage() {} func (x *UpdateRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[58] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3490,7 +3624,7 @@ func (x *UpdateRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRuleRequest.ProtoReflect.Descriptor instead. func (*UpdateRuleRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{58} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{60} } func (x *UpdateRuleRequest) GetEnabled() bool { @@ -3546,7 +3680,7 @@ type UpdateRuleResponse struct { func (x *UpdateRuleResponse) Reset() { *x = UpdateRuleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[59] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3559,7 +3693,7 @@ func (x *UpdateRuleResponse) String() string { func (*UpdateRuleResponse) ProtoMessage() {} func (x *UpdateRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[59] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3572,7 +3706,7 @@ func (x *UpdateRuleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRuleResponse.ProtoReflect.Descriptor instead. func (*UpdateRuleResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{59} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{61} } func (x *UpdateRuleResponse) GetId() uint64 { @@ -3596,7 +3730,7 @@ type TemplateVariables struct { func (x *TemplateVariables) Reset() { *x = TemplateVariables{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[60] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3609,7 +3743,7 @@ func (x *TemplateVariables) String() string { func (*TemplateVariables) ProtoMessage() {} func (x *TemplateVariables) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[60] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3622,7 +3756,7 @@ func (x *TemplateVariables) ProtoReflect() protoreflect.Message { // Deprecated: Use TemplateVariables.ProtoReflect.Descriptor instead. func (*TemplateVariables) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{60} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{62} } func (x *TemplateVariables) GetName() string { @@ -3670,7 +3804,7 @@ type Template struct { func (x *Template) Reset() { *x = Template{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[61] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3683,7 +3817,7 @@ func (x *Template) String() string { func (*Template) ProtoMessage() {} func (x *Template) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[61] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3696,7 +3830,7 @@ func (x *Template) ProtoReflect() protoreflect.Message { // Deprecated: Use Template.ProtoReflect.Descriptor instead. func (*Template) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{61} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{63} } func (x *Template) GetId() uint64 { @@ -3759,7 +3893,7 @@ type ListTemplatesRequest struct { func (x *ListTemplatesRequest) Reset() { *x = ListTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[62] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3772,7 +3906,7 @@ func (x *ListTemplatesRequest) String() string { func (*ListTemplatesRequest) ProtoMessage() {} func (x *ListTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[62] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3785,7 +3919,7 @@ func (x *ListTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTemplatesRequest.ProtoReflect.Descriptor instead. func (*ListTemplatesRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{62} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{64} } func (x *ListTemplatesRequest) GetTag() string { @@ -3806,7 +3940,7 @@ type ListTemplatesResponse struct { func (x *ListTemplatesResponse) Reset() { *x = ListTemplatesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[63] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3819,7 +3953,7 @@ func (x *ListTemplatesResponse) String() string { func (*ListTemplatesResponse) ProtoMessage() {} func (x *ListTemplatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[63] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3832,7 +3966,7 @@ func (x *ListTemplatesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTemplatesResponse.ProtoReflect.Descriptor instead. func (*ListTemplatesResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{63} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{65} } func (x *ListTemplatesResponse) GetTemplates() []*Template { @@ -3857,7 +3991,7 @@ type UpsertTemplateRequest struct { func (x *UpsertTemplateRequest) Reset() { *x = UpsertTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[64] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3870,7 +4004,7 @@ func (x *UpsertTemplateRequest) String() string { func (*UpsertTemplateRequest) ProtoMessage() {} func (x *UpsertTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[64] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3883,7 +4017,7 @@ func (x *UpsertTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertTemplateRequest.ProtoReflect.Descriptor instead. func (*UpsertTemplateRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{64} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{66} } func (x *UpsertTemplateRequest) GetId() uint64 { @@ -3932,7 +4066,7 @@ type UpsertTemplateResponse struct { func (x *UpsertTemplateResponse) Reset() { *x = UpsertTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[65] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3945,7 +4079,7 @@ func (x *UpsertTemplateResponse) String() string { func (*UpsertTemplateResponse) ProtoMessage() {} func (x *UpsertTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[65] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3958,7 +4092,7 @@ func (x *UpsertTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertTemplateResponse.ProtoReflect.Descriptor instead. func (*UpsertTemplateResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{65} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{67} } func (x *UpsertTemplateResponse) GetId() uint64 { @@ -3979,7 +4113,7 @@ type GetTemplateRequest struct { func (x *GetTemplateRequest) Reset() { *x = GetTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[66] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3992,7 +4126,7 @@ func (x *GetTemplateRequest) String() string { func (*GetTemplateRequest) ProtoMessage() {} func (x *GetTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[66] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4005,7 +4139,7 @@ func (x *GetTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTemplateRequest.ProtoReflect.Descriptor instead. func (*GetTemplateRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{66} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{68} } func (x *GetTemplateRequest) GetName() string { @@ -4026,7 +4160,7 @@ type GetTemplateResponse struct { func (x *GetTemplateResponse) Reset() { *x = GetTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[67] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4039,7 +4173,7 @@ func (x *GetTemplateResponse) String() string { func (*GetTemplateResponse) ProtoMessage() {} func (x *GetTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[67] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4052,7 +4186,7 @@ func (x *GetTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTemplateResponse.ProtoReflect.Descriptor instead. func (*GetTemplateResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{67} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{69} } func (x *GetTemplateResponse) GetTemplate() *Template { @@ -4073,7 +4207,7 @@ type DeleteTemplateRequest struct { func (x *DeleteTemplateRequest) Reset() { *x = DeleteTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[68] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4086,7 +4220,7 @@ func (x *DeleteTemplateRequest) String() string { func (*DeleteTemplateRequest) ProtoMessage() {} func (x *DeleteTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[68] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4099,7 +4233,7 @@ func (x *DeleteTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTemplateRequest.ProtoReflect.Descriptor instead. func (*DeleteTemplateRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{68} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{70} } func (x *DeleteTemplateRequest) GetName() string { @@ -4118,7 +4252,7 @@ type DeleteTemplateResponse struct { func (x *DeleteTemplateResponse) Reset() { *x = DeleteTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[69] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4131,7 +4265,7 @@ func (x *DeleteTemplateResponse) String() string { func (*DeleteTemplateResponse) ProtoMessage() {} func (x *DeleteTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[69] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4144,7 +4278,7 @@ func (x *DeleteTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTemplateResponse.ProtoReflect.Descriptor instead. func (*DeleteTemplateResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{69} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{71} } type RenderTemplateRequest struct { @@ -4159,7 +4293,7 @@ type RenderTemplateRequest struct { func (x *RenderTemplateRequest) Reset() { *x = RenderTemplateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[70] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4306,7 @@ func (x *RenderTemplateRequest) String() string { func (*RenderTemplateRequest) ProtoMessage() {} func (x *RenderTemplateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[70] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4319,7 @@ func (x *RenderTemplateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderTemplateRequest.ProtoReflect.Descriptor instead. func (*RenderTemplateRequest) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{70} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{72} } func (x *RenderTemplateRequest) GetName() string { @@ -4213,7 +4347,7 @@ type RenderTemplateResponse struct { func (x *RenderTemplateResponse) Reset() { *x = RenderTemplateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[71] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4226,7 +4360,7 @@ func (x *RenderTemplateResponse) String() string { func (*RenderTemplateResponse) ProtoMessage() {} func (x *RenderTemplateResponse) ProtoReflect() protoreflect.Message { - mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[71] + mi := &file_odpf_siren_v1beta1_siren_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4239,7 +4373,7 @@ func (x *RenderTemplateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RenderTemplateResponse.ProtoReflect.Descriptor instead. func (*RenderTemplateResponse) Descriptor() ([]byte, []int) { - return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{71} + return file_odpf_siren_v1beta1_siren_proto_rawDescGZIP(), []int{73} } func (x *RenderTemplateResponse) GetBody() string { @@ -4653,7 +4787,7 @@ var file_odpf_siren_v1beta1_siren_proto_rawDesc = []byte{ 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x18, 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x02, 0x0a, + 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb3, 0x02, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, @@ -4670,543 +4804,581 @@ var file_odpf_siren_v1beta1_siren_proto_rawDesc = []byte{ 0x12, 0x3d, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0b, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x41, 0x74, 0x22, - 0xd1, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, - 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x64, 0x70, 0x66, - 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0x88, 0x01, 0x0a, - 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x49, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6d, 0x70, 0x52, 0x0b, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x22, 0xf4, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3c, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, + 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x0c, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, - 0x74, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0b, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x24, - 0x0a, 0x06, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x22, 0x88, 0x03, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, - 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x28, 0x00, 0x52, 0x11, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, - 0x84, 0x01, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, - 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, - 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x64, - 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xbd, 0x02, 0x0a, - 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x0a, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, - 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, - 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, - 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, - 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x12, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x69, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, - 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, - 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd7, - 0x02, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x6e, + 0x74, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, + 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x49, 0x0a, + 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, + 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, + 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6c, + 0x65, 0x72, 0x74, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x0b, + 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x24, 0x0a, 0x06, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0x88, 0x03, + 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, + 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, + 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x36, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x32, 0x02, 0x28, 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, + 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xae, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, + 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xbd, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, - 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, + 0x2b, 0x24, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, + 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x28, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, - 0x61, 0x67, 0x22, 0x53, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x09, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x65, - 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x11, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, - 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, - 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x4d, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, - 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, - 0x28, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, - 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, - 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, - 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x2b, 0x0a, - 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, + 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, - 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x56, 0x0a, 0x09, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x2c, 0x0a, 0x16, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x32, - 0xbc, 0x28, 0x0a, 0x0c, 0x53, 0x69, 0x72, 0x65, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x9d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6f, + 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd7, 0x02, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, + 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1c, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x4d, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x22, 0x28, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x53, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x09, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x22, 0xd5, 0x01, 0x0a, 0x15, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, + 0x10, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, + 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, + 0x02, 0x08, 0x01, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x12, 0xa6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x28, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, + 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, + 0x5b, 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x1d, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, - 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x92, 0x41, 0x1a, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x67, 0x65, 0x74, 0x20, 0x61, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, - 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, + 0x74, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xda, 0x01, + 0x0a, 0x15, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, + 0x41, 0x2d, 0x5a, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2b, 0x24, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x56, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2c, 0x0a, 0x16, 0x52, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x32, 0xbb, 0x2a, 0x0a, 0x0c, 0x53, 0x69, 0x72, + 0x65, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x12, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x1a, 0x17, 0x2f, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, - 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3f, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x37, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, + 0x0e, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0xa6, 0x01, 0x0a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, + 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x64, 0x70, + 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x0e, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x0e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, + 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x29, - 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x1d, 0x73, 0x65, 0x6e, 0x64, - 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, - 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x6e, 0x64, - 0x12, 0xa3, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x1c, 0x0a, - 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0f, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x64, 0x70, - 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x40, 0x92, 0x41, 0x1f, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, - 0x22, 0x13, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1d, + 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x11, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x1a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, + 0xa8, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x1d, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x19, 0x2a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xbc, 0x01, 0x0a, 0x0e, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, + 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x12, 0x1d, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x6e, 0x64, 0x12, 0xa3, 0x01, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x6f, + 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x92, 0x41, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, + 0xac, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x92, 0x41, + 0x1f, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0xa2, + 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x1c, 0x0a, 0x09, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0f, 0x67, 0x65, 0x74, 0x20, 0x61, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, - 0x12, 0x18, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2a, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, - 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x92, 0x41, 0x1f, 0x0a, 0x09, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, - 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1d, 0x3a, 0x01, 0x2a, 0x1a, 0x18, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xae, - 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1f, - 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0xb5, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, - 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x43, 0x92, 0x41, 0x22, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, - 0x16, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xbe, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x1c, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x0f, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x45, 0x92, 0x41, 0x1f, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x1a, 0x18, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x64, + 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1f, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xb5, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x92, - 0x41, 0x25, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, - 0x22, 0x16, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, - 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x92, 0x41, 0x22, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0xc3, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, - 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x92, 0x41, 0x25, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x1a, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x92, 0x41, 0x22, + 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xc0, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x6f, - 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x64, - 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x25, - 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x9d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6f, 0x64, 0x70, - 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x37, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x0e, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0xa6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, - 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, + 0x12, 0xbe, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x72, 0x12, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x72, 0x12, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, - 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3c, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x72, 0x12, 0x0e, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0xab, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x92, 0x41, 0x25, 0x0a, 0x0c, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, + 0x92, 0x41, 0x22, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xc3, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1d, 0x0a, - 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x1a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa8, - 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, - 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, + 0x92, 0x41, 0x25, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, + 0x2a, 0x1a, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xc0, + 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, + 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x25, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x12, 0x9d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x12, 0xa6, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, + 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x1d, + 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x11, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x6f, 0x64, 0x70, + 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x92, 0x41, 0x1a, + 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x2a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa9, 0x01, 0x0a, 0x0a, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x12, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, + 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, + 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x42, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x72, 0x12, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x1a, 0x17, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, + 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3f, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x12, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, 0x17, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0xa9, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x73, 0x12, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x92, 0x41, 0x14, 0x0a, 0x05, 0x41, 0x6c, - 0x65, 0x72, 0x74, 0x12, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x7d, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb7, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4c, 0x92, 0x41, 0x14, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x0b, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, + 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x7d, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xb7, + 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, + 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x92, 0x41, 0x16, 0x0a, 0x05, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x7d, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x85, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x12, 0x0a, - 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, - 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x92, 0x41, 0x19, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x11, 0x61, 0x64, 0x64, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, - 0x75, 0x6c, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x1a, 0x0e, 0x2f, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x9d, 0x01, 0x0a, - 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x28, - 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, - 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x37, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x0e, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x9e, 0x01, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x54, 0x92, 0x41, 0x16, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x0d, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x35, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x7d, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xfc, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, + 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x92, - 0x41, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x67, 0x65, - 0x74, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xaa, 0x01, - 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x72, 0x92, 0x41, 0x25, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, + 0x1c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x44, 0x3a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x3c, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x7d, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x92, 0x41, 0x21, 0x0a, 0x08, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x15, 0x61, 0x64, 0x64, 0x2f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x1a, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0xaa, 0x01, 0x0a, 0x0e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2b, 0x92, 0x41, 0x12, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x0a, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, + 0x0e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x92, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x25, + 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x92, + 0x41, 0x19, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x11, 0x61, 0x64, 0x64, 0x2f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x13, 0x3a, 0x01, 0x2a, 0x1a, 0x0e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x9d, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, + 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x92, 0x41, 0x1a, + 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, + 0x12, 0x12, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x26, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, + 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, + 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x92, 0x41, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xaa, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, + 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x41, 0x92, 0x41, 0x21, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x15, + 0x61, 0x64, 0x64, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x1a, 0x12, + 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0xaa, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, + 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x92, 0x41, + 0x1d, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x11, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1b, 0x2a, 0x19, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, + 0xb4, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, - 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x2a, 0x19, 0x2f, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x64, 0x70, - 0x66, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x73, 0x69, 0x72, - 0x65, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4b, 0x92, 0x41, 0x1d, 0x0a, 0x08, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x11, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x42, 0xb2, - 0x01, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x6f, 0x64, 0x70, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6e, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x42, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x64, 0x70, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x6e, 0x2f, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, - 0x73, 0x69, 0x72, 0x65, 0x6e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x92, 0x41, 0x54, 0x12, - 0x4f, 0x0a, 0x0a, 0x53, 0x69, 0x72, 0x65, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x73, 0x12, 0x3a, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x6f, 0x75, 0x72, 0x20, 0x53, 0x69, 0x72, 0x65, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x67, 0x52, 0x50, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x67, 0x52, 0x50, 0x43, - 0x2d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x32, 0x05, 0x30, 0x2e, 0x35, 0x2e, 0x30, - 0x2a, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x92, 0x41, 0x1d, 0x0a, 0x08, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x11, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x42, 0xb2, 0x01, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x6f, 0x64, + 0x70, 0x66, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2e, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x42, + 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, + 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x64, + 0x70, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2f, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x73, 0x69, 0x72, 0x65, 0x6e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x92, 0x41, 0x54, 0x12, 0x4f, 0x0a, 0x0a, 0x53, 0x69, 0x72, 0x65, 0x6e, + 0x20, 0x41, 0x50, 0x49, 0x73, 0x12, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x53, 0x69, 0x72, 0x65, + 0x6e, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x52, 0x50, 0x43, 0x20, + 0x61, 0x6e, 0x64, 0x0a, 0x67, 0x52, 0x50, 0x43, 0x2d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x32, 0x05, 0x30, 0x2e, 0x35, 0x2e, 0x30, 0x2a, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -5221,223 +5393,229 @@ func file_odpf_siren_v1beta1_siren_proto_rawDescGZIP() []byte { return file_odpf_siren_v1beta1_siren_proto_rawDescData } -var file_odpf_siren_v1beta1_siren_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_odpf_siren_v1beta1_siren_proto_msgTypes = make([]protoimpl.MessageInfo, 87) var file_odpf_siren_v1beta1_siren_proto_goTypes = []interface{}{ - (*Provider)(nil), // 0: odpf.siren.v1beta1.Provider - (*ListProvidersRequest)(nil), // 1: odpf.siren.v1beta1.ListProvidersRequest - (*ListProvidersResponse)(nil), // 2: odpf.siren.v1beta1.ListProvidersResponse - (*CreateProviderRequest)(nil), // 3: odpf.siren.v1beta1.CreateProviderRequest - (*CreateProviderResponse)(nil), // 4: odpf.siren.v1beta1.CreateProviderResponse - (*GetProviderRequest)(nil), // 5: odpf.siren.v1beta1.GetProviderRequest - (*GetProviderResponse)(nil), // 6: odpf.siren.v1beta1.GetProviderResponse - (*UpdateProviderRequest)(nil), // 7: odpf.siren.v1beta1.UpdateProviderRequest - (*UpdateProviderResponse)(nil), // 8: odpf.siren.v1beta1.UpdateProviderResponse - (*DeleteProviderRequest)(nil), // 9: odpf.siren.v1beta1.DeleteProviderRequest - (*DeleteProviderResponse)(nil), // 10: odpf.siren.v1beta1.DeleteProviderResponse - (*Namespace)(nil), // 11: odpf.siren.v1beta1.Namespace - (*ListNamespacesRequest)(nil), // 12: odpf.siren.v1beta1.ListNamespacesRequest - (*ListNamespacesResponse)(nil), // 13: odpf.siren.v1beta1.ListNamespacesResponse - (*CreateNamespaceRequest)(nil), // 14: odpf.siren.v1beta1.CreateNamespaceRequest - (*CreateNamespaceResponse)(nil), // 15: odpf.siren.v1beta1.CreateNamespaceResponse - (*GetNamespaceRequest)(nil), // 16: odpf.siren.v1beta1.GetNamespaceRequest - (*GetNamespaceResponse)(nil), // 17: odpf.siren.v1beta1.GetNamespaceResponse - (*UpdateNamespaceRequest)(nil), // 18: odpf.siren.v1beta1.UpdateNamespaceRequest - (*UpdateNamespaceResponse)(nil), // 19: odpf.siren.v1beta1.UpdateNamespaceResponse - (*DeleteNamespaceRequest)(nil), // 20: odpf.siren.v1beta1.DeleteNamespaceRequest - (*DeleteNamespaceResponse)(nil), // 21: odpf.siren.v1beta1.DeleteNamespaceResponse - (*ReceiverMetadata)(nil), // 22: odpf.siren.v1beta1.ReceiverMetadata - (*Subscription)(nil), // 23: odpf.siren.v1beta1.Subscription - (*ListSubscriptionsRequest)(nil), // 24: odpf.siren.v1beta1.ListSubscriptionsRequest - (*ListSubscriptionsResponse)(nil), // 25: odpf.siren.v1beta1.ListSubscriptionsResponse - (*CreateSubscriptionRequest)(nil), // 26: odpf.siren.v1beta1.CreateSubscriptionRequest - (*CreateSubscriptionResponse)(nil), // 27: odpf.siren.v1beta1.CreateSubscriptionResponse - (*GetSubscriptionRequest)(nil), // 28: odpf.siren.v1beta1.GetSubscriptionRequest - (*GetSubscriptionResponse)(nil), // 29: odpf.siren.v1beta1.GetSubscriptionResponse - (*UpdateSubscriptionRequest)(nil), // 30: odpf.siren.v1beta1.UpdateSubscriptionRequest - (*UpdateSubscriptionResponse)(nil), // 31: odpf.siren.v1beta1.UpdateSubscriptionResponse - (*DeleteSubscriptionRequest)(nil), // 32: odpf.siren.v1beta1.DeleteSubscriptionRequest - (*DeleteSubscriptionResponse)(nil), // 33: odpf.siren.v1beta1.DeleteSubscriptionResponse - (*Receiver)(nil), // 34: odpf.siren.v1beta1.Receiver - (*ListReceiversRequest)(nil), // 35: odpf.siren.v1beta1.ListReceiversRequest - (*ListReceiversResponse)(nil), // 36: odpf.siren.v1beta1.ListReceiversResponse - (*CreateReceiverRequest)(nil), // 37: odpf.siren.v1beta1.CreateReceiverRequest - (*CreateReceiverResponse)(nil), // 38: odpf.siren.v1beta1.CreateReceiverResponse - (*GetReceiverRequest)(nil), // 39: odpf.siren.v1beta1.GetReceiverRequest - (*GetReceiverResponse)(nil), // 40: odpf.siren.v1beta1.GetReceiverResponse - (*UpdateReceiverRequest)(nil), // 41: odpf.siren.v1beta1.UpdateReceiverRequest - (*UpdateReceiverResponse)(nil), // 42: odpf.siren.v1beta1.UpdateReceiverResponse - (*DeleteReceiverRequest)(nil), // 43: odpf.siren.v1beta1.DeleteReceiverRequest - (*DeleteReceiverResponse)(nil), // 44: odpf.siren.v1beta1.DeleteReceiverResponse - (*NotifyReceiverRequest)(nil), // 45: odpf.siren.v1beta1.NotifyReceiverRequest - (*NotifyReceiverResponse)(nil), // 46: odpf.siren.v1beta1.NotifyReceiverResponse - (*Alert)(nil), // 47: odpf.siren.v1beta1.Alert - (*ListAlertsRequest)(nil), // 48: odpf.siren.v1beta1.ListAlertsRequest - (*ListAlertsResponse)(nil), // 49: odpf.siren.v1beta1.ListAlertsResponse - (*CreateAlertsRequest)(nil), // 50: odpf.siren.v1beta1.CreateAlertsRequest - (*CreateAlertsResponse)(nil), // 51: odpf.siren.v1beta1.CreateAlertsResponse - (*Annotations)(nil), // 52: odpf.siren.v1beta1.Annotations - (*Labels)(nil), // 53: odpf.siren.v1beta1.Labels - (*Rule)(nil), // 54: odpf.siren.v1beta1.Rule - (*Variables)(nil), // 55: odpf.siren.v1beta1.Variables - (*ListRulesRequest)(nil), // 56: odpf.siren.v1beta1.ListRulesRequest - (*ListRulesResponse)(nil), // 57: odpf.siren.v1beta1.ListRulesResponse - (*UpdateRuleRequest)(nil), // 58: odpf.siren.v1beta1.UpdateRuleRequest - (*UpdateRuleResponse)(nil), // 59: odpf.siren.v1beta1.UpdateRuleResponse - (*TemplateVariables)(nil), // 60: odpf.siren.v1beta1.TemplateVariables - (*Template)(nil), // 61: odpf.siren.v1beta1.Template - (*ListTemplatesRequest)(nil), // 62: odpf.siren.v1beta1.ListTemplatesRequest - (*ListTemplatesResponse)(nil), // 63: odpf.siren.v1beta1.ListTemplatesResponse - (*UpsertTemplateRequest)(nil), // 64: odpf.siren.v1beta1.UpsertTemplateRequest - (*UpsertTemplateResponse)(nil), // 65: odpf.siren.v1beta1.UpsertTemplateResponse - (*GetTemplateRequest)(nil), // 66: odpf.siren.v1beta1.GetTemplateRequest - (*GetTemplateResponse)(nil), // 67: odpf.siren.v1beta1.GetTemplateResponse - (*DeleteTemplateRequest)(nil), // 68: odpf.siren.v1beta1.DeleteTemplateRequest - (*DeleteTemplateResponse)(nil), // 69: odpf.siren.v1beta1.DeleteTemplateResponse - (*RenderTemplateRequest)(nil), // 70: odpf.siren.v1beta1.RenderTemplateRequest - (*RenderTemplateResponse)(nil), // 71: odpf.siren.v1beta1.RenderTemplateResponse - nil, // 72: odpf.siren.v1beta1.Provider.LabelsEntry - nil, // 73: odpf.siren.v1beta1.CreateProviderRequest.LabelsEntry - nil, // 74: odpf.siren.v1beta1.UpdateProviderRequest.LabelsEntry - nil, // 75: odpf.siren.v1beta1.Namespace.LabelsEntry - nil, // 76: odpf.siren.v1beta1.CreateNamespaceRequest.LabelsEntry - nil, // 77: odpf.siren.v1beta1.UpdateNamespaceRequest.LabelsEntry - nil, // 78: odpf.siren.v1beta1.Subscription.MatchEntry - nil, // 79: odpf.siren.v1beta1.CreateSubscriptionRequest.MatchEntry - nil, // 80: odpf.siren.v1beta1.UpdateSubscriptionRequest.MatchEntry - nil, // 81: odpf.siren.v1beta1.Receiver.LabelsEntry - nil, // 82: odpf.siren.v1beta1.CreateReceiverRequest.LabelsEntry - nil, // 83: odpf.siren.v1beta1.UpdateReceiverRequest.LabelsEntry - nil, // 84: odpf.siren.v1beta1.RenderTemplateRequest.VariablesEntry - (*structpb.Struct)(nil), // 85: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 86: google.protobuf.Timestamp + (*Provider)(nil), // 0: odpf.siren.v1beta1.Provider + (*ListProvidersRequest)(nil), // 1: odpf.siren.v1beta1.ListProvidersRequest + (*ListProvidersResponse)(nil), // 2: odpf.siren.v1beta1.ListProvidersResponse + (*CreateProviderRequest)(nil), // 3: odpf.siren.v1beta1.CreateProviderRequest + (*CreateProviderResponse)(nil), // 4: odpf.siren.v1beta1.CreateProviderResponse + (*GetProviderRequest)(nil), // 5: odpf.siren.v1beta1.GetProviderRequest + (*GetProviderResponse)(nil), // 6: odpf.siren.v1beta1.GetProviderResponse + (*UpdateProviderRequest)(nil), // 7: odpf.siren.v1beta1.UpdateProviderRequest + (*UpdateProviderResponse)(nil), // 8: odpf.siren.v1beta1.UpdateProviderResponse + (*DeleteProviderRequest)(nil), // 9: odpf.siren.v1beta1.DeleteProviderRequest + (*DeleteProviderResponse)(nil), // 10: odpf.siren.v1beta1.DeleteProviderResponse + (*Namespace)(nil), // 11: odpf.siren.v1beta1.Namespace + (*ListNamespacesRequest)(nil), // 12: odpf.siren.v1beta1.ListNamespacesRequest + (*ListNamespacesResponse)(nil), // 13: odpf.siren.v1beta1.ListNamespacesResponse + (*CreateNamespaceRequest)(nil), // 14: odpf.siren.v1beta1.CreateNamespaceRequest + (*CreateNamespaceResponse)(nil), // 15: odpf.siren.v1beta1.CreateNamespaceResponse + (*GetNamespaceRequest)(nil), // 16: odpf.siren.v1beta1.GetNamespaceRequest + (*GetNamespaceResponse)(nil), // 17: odpf.siren.v1beta1.GetNamespaceResponse + (*UpdateNamespaceRequest)(nil), // 18: odpf.siren.v1beta1.UpdateNamespaceRequest + (*UpdateNamespaceResponse)(nil), // 19: odpf.siren.v1beta1.UpdateNamespaceResponse + (*DeleteNamespaceRequest)(nil), // 20: odpf.siren.v1beta1.DeleteNamespaceRequest + (*DeleteNamespaceResponse)(nil), // 21: odpf.siren.v1beta1.DeleteNamespaceResponse + (*ReceiverMetadata)(nil), // 22: odpf.siren.v1beta1.ReceiverMetadata + (*Subscription)(nil), // 23: odpf.siren.v1beta1.Subscription + (*ListSubscriptionsRequest)(nil), // 24: odpf.siren.v1beta1.ListSubscriptionsRequest + (*ListSubscriptionsResponse)(nil), // 25: odpf.siren.v1beta1.ListSubscriptionsResponse + (*CreateSubscriptionRequest)(nil), // 26: odpf.siren.v1beta1.CreateSubscriptionRequest + (*CreateSubscriptionResponse)(nil), // 27: odpf.siren.v1beta1.CreateSubscriptionResponse + (*GetSubscriptionRequest)(nil), // 28: odpf.siren.v1beta1.GetSubscriptionRequest + (*GetSubscriptionResponse)(nil), // 29: odpf.siren.v1beta1.GetSubscriptionResponse + (*UpdateSubscriptionRequest)(nil), // 30: odpf.siren.v1beta1.UpdateSubscriptionRequest + (*UpdateSubscriptionResponse)(nil), // 31: odpf.siren.v1beta1.UpdateSubscriptionResponse + (*DeleteSubscriptionRequest)(nil), // 32: odpf.siren.v1beta1.DeleteSubscriptionRequest + (*DeleteSubscriptionResponse)(nil), // 33: odpf.siren.v1beta1.DeleteSubscriptionResponse + (*Receiver)(nil), // 34: odpf.siren.v1beta1.Receiver + (*ListReceiversRequest)(nil), // 35: odpf.siren.v1beta1.ListReceiversRequest + (*ListReceiversResponse)(nil), // 36: odpf.siren.v1beta1.ListReceiversResponse + (*CreateReceiverRequest)(nil), // 37: odpf.siren.v1beta1.CreateReceiverRequest + (*CreateReceiverResponse)(nil), // 38: odpf.siren.v1beta1.CreateReceiverResponse + (*GetReceiverRequest)(nil), // 39: odpf.siren.v1beta1.GetReceiverRequest + (*GetReceiverResponse)(nil), // 40: odpf.siren.v1beta1.GetReceiverResponse + (*UpdateReceiverRequest)(nil), // 41: odpf.siren.v1beta1.UpdateReceiverRequest + (*UpdateReceiverResponse)(nil), // 42: odpf.siren.v1beta1.UpdateReceiverResponse + (*DeleteReceiverRequest)(nil), // 43: odpf.siren.v1beta1.DeleteReceiverRequest + (*DeleteReceiverResponse)(nil), // 44: odpf.siren.v1beta1.DeleteReceiverResponse + (*NotifyReceiverRequest)(nil), // 45: odpf.siren.v1beta1.NotifyReceiverRequest + (*NotifyReceiverResponse)(nil), // 46: odpf.siren.v1beta1.NotifyReceiverResponse + (*Alert)(nil), // 47: odpf.siren.v1beta1.Alert + (*ListAlertsRequest)(nil), // 48: odpf.siren.v1beta1.ListAlertsRequest + (*ListAlertsResponse)(nil), // 49: odpf.siren.v1beta1.ListAlertsResponse + (*CreateAlertsRequest)(nil), // 50: odpf.siren.v1beta1.CreateAlertsRequest + (*CreateAlertsResponse)(nil), // 51: odpf.siren.v1beta1.CreateAlertsResponse + (*CreateAlertsWithNamespaceRequest)(nil), // 52: odpf.siren.v1beta1.CreateAlertsWithNamespaceRequest + (*CreateAlertsWithNamespaceResponse)(nil), // 53: odpf.siren.v1beta1.CreateAlertsWithNamespaceResponse + (*Annotations)(nil), // 54: odpf.siren.v1beta1.Annotations + (*Labels)(nil), // 55: odpf.siren.v1beta1.Labels + (*Rule)(nil), // 56: odpf.siren.v1beta1.Rule + (*Variables)(nil), // 57: odpf.siren.v1beta1.Variables + (*ListRulesRequest)(nil), // 58: odpf.siren.v1beta1.ListRulesRequest + (*ListRulesResponse)(nil), // 59: odpf.siren.v1beta1.ListRulesResponse + (*UpdateRuleRequest)(nil), // 60: odpf.siren.v1beta1.UpdateRuleRequest + (*UpdateRuleResponse)(nil), // 61: odpf.siren.v1beta1.UpdateRuleResponse + (*TemplateVariables)(nil), // 62: odpf.siren.v1beta1.TemplateVariables + (*Template)(nil), // 63: odpf.siren.v1beta1.Template + (*ListTemplatesRequest)(nil), // 64: odpf.siren.v1beta1.ListTemplatesRequest + (*ListTemplatesResponse)(nil), // 65: odpf.siren.v1beta1.ListTemplatesResponse + (*UpsertTemplateRequest)(nil), // 66: odpf.siren.v1beta1.UpsertTemplateRequest + (*UpsertTemplateResponse)(nil), // 67: odpf.siren.v1beta1.UpsertTemplateResponse + (*GetTemplateRequest)(nil), // 68: odpf.siren.v1beta1.GetTemplateRequest + (*GetTemplateResponse)(nil), // 69: odpf.siren.v1beta1.GetTemplateResponse + (*DeleteTemplateRequest)(nil), // 70: odpf.siren.v1beta1.DeleteTemplateRequest + (*DeleteTemplateResponse)(nil), // 71: odpf.siren.v1beta1.DeleteTemplateResponse + (*RenderTemplateRequest)(nil), // 72: odpf.siren.v1beta1.RenderTemplateRequest + (*RenderTemplateResponse)(nil), // 73: odpf.siren.v1beta1.RenderTemplateResponse + nil, // 74: odpf.siren.v1beta1.Provider.LabelsEntry + nil, // 75: odpf.siren.v1beta1.CreateProviderRequest.LabelsEntry + nil, // 76: odpf.siren.v1beta1.UpdateProviderRequest.LabelsEntry + nil, // 77: odpf.siren.v1beta1.Namespace.LabelsEntry + nil, // 78: odpf.siren.v1beta1.CreateNamespaceRequest.LabelsEntry + nil, // 79: odpf.siren.v1beta1.UpdateNamespaceRequest.LabelsEntry + nil, // 80: odpf.siren.v1beta1.Subscription.MatchEntry + nil, // 81: odpf.siren.v1beta1.CreateSubscriptionRequest.MatchEntry + nil, // 82: odpf.siren.v1beta1.UpdateSubscriptionRequest.MatchEntry + nil, // 83: odpf.siren.v1beta1.Receiver.LabelsEntry + nil, // 84: odpf.siren.v1beta1.CreateReceiverRequest.LabelsEntry + nil, // 85: odpf.siren.v1beta1.UpdateReceiverRequest.LabelsEntry + nil, // 86: odpf.siren.v1beta1.RenderTemplateRequest.VariablesEntry + (*structpb.Struct)(nil), // 87: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 88: google.protobuf.Timestamp } var file_odpf_siren_v1beta1_siren_proto_depIdxs = []int32{ - 85, // 0: odpf.siren.v1beta1.Provider.credentials:type_name -> google.protobuf.Struct - 72, // 1: odpf.siren.v1beta1.Provider.labels:type_name -> odpf.siren.v1beta1.Provider.LabelsEntry - 86, // 2: odpf.siren.v1beta1.Provider.created_at:type_name -> google.protobuf.Timestamp - 86, // 3: odpf.siren.v1beta1.Provider.updated_at:type_name -> google.protobuf.Timestamp + 87, // 0: odpf.siren.v1beta1.Provider.credentials:type_name -> google.protobuf.Struct + 74, // 1: odpf.siren.v1beta1.Provider.labels:type_name -> odpf.siren.v1beta1.Provider.LabelsEntry + 88, // 2: odpf.siren.v1beta1.Provider.created_at:type_name -> google.protobuf.Timestamp + 88, // 3: odpf.siren.v1beta1.Provider.updated_at:type_name -> google.protobuf.Timestamp 0, // 4: odpf.siren.v1beta1.ListProvidersResponse.providers:type_name -> odpf.siren.v1beta1.Provider - 85, // 5: odpf.siren.v1beta1.CreateProviderRequest.credentials:type_name -> google.protobuf.Struct - 73, // 6: odpf.siren.v1beta1.CreateProviderRequest.labels:type_name -> odpf.siren.v1beta1.CreateProviderRequest.LabelsEntry + 87, // 5: odpf.siren.v1beta1.CreateProviderRequest.credentials:type_name -> google.protobuf.Struct + 75, // 6: odpf.siren.v1beta1.CreateProviderRequest.labels:type_name -> odpf.siren.v1beta1.CreateProviderRequest.LabelsEntry 0, // 7: odpf.siren.v1beta1.GetProviderResponse.provider:type_name -> odpf.siren.v1beta1.Provider - 85, // 8: odpf.siren.v1beta1.UpdateProviderRequest.credentials:type_name -> google.protobuf.Struct - 74, // 9: odpf.siren.v1beta1.UpdateProviderRequest.labels:type_name -> odpf.siren.v1beta1.UpdateProviderRequest.LabelsEntry - 85, // 10: odpf.siren.v1beta1.Namespace.credentials:type_name -> google.protobuf.Struct - 75, // 11: odpf.siren.v1beta1.Namespace.labels:type_name -> odpf.siren.v1beta1.Namespace.LabelsEntry - 86, // 12: odpf.siren.v1beta1.Namespace.created_at:type_name -> google.protobuf.Timestamp - 86, // 13: odpf.siren.v1beta1.Namespace.updated_at:type_name -> google.protobuf.Timestamp + 87, // 8: odpf.siren.v1beta1.UpdateProviderRequest.credentials:type_name -> google.protobuf.Struct + 76, // 9: odpf.siren.v1beta1.UpdateProviderRequest.labels:type_name -> odpf.siren.v1beta1.UpdateProviderRequest.LabelsEntry + 87, // 10: odpf.siren.v1beta1.Namespace.credentials:type_name -> google.protobuf.Struct + 77, // 11: odpf.siren.v1beta1.Namespace.labels:type_name -> odpf.siren.v1beta1.Namespace.LabelsEntry + 88, // 12: odpf.siren.v1beta1.Namespace.created_at:type_name -> google.protobuf.Timestamp + 88, // 13: odpf.siren.v1beta1.Namespace.updated_at:type_name -> google.protobuf.Timestamp 11, // 14: odpf.siren.v1beta1.ListNamespacesResponse.namespaces:type_name -> odpf.siren.v1beta1.Namespace - 85, // 15: odpf.siren.v1beta1.CreateNamespaceRequest.credentials:type_name -> google.protobuf.Struct - 76, // 16: odpf.siren.v1beta1.CreateNamespaceRequest.labels:type_name -> odpf.siren.v1beta1.CreateNamespaceRequest.LabelsEntry - 86, // 17: odpf.siren.v1beta1.CreateNamespaceRequest.created_at:type_name -> google.protobuf.Timestamp - 86, // 18: odpf.siren.v1beta1.CreateNamespaceRequest.updated_at:type_name -> google.protobuf.Timestamp + 87, // 15: odpf.siren.v1beta1.CreateNamespaceRequest.credentials:type_name -> google.protobuf.Struct + 78, // 16: odpf.siren.v1beta1.CreateNamespaceRequest.labels:type_name -> odpf.siren.v1beta1.CreateNamespaceRequest.LabelsEntry + 88, // 17: odpf.siren.v1beta1.CreateNamespaceRequest.created_at:type_name -> google.protobuf.Timestamp + 88, // 18: odpf.siren.v1beta1.CreateNamespaceRequest.updated_at:type_name -> google.protobuf.Timestamp 11, // 19: odpf.siren.v1beta1.GetNamespaceResponse.namespace:type_name -> odpf.siren.v1beta1.Namespace - 85, // 20: odpf.siren.v1beta1.UpdateNamespaceRequest.credentials:type_name -> google.protobuf.Struct - 77, // 21: odpf.siren.v1beta1.UpdateNamespaceRequest.labels:type_name -> odpf.siren.v1beta1.UpdateNamespaceRequest.LabelsEntry - 85, // 22: odpf.siren.v1beta1.ReceiverMetadata.configuration:type_name -> google.protobuf.Struct + 87, // 20: odpf.siren.v1beta1.UpdateNamespaceRequest.credentials:type_name -> google.protobuf.Struct + 79, // 21: odpf.siren.v1beta1.UpdateNamespaceRequest.labels:type_name -> odpf.siren.v1beta1.UpdateNamespaceRequest.LabelsEntry + 87, // 22: odpf.siren.v1beta1.ReceiverMetadata.configuration:type_name -> google.protobuf.Struct 22, // 23: odpf.siren.v1beta1.Subscription.receivers:type_name -> odpf.siren.v1beta1.ReceiverMetadata - 78, // 24: odpf.siren.v1beta1.Subscription.match:type_name -> odpf.siren.v1beta1.Subscription.MatchEntry - 86, // 25: odpf.siren.v1beta1.Subscription.created_at:type_name -> google.protobuf.Timestamp - 86, // 26: odpf.siren.v1beta1.Subscription.updated_at:type_name -> google.protobuf.Timestamp + 80, // 24: odpf.siren.v1beta1.Subscription.match:type_name -> odpf.siren.v1beta1.Subscription.MatchEntry + 88, // 25: odpf.siren.v1beta1.Subscription.created_at:type_name -> google.protobuf.Timestamp + 88, // 26: odpf.siren.v1beta1.Subscription.updated_at:type_name -> google.protobuf.Timestamp 23, // 27: odpf.siren.v1beta1.ListSubscriptionsResponse.subscriptions:type_name -> odpf.siren.v1beta1.Subscription 22, // 28: odpf.siren.v1beta1.CreateSubscriptionRequest.receivers:type_name -> odpf.siren.v1beta1.ReceiverMetadata - 79, // 29: odpf.siren.v1beta1.CreateSubscriptionRequest.match:type_name -> odpf.siren.v1beta1.CreateSubscriptionRequest.MatchEntry + 81, // 29: odpf.siren.v1beta1.CreateSubscriptionRequest.match:type_name -> odpf.siren.v1beta1.CreateSubscriptionRequest.MatchEntry 23, // 30: odpf.siren.v1beta1.GetSubscriptionResponse.subscription:type_name -> odpf.siren.v1beta1.Subscription 22, // 31: odpf.siren.v1beta1.UpdateSubscriptionRequest.receivers:type_name -> odpf.siren.v1beta1.ReceiverMetadata - 80, // 32: odpf.siren.v1beta1.UpdateSubscriptionRequest.match:type_name -> odpf.siren.v1beta1.UpdateSubscriptionRequest.MatchEntry - 81, // 33: odpf.siren.v1beta1.Receiver.labels:type_name -> odpf.siren.v1beta1.Receiver.LabelsEntry - 85, // 34: odpf.siren.v1beta1.Receiver.configurations:type_name -> google.protobuf.Struct - 85, // 35: odpf.siren.v1beta1.Receiver.data:type_name -> google.protobuf.Struct - 86, // 36: odpf.siren.v1beta1.Receiver.created_at:type_name -> google.protobuf.Timestamp - 86, // 37: odpf.siren.v1beta1.Receiver.updated_at:type_name -> google.protobuf.Timestamp + 82, // 32: odpf.siren.v1beta1.UpdateSubscriptionRequest.match:type_name -> odpf.siren.v1beta1.UpdateSubscriptionRequest.MatchEntry + 83, // 33: odpf.siren.v1beta1.Receiver.labels:type_name -> odpf.siren.v1beta1.Receiver.LabelsEntry + 87, // 34: odpf.siren.v1beta1.Receiver.configurations:type_name -> google.protobuf.Struct + 87, // 35: odpf.siren.v1beta1.Receiver.data:type_name -> google.protobuf.Struct + 88, // 36: odpf.siren.v1beta1.Receiver.created_at:type_name -> google.protobuf.Timestamp + 88, // 37: odpf.siren.v1beta1.Receiver.updated_at:type_name -> google.protobuf.Timestamp 34, // 38: odpf.siren.v1beta1.ListReceiversResponse.receivers:type_name -> odpf.siren.v1beta1.Receiver - 82, // 39: odpf.siren.v1beta1.CreateReceiverRequest.labels:type_name -> odpf.siren.v1beta1.CreateReceiverRequest.LabelsEntry - 85, // 40: odpf.siren.v1beta1.CreateReceiverRequest.configurations:type_name -> google.protobuf.Struct + 84, // 39: odpf.siren.v1beta1.CreateReceiverRequest.labels:type_name -> odpf.siren.v1beta1.CreateReceiverRequest.LabelsEntry + 87, // 40: odpf.siren.v1beta1.CreateReceiverRequest.configurations:type_name -> google.protobuf.Struct 34, // 41: odpf.siren.v1beta1.GetReceiverResponse.receiver:type_name -> odpf.siren.v1beta1.Receiver - 83, // 42: odpf.siren.v1beta1.UpdateReceiverRequest.labels:type_name -> odpf.siren.v1beta1.UpdateReceiverRequest.LabelsEntry - 85, // 43: odpf.siren.v1beta1.UpdateReceiverRequest.configurations:type_name -> google.protobuf.Struct - 85, // 44: odpf.siren.v1beta1.NotifyReceiverRequest.payload:type_name -> google.protobuf.Struct - 86, // 45: odpf.siren.v1beta1.Alert.triggered_at:type_name -> google.protobuf.Timestamp + 85, // 42: odpf.siren.v1beta1.UpdateReceiverRequest.labels:type_name -> odpf.siren.v1beta1.UpdateReceiverRequest.LabelsEntry + 87, // 43: odpf.siren.v1beta1.UpdateReceiverRequest.configurations:type_name -> google.protobuf.Struct + 87, // 44: odpf.siren.v1beta1.NotifyReceiverRequest.payload:type_name -> google.protobuf.Struct + 88, // 45: odpf.siren.v1beta1.Alert.triggered_at:type_name -> google.protobuf.Timestamp 47, // 46: odpf.siren.v1beta1.ListAlertsResponse.alerts:type_name -> odpf.siren.v1beta1.Alert - 85, // 47: odpf.siren.v1beta1.CreateAlertsRequest.body:type_name -> google.protobuf.Struct + 87, // 47: odpf.siren.v1beta1.CreateAlertsRequest.body:type_name -> google.protobuf.Struct 47, // 48: odpf.siren.v1beta1.CreateAlertsResponse.alerts:type_name -> odpf.siren.v1beta1.Alert - 55, // 49: odpf.siren.v1beta1.Rule.variables:type_name -> odpf.siren.v1beta1.Variables - 86, // 50: odpf.siren.v1beta1.Rule.created_at:type_name -> google.protobuf.Timestamp - 86, // 51: odpf.siren.v1beta1.Rule.updated_at:type_name -> google.protobuf.Timestamp - 54, // 52: odpf.siren.v1beta1.ListRulesResponse.rules:type_name -> odpf.siren.v1beta1.Rule - 55, // 53: odpf.siren.v1beta1.UpdateRuleRequest.variables:type_name -> odpf.siren.v1beta1.Variables - 86, // 54: odpf.siren.v1beta1.Template.created_at:type_name -> google.protobuf.Timestamp - 86, // 55: odpf.siren.v1beta1.Template.updated_at:type_name -> google.protobuf.Timestamp - 60, // 56: odpf.siren.v1beta1.Template.variables:type_name -> odpf.siren.v1beta1.TemplateVariables - 61, // 57: odpf.siren.v1beta1.ListTemplatesResponse.templates:type_name -> odpf.siren.v1beta1.Template - 60, // 58: odpf.siren.v1beta1.UpsertTemplateRequest.variables:type_name -> odpf.siren.v1beta1.TemplateVariables - 61, // 59: odpf.siren.v1beta1.GetTemplateResponse.template:type_name -> odpf.siren.v1beta1.Template - 84, // 60: odpf.siren.v1beta1.RenderTemplateRequest.variables:type_name -> odpf.siren.v1beta1.RenderTemplateRequest.VariablesEntry - 1, // 61: odpf.siren.v1beta1.SirenService.ListProviders:input_type -> odpf.siren.v1beta1.ListProvidersRequest - 3, // 62: odpf.siren.v1beta1.SirenService.CreateProvider:input_type -> odpf.siren.v1beta1.CreateProviderRequest - 5, // 63: odpf.siren.v1beta1.SirenService.GetProvider:input_type -> odpf.siren.v1beta1.GetProviderRequest - 7, // 64: odpf.siren.v1beta1.SirenService.UpdateProvider:input_type -> odpf.siren.v1beta1.UpdateProviderRequest - 9, // 65: odpf.siren.v1beta1.SirenService.DeleteProvider:input_type -> odpf.siren.v1beta1.DeleteProviderRequest - 45, // 66: odpf.siren.v1beta1.SirenService.NotifyReceiver:input_type -> odpf.siren.v1beta1.NotifyReceiverRequest - 12, // 67: odpf.siren.v1beta1.SirenService.ListNamespaces:input_type -> odpf.siren.v1beta1.ListNamespacesRequest - 14, // 68: odpf.siren.v1beta1.SirenService.CreateNamespace:input_type -> odpf.siren.v1beta1.CreateNamespaceRequest - 16, // 69: odpf.siren.v1beta1.SirenService.GetNamespace:input_type -> odpf.siren.v1beta1.GetNamespaceRequest - 18, // 70: odpf.siren.v1beta1.SirenService.UpdateNamespace:input_type -> odpf.siren.v1beta1.UpdateNamespaceRequest - 20, // 71: odpf.siren.v1beta1.SirenService.DeleteNamespace:input_type -> odpf.siren.v1beta1.DeleteNamespaceRequest - 24, // 72: odpf.siren.v1beta1.SirenService.ListSubscriptions:input_type -> odpf.siren.v1beta1.ListSubscriptionsRequest - 26, // 73: odpf.siren.v1beta1.SirenService.CreateSubscription:input_type -> odpf.siren.v1beta1.CreateSubscriptionRequest - 28, // 74: odpf.siren.v1beta1.SirenService.GetSubscription:input_type -> odpf.siren.v1beta1.GetSubscriptionRequest - 30, // 75: odpf.siren.v1beta1.SirenService.UpdateSubscription:input_type -> odpf.siren.v1beta1.UpdateSubscriptionRequest - 32, // 76: odpf.siren.v1beta1.SirenService.DeleteSubscription:input_type -> odpf.siren.v1beta1.DeleteSubscriptionRequest - 35, // 77: odpf.siren.v1beta1.SirenService.ListReceivers:input_type -> odpf.siren.v1beta1.ListReceiversRequest - 37, // 78: odpf.siren.v1beta1.SirenService.CreateReceiver:input_type -> odpf.siren.v1beta1.CreateReceiverRequest - 39, // 79: odpf.siren.v1beta1.SirenService.GetReceiver:input_type -> odpf.siren.v1beta1.GetReceiverRequest - 41, // 80: odpf.siren.v1beta1.SirenService.UpdateReceiver:input_type -> odpf.siren.v1beta1.UpdateReceiverRequest - 43, // 81: odpf.siren.v1beta1.SirenService.DeleteReceiver:input_type -> odpf.siren.v1beta1.DeleteReceiverRequest - 48, // 82: odpf.siren.v1beta1.SirenService.ListAlerts:input_type -> odpf.siren.v1beta1.ListAlertsRequest - 50, // 83: odpf.siren.v1beta1.SirenService.CreateAlerts:input_type -> odpf.siren.v1beta1.CreateAlertsRequest - 56, // 84: odpf.siren.v1beta1.SirenService.ListRules:input_type -> odpf.siren.v1beta1.ListRulesRequest - 58, // 85: odpf.siren.v1beta1.SirenService.UpdateRule:input_type -> odpf.siren.v1beta1.UpdateRuleRequest - 62, // 86: odpf.siren.v1beta1.SirenService.ListTemplates:input_type -> odpf.siren.v1beta1.ListTemplatesRequest - 66, // 87: odpf.siren.v1beta1.SirenService.GetTemplate:input_type -> odpf.siren.v1beta1.GetTemplateRequest - 64, // 88: odpf.siren.v1beta1.SirenService.UpsertTemplate:input_type -> odpf.siren.v1beta1.UpsertTemplateRequest - 68, // 89: odpf.siren.v1beta1.SirenService.DeleteTemplate:input_type -> odpf.siren.v1beta1.DeleteTemplateRequest - 70, // 90: odpf.siren.v1beta1.SirenService.RenderTemplate:input_type -> odpf.siren.v1beta1.RenderTemplateRequest - 2, // 91: odpf.siren.v1beta1.SirenService.ListProviders:output_type -> odpf.siren.v1beta1.ListProvidersResponse - 4, // 92: odpf.siren.v1beta1.SirenService.CreateProvider:output_type -> odpf.siren.v1beta1.CreateProviderResponse - 6, // 93: odpf.siren.v1beta1.SirenService.GetProvider:output_type -> odpf.siren.v1beta1.GetProviderResponse - 8, // 94: odpf.siren.v1beta1.SirenService.UpdateProvider:output_type -> odpf.siren.v1beta1.UpdateProviderResponse - 10, // 95: odpf.siren.v1beta1.SirenService.DeleteProvider:output_type -> odpf.siren.v1beta1.DeleteProviderResponse - 46, // 96: odpf.siren.v1beta1.SirenService.NotifyReceiver:output_type -> odpf.siren.v1beta1.NotifyReceiverResponse - 13, // 97: odpf.siren.v1beta1.SirenService.ListNamespaces:output_type -> odpf.siren.v1beta1.ListNamespacesResponse - 15, // 98: odpf.siren.v1beta1.SirenService.CreateNamespace:output_type -> odpf.siren.v1beta1.CreateNamespaceResponse - 17, // 99: odpf.siren.v1beta1.SirenService.GetNamespace:output_type -> odpf.siren.v1beta1.GetNamespaceResponse - 19, // 100: odpf.siren.v1beta1.SirenService.UpdateNamespace:output_type -> odpf.siren.v1beta1.UpdateNamespaceResponse - 21, // 101: odpf.siren.v1beta1.SirenService.DeleteNamespace:output_type -> odpf.siren.v1beta1.DeleteNamespaceResponse - 25, // 102: odpf.siren.v1beta1.SirenService.ListSubscriptions:output_type -> odpf.siren.v1beta1.ListSubscriptionsResponse - 27, // 103: odpf.siren.v1beta1.SirenService.CreateSubscription:output_type -> odpf.siren.v1beta1.CreateSubscriptionResponse - 29, // 104: odpf.siren.v1beta1.SirenService.GetSubscription:output_type -> odpf.siren.v1beta1.GetSubscriptionResponse - 31, // 105: odpf.siren.v1beta1.SirenService.UpdateSubscription:output_type -> odpf.siren.v1beta1.UpdateSubscriptionResponse - 33, // 106: odpf.siren.v1beta1.SirenService.DeleteSubscription:output_type -> odpf.siren.v1beta1.DeleteSubscriptionResponse - 36, // 107: odpf.siren.v1beta1.SirenService.ListReceivers:output_type -> odpf.siren.v1beta1.ListReceiversResponse - 38, // 108: odpf.siren.v1beta1.SirenService.CreateReceiver:output_type -> odpf.siren.v1beta1.CreateReceiverResponse - 40, // 109: odpf.siren.v1beta1.SirenService.GetReceiver:output_type -> odpf.siren.v1beta1.GetReceiverResponse - 42, // 110: odpf.siren.v1beta1.SirenService.UpdateReceiver:output_type -> odpf.siren.v1beta1.UpdateReceiverResponse - 44, // 111: odpf.siren.v1beta1.SirenService.DeleteReceiver:output_type -> odpf.siren.v1beta1.DeleteReceiverResponse - 49, // 112: odpf.siren.v1beta1.SirenService.ListAlerts:output_type -> odpf.siren.v1beta1.ListAlertsResponse - 51, // 113: odpf.siren.v1beta1.SirenService.CreateAlerts:output_type -> odpf.siren.v1beta1.CreateAlertsResponse - 57, // 114: odpf.siren.v1beta1.SirenService.ListRules:output_type -> odpf.siren.v1beta1.ListRulesResponse - 59, // 115: odpf.siren.v1beta1.SirenService.UpdateRule:output_type -> odpf.siren.v1beta1.UpdateRuleResponse - 63, // 116: odpf.siren.v1beta1.SirenService.ListTemplates:output_type -> odpf.siren.v1beta1.ListTemplatesResponse - 67, // 117: odpf.siren.v1beta1.SirenService.GetTemplate:output_type -> odpf.siren.v1beta1.GetTemplateResponse - 65, // 118: odpf.siren.v1beta1.SirenService.UpsertTemplate:output_type -> odpf.siren.v1beta1.UpsertTemplateResponse - 69, // 119: odpf.siren.v1beta1.SirenService.DeleteTemplate:output_type -> odpf.siren.v1beta1.DeleteTemplateResponse - 71, // 120: odpf.siren.v1beta1.SirenService.RenderTemplate:output_type -> odpf.siren.v1beta1.RenderTemplateResponse - 91, // [91:121] is the sub-list for method output_type - 61, // [61:91] is the sub-list for method input_type - 61, // [61:61] is the sub-list for extension type_name - 61, // [61:61] is the sub-list for extension extendee - 0, // [0:61] is the sub-list for field type_name + 87, // 49: odpf.siren.v1beta1.CreateAlertsWithNamespaceRequest.body:type_name -> google.protobuf.Struct + 47, // 50: odpf.siren.v1beta1.CreateAlertsWithNamespaceResponse.alerts:type_name -> odpf.siren.v1beta1.Alert + 57, // 51: odpf.siren.v1beta1.Rule.variables:type_name -> odpf.siren.v1beta1.Variables + 88, // 52: odpf.siren.v1beta1.Rule.created_at:type_name -> google.protobuf.Timestamp + 88, // 53: odpf.siren.v1beta1.Rule.updated_at:type_name -> google.protobuf.Timestamp + 56, // 54: odpf.siren.v1beta1.ListRulesResponse.rules:type_name -> odpf.siren.v1beta1.Rule + 57, // 55: odpf.siren.v1beta1.UpdateRuleRequest.variables:type_name -> odpf.siren.v1beta1.Variables + 88, // 56: odpf.siren.v1beta1.Template.created_at:type_name -> google.protobuf.Timestamp + 88, // 57: odpf.siren.v1beta1.Template.updated_at:type_name -> google.protobuf.Timestamp + 62, // 58: odpf.siren.v1beta1.Template.variables:type_name -> odpf.siren.v1beta1.TemplateVariables + 63, // 59: odpf.siren.v1beta1.ListTemplatesResponse.templates:type_name -> odpf.siren.v1beta1.Template + 62, // 60: odpf.siren.v1beta1.UpsertTemplateRequest.variables:type_name -> odpf.siren.v1beta1.TemplateVariables + 63, // 61: odpf.siren.v1beta1.GetTemplateResponse.template:type_name -> odpf.siren.v1beta1.Template + 86, // 62: odpf.siren.v1beta1.RenderTemplateRequest.variables:type_name -> odpf.siren.v1beta1.RenderTemplateRequest.VariablesEntry + 1, // 63: odpf.siren.v1beta1.SirenService.ListProviders:input_type -> odpf.siren.v1beta1.ListProvidersRequest + 3, // 64: odpf.siren.v1beta1.SirenService.CreateProvider:input_type -> odpf.siren.v1beta1.CreateProviderRequest + 5, // 65: odpf.siren.v1beta1.SirenService.GetProvider:input_type -> odpf.siren.v1beta1.GetProviderRequest + 7, // 66: odpf.siren.v1beta1.SirenService.UpdateProvider:input_type -> odpf.siren.v1beta1.UpdateProviderRequest + 9, // 67: odpf.siren.v1beta1.SirenService.DeleteProvider:input_type -> odpf.siren.v1beta1.DeleteProviderRequest + 45, // 68: odpf.siren.v1beta1.SirenService.NotifyReceiver:input_type -> odpf.siren.v1beta1.NotifyReceiverRequest + 12, // 69: odpf.siren.v1beta1.SirenService.ListNamespaces:input_type -> odpf.siren.v1beta1.ListNamespacesRequest + 14, // 70: odpf.siren.v1beta1.SirenService.CreateNamespace:input_type -> odpf.siren.v1beta1.CreateNamespaceRequest + 16, // 71: odpf.siren.v1beta1.SirenService.GetNamespace:input_type -> odpf.siren.v1beta1.GetNamespaceRequest + 18, // 72: odpf.siren.v1beta1.SirenService.UpdateNamespace:input_type -> odpf.siren.v1beta1.UpdateNamespaceRequest + 20, // 73: odpf.siren.v1beta1.SirenService.DeleteNamespace:input_type -> odpf.siren.v1beta1.DeleteNamespaceRequest + 24, // 74: odpf.siren.v1beta1.SirenService.ListSubscriptions:input_type -> odpf.siren.v1beta1.ListSubscriptionsRequest + 26, // 75: odpf.siren.v1beta1.SirenService.CreateSubscription:input_type -> odpf.siren.v1beta1.CreateSubscriptionRequest + 28, // 76: odpf.siren.v1beta1.SirenService.GetSubscription:input_type -> odpf.siren.v1beta1.GetSubscriptionRequest + 30, // 77: odpf.siren.v1beta1.SirenService.UpdateSubscription:input_type -> odpf.siren.v1beta1.UpdateSubscriptionRequest + 32, // 78: odpf.siren.v1beta1.SirenService.DeleteSubscription:input_type -> odpf.siren.v1beta1.DeleteSubscriptionRequest + 35, // 79: odpf.siren.v1beta1.SirenService.ListReceivers:input_type -> odpf.siren.v1beta1.ListReceiversRequest + 37, // 80: odpf.siren.v1beta1.SirenService.CreateReceiver:input_type -> odpf.siren.v1beta1.CreateReceiverRequest + 39, // 81: odpf.siren.v1beta1.SirenService.GetReceiver:input_type -> odpf.siren.v1beta1.GetReceiverRequest + 41, // 82: odpf.siren.v1beta1.SirenService.UpdateReceiver:input_type -> odpf.siren.v1beta1.UpdateReceiverRequest + 43, // 83: odpf.siren.v1beta1.SirenService.DeleteReceiver:input_type -> odpf.siren.v1beta1.DeleteReceiverRequest + 48, // 84: odpf.siren.v1beta1.SirenService.ListAlerts:input_type -> odpf.siren.v1beta1.ListAlertsRequest + 50, // 85: odpf.siren.v1beta1.SirenService.CreateAlerts:input_type -> odpf.siren.v1beta1.CreateAlertsRequest + 52, // 86: odpf.siren.v1beta1.SirenService.CreateAlertsWithNamespace:input_type -> odpf.siren.v1beta1.CreateAlertsWithNamespaceRequest + 58, // 87: odpf.siren.v1beta1.SirenService.ListRules:input_type -> odpf.siren.v1beta1.ListRulesRequest + 60, // 88: odpf.siren.v1beta1.SirenService.UpdateRule:input_type -> odpf.siren.v1beta1.UpdateRuleRequest + 64, // 89: odpf.siren.v1beta1.SirenService.ListTemplates:input_type -> odpf.siren.v1beta1.ListTemplatesRequest + 68, // 90: odpf.siren.v1beta1.SirenService.GetTemplate:input_type -> odpf.siren.v1beta1.GetTemplateRequest + 66, // 91: odpf.siren.v1beta1.SirenService.UpsertTemplate:input_type -> odpf.siren.v1beta1.UpsertTemplateRequest + 70, // 92: odpf.siren.v1beta1.SirenService.DeleteTemplate:input_type -> odpf.siren.v1beta1.DeleteTemplateRequest + 72, // 93: odpf.siren.v1beta1.SirenService.RenderTemplate:input_type -> odpf.siren.v1beta1.RenderTemplateRequest + 2, // 94: odpf.siren.v1beta1.SirenService.ListProviders:output_type -> odpf.siren.v1beta1.ListProvidersResponse + 4, // 95: odpf.siren.v1beta1.SirenService.CreateProvider:output_type -> odpf.siren.v1beta1.CreateProviderResponse + 6, // 96: odpf.siren.v1beta1.SirenService.GetProvider:output_type -> odpf.siren.v1beta1.GetProviderResponse + 8, // 97: odpf.siren.v1beta1.SirenService.UpdateProvider:output_type -> odpf.siren.v1beta1.UpdateProviderResponse + 10, // 98: odpf.siren.v1beta1.SirenService.DeleteProvider:output_type -> odpf.siren.v1beta1.DeleteProviderResponse + 46, // 99: odpf.siren.v1beta1.SirenService.NotifyReceiver:output_type -> odpf.siren.v1beta1.NotifyReceiverResponse + 13, // 100: odpf.siren.v1beta1.SirenService.ListNamespaces:output_type -> odpf.siren.v1beta1.ListNamespacesResponse + 15, // 101: odpf.siren.v1beta1.SirenService.CreateNamespace:output_type -> odpf.siren.v1beta1.CreateNamespaceResponse + 17, // 102: odpf.siren.v1beta1.SirenService.GetNamespace:output_type -> odpf.siren.v1beta1.GetNamespaceResponse + 19, // 103: odpf.siren.v1beta1.SirenService.UpdateNamespace:output_type -> odpf.siren.v1beta1.UpdateNamespaceResponse + 21, // 104: odpf.siren.v1beta1.SirenService.DeleteNamespace:output_type -> odpf.siren.v1beta1.DeleteNamespaceResponse + 25, // 105: odpf.siren.v1beta1.SirenService.ListSubscriptions:output_type -> odpf.siren.v1beta1.ListSubscriptionsResponse + 27, // 106: odpf.siren.v1beta1.SirenService.CreateSubscription:output_type -> odpf.siren.v1beta1.CreateSubscriptionResponse + 29, // 107: odpf.siren.v1beta1.SirenService.GetSubscription:output_type -> odpf.siren.v1beta1.GetSubscriptionResponse + 31, // 108: odpf.siren.v1beta1.SirenService.UpdateSubscription:output_type -> odpf.siren.v1beta1.UpdateSubscriptionResponse + 33, // 109: odpf.siren.v1beta1.SirenService.DeleteSubscription:output_type -> odpf.siren.v1beta1.DeleteSubscriptionResponse + 36, // 110: odpf.siren.v1beta1.SirenService.ListReceivers:output_type -> odpf.siren.v1beta1.ListReceiversResponse + 38, // 111: odpf.siren.v1beta1.SirenService.CreateReceiver:output_type -> odpf.siren.v1beta1.CreateReceiverResponse + 40, // 112: odpf.siren.v1beta1.SirenService.GetReceiver:output_type -> odpf.siren.v1beta1.GetReceiverResponse + 42, // 113: odpf.siren.v1beta1.SirenService.UpdateReceiver:output_type -> odpf.siren.v1beta1.UpdateReceiverResponse + 44, // 114: odpf.siren.v1beta1.SirenService.DeleteReceiver:output_type -> odpf.siren.v1beta1.DeleteReceiverResponse + 49, // 115: odpf.siren.v1beta1.SirenService.ListAlerts:output_type -> odpf.siren.v1beta1.ListAlertsResponse + 51, // 116: odpf.siren.v1beta1.SirenService.CreateAlerts:output_type -> odpf.siren.v1beta1.CreateAlertsResponse + 53, // 117: odpf.siren.v1beta1.SirenService.CreateAlertsWithNamespace:output_type -> odpf.siren.v1beta1.CreateAlertsWithNamespaceResponse + 59, // 118: odpf.siren.v1beta1.SirenService.ListRules:output_type -> odpf.siren.v1beta1.ListRulesResponse + 61, // 119: odpf.siren.v1beta1.SirenService.UpdateRule:output_type -> odpf.siren.v1beta1.UpdateRuleResponse + 65, // 120: odpf.siren.v1beta1.SirenService.ListTemplates:output_type -> odpf.siren.v1beta1.ListTemplatesResponse + 69, // 121: odpf.siren.v1beta1.SirenService.GetTemplate:output_type -> odpf.siren.v1beta1.GetTemplateResponse + 67, // 122: odpf.siren.v1beta1.SirenService.UpsertTemplate:output_type -> odpf.siren.v1beta1.UpsertTemplateResponse + 71, // 123: odpf.siren.v1beta1.SirenService.DeleteTemplate:output_type -> odpf.siren.v1beta1.DeleteTemplateResponse + 73, // 124: odpf.siren.v1beta1.SirenService.RenderTemplate:output_type -> odpf.siren.v1beta1.RenderTemplateResponse + 94, // [94:125] is the sub-list for method output_type + 63, // [63:94] is the sub-list for method input_type + 63, // [63:63] is the sub-list for extension type_name + 63, // [63:63] is the sub-list for extension extendee + 0, // [0:63] is the sub-list for field type_name } func init() { file_odpf_siren_v1beta1_siren_proto_init() } @@ -6071,7 +6249,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Annotations); i { + switch v := v.(*CreateAlertsWithNamespaceRequest); i { case 0: return &v.state case 1: @@ -6083,7 +6261,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Labels); i { + switch v := v.(*CreateAlertsWithNamespaceResponse); i { case 0: return &v.state case 1: @@ -6095,7 +6273,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rule); i { + switch v := v.(*Annotations); i { case 0: return &v.state case 1: @@ -6107,7 +6285,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Variables); i { + switch v := v.(*Labels); i { case 0: return &v.state case 1: @@ -6119,7 +6297,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRulesRequest); i { + switch v := v.(*Rule); i { case 0: return &v.state case 1: @@ -6131,7 +6309,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRulesResponse); i { + switch v := v.(*Variables); i { case 0: return &v.state case 1: @@ -6143,7 +6321,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRuleRequest); i { + switch v := v.(*ListRulesRequest); i { case 0: return &v.state case 1: @@ -6155,7 +6333,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRuleResponse); i { + switch v := v.(*ListRulesResponse); i { case 0: return &v.state case 1: @@ -6167,7 +6345,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TemplateVariables); i { + switch v := v.(*UpdateRuleRequest); i { case 0: return &v.state case 1: @@ -6179,7 +6357,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Template); i { + switch v := v.(*UpdateRuleResponse); i { case 0: return &v.state case 1: @@ -6191,7 +6369,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTemplatesRequest); i { + switch v := v.(*TemplateVariables); i { case 0: return &v.state case 1: @@ -6203,7 +6381,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTemplatesResponse); i { + switch v := v.(*Template); i { case 0: return &v.state case 1: @@ -6215,7 +6393,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertTemplateRequest); i { + switch v := v.(*ListTemplatesRequest); i { case 0: return &v.state case 1: @@ -6227,7 +6405,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertTemplateResponse); i { + switch v := v.(*ListTemplatesResponse); i { case 0: return &v.state case 1: @@ -6239,7 +6417,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTemplateRequest); i { + switch v := v.(*UpsertTemplateRequest); i { case 0: return &v.state case 1: @@ -6251,7 +6429,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTemplateResponse); i { + switch v := v.(*UpsertTemplateResponse); i { case 0: return &v.state case 1: @@ -6263,7 +6441,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTemplateRequest); i { + switch v := v.(*GetTemplateRequest); i { case 0: return &v.state case 1: @@ -6275,7 +6453,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTemplateResponse); i { + switch v := v.(*GetTemplateResponse); i { case 0: return &v.state case 1: @@ -6287,7 +6465,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenderTemplateRequest); i { + switch v := v.(*DeleteTemplateRequest); i { case 0: return &v.state case 1: @@ -6299,6 +6477,30 @@ func file_odpf_siren_v1beta1_siren_proto_init() { } } file_odpf_siren_v1beta1_siren_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteTemplateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odpf_siren_v1beta1_siren_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenderTemplateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odpf_siren_v1beta1_siren_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RenderTemplateResponse); i { case 0: return &v.state @@ -6317,7 +6519,7 @@ func file_odpf_siren_v1beta1_siren_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_odpf_siren_v1beta1_siren_proto_rawDesc, NumEnums: 0, - NumMessages: 85, + NumMessages: 87, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/odpf/siren/v1beta1/siren.pb.gw.go b/proto/odpf/siren/v1beta1/siren.pb.gw.go index 316fc4dd..1c319ef6 100644 --- a/proto/odpf/siren/v1beta1/siren.pb.gw.go +++ b/proto/odpf/siren/v1beta1/siren.pb.gw.go @@ -1191,6 +1191,114 @@ func local_request_SirenService_CreateAlerts_0(ctx context.Context, marshaler ru } +func request_SirenService_CreateAlertsWithNamespace_0(ctx context.Context, marshaler runtime.Marshaler, client SirenServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateAlertsWithNamespaceRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Body); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["provider_type"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider_type") + } + + protoReq.ProviderType, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider_type", err) + } + + val, ok = pathParams["provider_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider_id") + } + + protoReq.ProviderId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider_id", err) + } + + val, ok = pathParams["namespace_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace_id") + } + + protoReq.NamespaceId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace_id", err) + } + + msg, err := client.CreateAlertsWithNamespace(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SirenService_CreateAlertsWithNamespace_0(ctx context.Context, marshaler runtime.Marshaler, server SirenServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateAlertsWithNamespaceRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Body); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["provider_type"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider_type") + } + + protoReq.ProviderType, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider_type", err) + } + + val, ok = pathParams["provider_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider_id") + } + + protoReq.ProviderId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider_id", err) + } + + val, ok = pathParams["namespace_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace_id") + } + + protoReq.NamespaceId, err = runtime.Uint64(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace_id", err) + } + + msg, err := server.CreateAlertsWithNamespace(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_SirenService_ListRules_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -2084,6 +2192,31 @@ func RegisterSirenServiceHandlerServer(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_SirenService_CreateAlertsWithNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/odpf.siren.v1beta1.SirenService/CreateAlertsWithNamespace", runtime.WithHTTPPathPattern("/v1beta1/alerts/{provider_type}/{provider_id}/{namespace_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SirenService_CreateAlertsWithNamespace_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SirenService_CreateAlertsWithNamespace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_SirenService_ListRules_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2806,6 +2939,28 @@ func RegisterSirenServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("POST", pattern_SirenService_CreateAlertsWithNamespace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/odpf.siren.v1beta1.SirenService/CreateAlertsWithNamespace", runtime.WithHTTPPathPattern("/v1beta1/alerts/{provider_type}/{provider_id}/{namespace_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SirenService_CreateAlertsWithNamespace_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SirenService_CreateAlertsWithNamespace_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_SirenService_ListRules_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3010,6 +3165,8 @@ var ( pattern_SirenService_CreateAlerts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1beta1", "alerts", "provider_type", "provider_id"}, "")) + pattern_SirenService_CreateAlertsWithNamespace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1beta1", "alerts", "provider_type", "provider_id", "namespace_id"}, "")) + pattern_SirenService_ListRules_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1beta1", "rules"}, "")) pattern_SirenService_UpdateRule_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1beta1", "rules"}, "")) @@ -3072,6 +3229,8 @@ var ( forward_SirenService_CreateAlerts_0 = runtime.ForwardResponseMessage + forward_SirenService_CreateAlertsWithNamespace_0 = runtime.ForwardResponseMessage + forward_SirenService_ListRules_0 = runtime.ForwardResponseMessage forward_SirenService_UpdateRule_0 = runtime.ForwardResponseMessage diff --git a/proto/odpf/siren/v1beta1/siren.pb.validate.go b/proto/odpf/siren/v1beta1/siren.pb.validate.go index 7095627c..910bcfb3 100644 --- a/proto/odpf/siren/v1beta1/siren.pb.validate.go +++ b/proto/odpf/siren/v1beta1/siren.pb.validate.go @@ -6123,6 +6123,8 @@ func (m *Alert) validate(all bool) error { } } + // no validation rules for NamespaceId + if len(errors) > 0 { return AlertMultiError(errors) } @@ -6240,6 +6242,8 @@ func (m *ListAlertsRequest) validate(all bool) error { // no validation rules for EndTime + // no validation rules for NamespaceId + if len(errors) > 0 { return ListAlertsRequestMultiError(errors) } @@ -6725,6 +6729,283 @@ var _ interface { ErrorName() string } = CreateAlertsResponseValidationError{} +// Validate checks the field values on CreateAlertsWithNamespaceRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *CreateAlertsWithNamespaceRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CreateAlertsWithNamespaceRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// CreateAlertsWithNamespaceRequestMultiError, or nil if none found. +func (m *CreateAlertsWithNamespaceRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *CreateAlertsWithNamespaceRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for ProviderType + + // no validation rules for ProviderId + + if all { + switch v := interface{}(m.GetBody()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CreateAlertsWithNamespaceRequestValidationError{ + field: "Body", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CreateAlertsWithNamespaceRequestValidationError{ + field: "Body", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetBody()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CreateAlertsWithNamespaceRequestValidationError{ + field: "Body", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for NamespaceId + + if len(errors) > 0 { + return CreateAlertsWithNamespaceRequestMultiError(errors) + } + return nil +} + +// CreateAlertsWithNamespaceRequestMultiError is an error wrapping multiple +// validation errors returned by +// CreateAlertsWithNamespaceRequest.ValidateAll() if the designated +// constraints aren't met. +type CreateAlertsWithNamespaceRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CreateAlertsWithNamespaceRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m CreateAlertsWithNamespaceRequestMultiError) AllErrors() []error { return m } + +// CreateAlertsWithNamespaceRequestValidationError is the validation error +// returned by CreateAlertsWithNamespaceRequest.Validate if the designated +// constraints aren't met. +type CreateAlertsWithNamespaceRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CreateAlertsWithNamespaceRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CreateAlertsWithNamespaceRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CreateAlertsWithNamespaceRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CreateAlertsWithNamespaceRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CreateAlertsWithNamespaceRequestValidationError) ErrorName() string { + return "CreateAlertsWithNamespaceRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e CreateAlertsWithNamespaceRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCreateAlertsWithNamespaceRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CreateAlertsWithNamespaceRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CreateAlertsWithNamespaceRequestValidationError{} + +// Validate checks the field values on CreateAlertsWithNamespaceResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *CreateAlertsWithNamespaceResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CreateAlertsWithNamespaceResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// CreateAlertsWithNamespaceResponseMultiError, or nil if none found. +func (m *CreateAlertsWithNamespaceResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *CreateAlertsWithNamespaceResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetAlerts() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CreateAlertsWithNamespaceResponseValidationError{ + field: fmt.Sprintf("Alerts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CreateAlertsWithNamespaceResponseValidationError{ + field: fmt.Sprintf("Alerts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CreateAlertsWithNamespaceResponseValidationError{ + field: fmt.Sprintf("Alerts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return CreateAlertsWithNamespaceResponseMultiError(errors) + } + return nil +} + +// CreateAlertsWithNamespaceResponseMultiError is an error wrapping multiple +// validation errors returned by +// CreateAlertsWithNamespaceResponse.ValidateAll() if the designated +// constraints aren't met. +type CreateAlertsWithNamespaceResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CreateAlertsWithNamespaceResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m CreateAlertsWithNamespaceResponseMultiError) AllErrors() []error { return m } + +// CreateAlertsWithNamespaceResponseValidationError is the validation error +// returned by CreateAlertsWithNamespaceResponse.Validate if the designated +// constraints aren't met. +type CreateAlertsWithNamespaceResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CreateAlertsWithNamespaceResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CreateAlertsWithNamespaceResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CreateAlertsWithNamespaceResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CreateAlertsWithNamespaceResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CreateAlertsWithNamespaceResponseValidationError) ErrorName() string { + return "CreateAlertsWithNamespaceResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e CreateAlertsWithNamespaceResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCreateAlertsWithNamespaceResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CreateAlertsWithNamespaceResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CreateAlertsWithNamespaceResponseValidationError{} + // Validate checks the field values on Annotations with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. diff --git a/proto/odpf/siren/v1beta1/siren_grpc.pb.go b/proto/odpf/siren/v1beta1/siren_grpc.pb.go index 34b0c557..55c5c76c 100644 --- a/proto/odpf/siren/v1beta1/siren_grpc.pb.go +++ b/proto/odpf/siren/v1beta1/siren_grpc.pb.go @@ -41,6 +41,7 @@ type SirenServiceClient interface { DeleteReceiver(ctx context.Context, in *DeleteReceiverRequest, opts ...grpc.CallOption) (*DeleteReceiverResponse, error) ListAlerts(ctx context.Context, in *ListAlertsRequest, opts ...grpc.CallOption) (*ListAlertsResponse, error) CreateAlerts(ctx context.Context, in *CreateAlertsRequest, opts ...grpc.CallOption) (*CreateAlertsResponse, error) + CreateAlertsWithNamespace(ctx context.Context, in *CreateAlertsWithNamespaceRequest, opts ...grpc.CallOption) (*CreateAlertsWithNamespaceResponse, error) ListRules(ctx context.Context, in *ListRulesRequest, opts ...grpc.CallOption) (*ListRulesResponse, error) UpdateRule(ctx context.Context, in *UpdateRuleRequest, opts ...grpc.CallOption) (*UpdateRuleResponse, error) ListTemplates(ctx context.Context, in *ListTemplatesRequest, opts ...grpc.CallOption) (*ListTemplatesResponse, error) @@ -265,6 +266,15 @@ func (c *sirenServiceClient) CreateAlerts(ctx context.Context, in *CreateAlertsR return out, nil } +func (c *sirenServiceClient) CreateAlertsWithNamespace(ctx context.Context, in *CreateAlertsWithNamespaceRequest, opts ...grpc.CallOption) (*CreateAlertsWithNamespaceResponse, error) { + out := new(CreateAlertsWithNamespaceResponse) + err := c.cc.Invoke(ctx, "/odpf.siren.v1beta1.SirenService/CreateAlertsWithNamespace", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sirenServiceClient) ListRules(ctx context.Context, in *ListRulesRequest, opts ...grpc.CallOption) (*ListRulesResponse, error) { out := new(ListRulesResponse) err := c.cc.Invoke(ctx, "/odpf.siren.v1beta1.SirenService/ListRules", in, out, opts...) @@ -355,6 +365,7 @@ type SirenServiceServer interface { DeleteReceiver(context.Context, *DeleteReceiverRequest) (*DeleteReceiverResponse, error) ListAlerts(context.Context, *ListAlertsRequest) (*ListAlertsResponse, error) CreateAlerts(context.Context, *CreateAlertsRequest) (*CreateAlertsResponse, error) + CreateAlertsWithNamespace(context.Context, *CreateAlertsWithNamespaceRequest) (*CreateAlertsWithNamespaceResponse, error) ListRules(context.Context, *ListRulesRequest) (*ListRulesResponse, error) UpdateRule(context.Context, *UpdateRuleRequest) (*UpdateRuleResponse, error) ListTemplates(context.Context, *ListTemplatesRequest) (*ListTemplatesResponse, error) @@ -438,6 +449,9 @@ func (UnimplementedSirenServiceServer) ListAlerts(context.Context, *ListAlertsRe func (UnimplementedSirenServiceServer) CreateAlerts(context.Context, *CreateAlertsRequest) (*CreateAlertsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateAlerts not implemented") } +func (UnimplementedSirenServiceServer) CreateAlertsWithNamespace(context.Context, *CreateAlertsWithNamespaceRequest) (*CreateAlertsWithNamespaceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAlertsWithNamespace not implemented") +} func (UnimplementedSirenServiceServer) ListRules(context.Context, *ListRulesRequest) (*ListRulesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRules not implemented") } @@ -886,6 +900,24 @@ func _SirenService_CreateAlerts_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _SirenService_CreateAlertsWithNamespace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAlertsWithNamespaceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SirenServiceServer).CreateAlertsWithNamespace(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odpf.siren.v1beta1.SirenService/CreateAlertsWithNamespace", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SirenServiceServer).CreateAlertsWithNamespace(ctx, req.(*CreateAlertsWithNamespaceRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _SirenService_ListRules_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListRulesRequest) if err := dec(in); err != nil { @@ -1111,6 +1143,10 @@ var SirenService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateAlerts", Handler: _SirenService_CreateAlerts_Handler, }, + { + MethodName: "CreateAlertsWithNamespace", + Handler: _SirenService_CreateAlertsWithNamespace_Handler, + }, { MethodName: "ListRules", Handler: _SirenService_ListRules_Handler, diff --git a/proto/siren.swagger.yaml b/proto/siren.swagger.yaml index 7897b0fc..c6cc2a5f 100644 --- a/proto/siren.swagger.yaml +++ b/proto/siren.swagger.yaml @@ -51,6 +51,11 @@ paths: required: false type: string format: uint64 + - name: namespace_id + in: query + required: false + type: string + format: uint64 tags: - Alert post: @@ -82,6 +87,41 @@ paths: type: object tags: - Alert + /v1beta1/alerts/{provider_type}/{provider_id}/{namespace_id}: + post: + summary: create alerts with namespace + operationId: SirenService_CreateAlertsWithNamespace + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/CreateAlertsWithNamespaceResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/Status' + parameters: + - name: provider_type + in: path + required: true + type: string + - name: provider_id + in: path + required: true + type: string + format: uint64 + - name: namespace_id + in: path + required: true + type: string + format: uint64 + - name: body + in: body + required: true + schema: + type: object + tags: + - Alert /v1beta1/namespaces: get: summary: list namespaces @@ -749,6 +789,9 @@ definitions: type: string metric_value: type: string + namespace_id: + type: string + format: uint64 provider_id: type: string format: uint64 @@ -774,6 +817,13 @@ definitions: type: array items: $ref: '#/definitions/Alert' + CreateAlertsWithNamespaceResponse: + type: object + properties: + alerts: + type: array + items: + $ref: '#/definitions/Alert' CreateNamespaceRequest: type: object properties: diff --git a/test/e2e_test/cortex_alerting_test.go b/test/e2e_test/cortex_alerting_test.go index 43bcdd46..cb65b2b8 100644 --- a/test/e2e_test/cortex_alerting_test.go +++ b/test/e2e_test/cortex_alerting_test.go @@ -13,7 +13,6 @@ import ( "github.com/odpf/siren/config" "github.com/odpf/siren/core/notification" "github.com/odpf/siren/internal/server" - "github.com/odpf/siren/pkg/telemetry" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/structpb" @@ -31,28 +30,26 @@ func (s *CortexAlertingTestSuite) SetupTest() { apiPort, err := getFreePort() s.Require().Nil(err) - s.appConfig = &config.Config{ - Log: config.Log{ - Level: "debug", - }, - Telemetry: telemetry.Config{ - Debug: "", - }, - Service: server.Config{ - Port: apiPort, - EncryptionKey: testEncryptionKey, + s.appConfig = &config.Config{} + + defaults.SetDefaults(s.appConfig) + + s.appConfig.Log.Level = "error" + s.appConfig.Service = server.Config{ + Port: apiPort, + EncryptionKey: testEncryptionKey, + } + s.appConfig.Notification = notification.Config{ + MessageHandler: notification.HandlerConfig{ + Enabled: false, }, - Notification: notification.Config{ - MessageHandler: notification.HandlerConfig{ - Enabled: false, - }, - DLQHandler: notification.HandlerConfig{ - Enabled: false, - }, + DLQHandler: notification.HandlerConfig{ + Enabled: false, }, } - - defaults.SetDefaults(s.appConfig) + s.appConfig.Telemetry.Debug = "" + s.appConfig.Telemetry.EnableNewrelic = false + s.appConfig.Telemetry.EnableOtelAgent = false s.testBench, err = InitCortexEnvironment(s.appConfig) s.Require().NoError(err) @@ -105,7 +102,6 @@ func (s *CortexAlertingTestSuite) TestAlerting() { s.Run("Triggering cortex alert with matching subscription labels should trigger notification", func() { configs, err := structpb.NewStruct(map[string]interface{}{ - // "url": "http://some-url", }) s.Require().NoError(err) @@ -149,8 +145,8 @@ func (s *CortexAlertingTestSuite) TestAlerting() { }, "annotations": { "resource": "test_alert", - "metricName": "test_alert", - "metricValue": "1", + "metric_name": "test_alert", + "metric_value": "1", "template": "alert_test" } } @@ -194,7 +190,7 @@ func (s *CortexAlertingTestSuite) TestIncomingHookAPI() { defer r.Body.Close() s.Assert().NoError(err) - expectedBody := `{"alertname":"some alert name","environment":"integration","generatorUrl":"","groupKey":"{}/{environment=\"integration\",team=\"odpf\"}:{}","id":"cortex-684c979dcb5ffb96","key1":"value1","key2":"value2","metricName":"test_alert","metricValue":"1","numAlertsFiring":1,"resource":"test_alert","routing_method":"subscribers","service":"some-service","severity":"WARNING","status":"firing","summary":"this is test alert","team":"odpf","template":"alert_test"}` + expectedBody := `{"alertname":"some alert name","environment":"integration","generatorUrl":"","groupKey":"{}/{environment=\"integration\",team=\"odpf\"}:{}","id":"cortex-684c979dcb5ffb96","key1":"value1","key2":"value2","metric_name":"test_alert","metric_value":"1","numAlertsFiring":1,"resource":"test_alert","routing_method":"subscribers","service":"some-service","severity":"WARNING","status":"firing","summary":"this is test alert","team":"odpf","template":"alert_test"}` s.Assert().Equal(expectedBody, string(body)) close(waitChan) })) @@ -250,8 +246,8 @@ func (s *CortexAlertingTestSuite) TestIncomingHookAPI() { "team": "odpf" }, "annotations": { - "metricName": "test_alert", - "metricValue": "1", + "metric_name": "test_alert", + "metric_value": "1", "resource": "test_alert", "template": "alert_test", "summary": "this is test alert" @@ -268,8 +264,8 @@ func (s *CortexAlertingTestSuite) TestIncomingHookAPI() { "team": "odpf" }, "commonAnnotations": { - "metricName": "test_alert", - "metricValue": "1", + "metric_name": "test_alert", + "metric_value": "1", "resource": "test_alert", "template": "alert_test" }, @@ -279,7 +275,7 @@ func (s *CortexAlertingTestSuite) TestIncomingHookAPI() { "truncatedAlerts": 0 }` - res, err := http.DefaultClient.Post(fmt.Sprintf("http://localhost:%d/v1beta1/alerts/cortex/1", s.appConfig.Service.Port), "application/json", bytes.NewBufferString(triggerAlertBody)) + res, err := http.DefaultClient.Post(fmt.Sprintf("http://localhost:%d/v1beta1/alerts/cortex/1/1", s.appConfig.Service.Port), "application/json", bytes.NewBufferString(triggerAlertBody)) s.Require().NoError(err) bodyJSon, _ := io.ReadAll(res.Body) diff --git a/test/e2e_test/cortex_namespace_test.go b/test/e2e_test/cortex_namespace_test.go index 5cf0b8a9..be896809 100644 --- a/test/e2e_test/cortex_namespace_test.go +++ b/test/e2e_test/cortex_namespace_test.go @@ -6,11 +6,11 @@ import ( "os" "testing" + "github.com/google/go-cmp/cmp" "github.com/mcuadros/go-defaults" "github.com/odpf/siren/config" "github.com/odpf/siren/core/notification" "github.com/odpf/siren/internal/server" - "github.com/odpf/siren/pkg/telemetry" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" "github.com/stretchr/testify/suite" ) @@ -27,28 +27,26 @@ func (s *CortexNamespaceTestSuite) SetupTest() { apiPort, err := getFreePort() s.Require().Nil(err) - s.appConfig = &config.Config{ - Log: config.Log{ - Level: "debug", - }, - Telemetry: telemetry.Config{ - Debug: "", - }, - Service: server.Config{ - Port: apiPort, - EncryptionKey: testEncryptionKey, + s.appConfig = &config.Config{} + + defaults.SetDefaults(s.appConfig) + + s.appConfig.Log.Level = "error" + s.appConfig.Service = server.Config{ + Port: apiPort, + EncryptionKey: testEncryptionKey, + } + s.appConfig.Notification = notification.Config{ + MessageHandler: notification.HandlerConfig{ + Enabled: false, }, - Notification: notification.Config{ - MessageHandler: notification.HandlerConfig{ - Enabled: false, - }, - DLQHandler: notification.HandlerConfig{ - Enabled: false, - }, + DLQHandler: notification.HandlerConfig{ + Enabled: false, }, } - - defaults.SetDefaults(s.appConfig) + s.appConfig.Telemetry.Debug = "" + s.appConfig.Telemetry.EnableNewrelic = false + s.appConfig.Telemetry.EnableOtelAgent = false s.testBench, err = InitCortexEnvironment(s.appConfig) s.Require().NoError(err) @@ -98,7 +96,7 @@ func (s *CortexNamespaceTestSuite) TestNamespace() { expectedScenarioCortexAM, err := os.ReadFile("testdata/cortex/expected-cortexamconfig-scenario.yaml") s.Require().NoError(err) - s.Assert().Empty(diffYaml(bodyBytes, expectedScenarioCortexAM)) + s.Assert().Empty(cmp.Diff(bodyBytes, expectedScenarioCortexAM)) }) } diff --git a/test/e2e_test/cortex_rule_test.go b/test/e2e_test/cortex_rule_test.go index 68260e94..e85d2e56 100644 --- a/test/e2e_test/cortex_rule_test.go +++ b/test/e2e_test/cortex_rule_test.go @@ -10,7 +10,6 @@ import ( "github.com/odpf/siren/config" "github.com/odpf/siren/core/notification" "github.com/odpf/siren/internal/server" - "github.com/odpf/siren/pkg/telemetry" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" "github.com/stretchr/testify/suite" ) @@ -30,28 +29,26 @@ func (s *CortexRuleTestSuite) SetupTest() { apiPort, err := getFreePort() s.Require().Nil(err) - s.appConfig = &config.Config{ - Log: config.Log{ - Level: "debug", - }, - Telemetry: telemetry.Config{ - Debug: "", - }, - Service: server.Config{ - Port: apiPort, - EncryptionKey: testEncryptionKey, + s.appConfig = &config.Config{} + + defaults.SetDefaults(s.appConfig) + + s.appConfig.Log.Level = "error" + s.appConfig.Service = server.Config{ + Port: apiPort, + EncryptionKey: testEncryptionKey, + } + s.appConfig.Notification = notification.Config{ + MessageHandler: notification.HandlerConfig{ + Enabled: false, }, - Notification: notification.Config{ - MessageHandler: notification.HandlerConfig{ - Enabled: false, - }, - DLQHandler: notification.HandlerConfig{ - Enabled: false, - }, + DLQHandler: notification.HandlerConfig{ + Enabled: false, }, } - - defaults.SetDefaults(s.appConfig) + s.appConfig.Telemetry.Debug = "" + s.appConfig.Telemetry.EnableNewrelic = false + s.appConfig.Telemetry.EnableOtelAgent = false s.testBench, err = InitCortexEnvironment(s.appConfig) s.Require().NoError(err) diff --git a/test/e2e_test/notification_test.go b/test/e2e_test/notification_test.go index c9b6236a..e0839223 100644 --- a/test/e2e_test/notification_test.go +++ b/test/e2e_test/notification_test.go @@ -13,8 +13,6 @@ import ( "github.com/odpf/siren/config" "github.com/odpf/siren/core/notification" "github.com/odpf/siren/internal/server" - "github.com/odpf/siren/pkg/telemetry" - "github.com/odpf/siren/plugins/queues" sirenv1beta1 "github.com/odpf/siren/proto/odpf/siren/v1beta1" "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/structpb" @@ -35,31 +33,26 @@ func (s *NotificationTestSuite) SetupTest() { apiPort, err := getFreePort() s.Require().Nil(err) - s.appConfig = &config.Config{ - Log: config.Log{ - Level: "debug", - }, - Service: server.Config{ - Port: apiPort, - EncryptionKey: testEncryptionKey, + s.appConfig = &config.Config{} + + defaults.SetDefaults(s.appConfig) + + s.appConfig.Log.Level = "error" + s.appConfig.Service = server.Config{ + Port: apiPort, + EncryptionKey: testEncryptionKey, + } + s.appConfig.Notification = notification.Config{ + MessageHandler: notification.HandlerConfig{ + Enabled: true, }, - Telemetry: telemetry.Config{ - Debug: "", - }, - Notification: notification.Config{ - Queue: queues.Config{ - Kind: queues.KindPostgres, - }, - MessageHandler: notification.HandlerConfig{ - Enabled: false, - }, - DLQHandler: notification.HandlerConfig{ - Enabled: false, - }, + DLQHandler: notification.HandlerConfig{ + Enabled: false, }, } - - defaults.SetDefaults(s.appConfig) + s.appConfig.Telemetry.Debug = "" + s.appConfig.Telemetry.EnableNewrelic = false + s.appConfig.Telemetry.EnableOtelAgent = false s.testBench, err = InitCortexEnvironment(s.appConfig) s.Require().NoError(err) diff --git a/test/e2e_test/testdata/cortex/expected-cortexamconfig-scenario.yaml b/test/e2e_test/testdata/cortex/expected-cortexamconfig-scenario.yaml index 3cac5a6b..a9ea8564 100644 --- a/test/e2e_test/testdata/cortex/expected-cortexamconfig-scenario.yaml +++ b/test/e2e_test/testdata/cortex/expected-cortexamconfig-scenario.yaml @@ -1,82 +1,82 @@ template_files: - helper.tmpl: |- - {{define "__alert_severity_prefix_emoji" -}} - {{if ne .Status "firing" -}} - :white_check_mark: - {{- else if eq .CommonLabels.severity "CRITICAL" -}} - :fire: - {{- else if eq .CommonLabels.severity "WARNING" -}} - :warning: - {{- else -}} - :question: - {{- end}} - {{- end}} - {{ define "slack.pretext" -}} - {{- template "__alert_severity_prefix_emoji" . }} [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] - {{- if eq .Status "resolved" }} ~[{{ .CommonLabels.severity | toUpper }}]~ - {{- else }} *[{{ .CommonLabels.severity | toUpper }}]* - {{- end}} {{ .CommonLabels.alertname }} - {{- end }} - {{define "slack.color" -}} - {{if eq .Status "firing" -}} - {{if eq .CommonLabels.severity "WARNING" -}} - warning - {{- else if eq .CommonLabels.severity "CRITICAL" -}} - danger - {{- else -}} - #439FE0 - {{- end -}} - {{else -}} - good - {{- end}} - {{- end}} - {{ define "slack.title" -}} - {{$first := true}}{{ range .CommonLabels.SortedPairs}}{{if $first}}{{$first = false}}{{else}}{{` | `}}{{end}}{{ .Value }}{{end }} - {{- end }} - {{ define "slack.body"}} - {{ range .Alerts -}} - {{ .Annotations.summary }} - {{ end }} - {{ end}} - {{ define "alertmanager_root_url" }}http://localhost:8080{{ end }} - {{ define "slack.warning.name" }}{{ end }} - {{ define "slack.warning.webhook_url" }}Not Supported: https://github.com/prometheus/alertmanager/issues/2207{{ end }} - {{ define "slack.critical.name" }}{{ end }} - {{ define "slack.critical.webhook_url" }}Not Supported: https://github.com/prometheus/alertmanager/issues/2207{{ end }} - {{ define "pagerduty.service_key" }}xyz{{ end }} - {{ define "slack.default.name" }}none{{ end }} - {{ define "silence_url" -}} - {{ template "alertmanager_root_url" }}/api/prom/alertmanager/#/silences/new?filter={{ `{` | urlquery -}} - {{$first := true}}{{range .CommonLabels.SortedPairs }}{{if $first}}{{$first = false}}{{else}}{{`,` | urlquery }}{{end -}} - {{ .Name | urlquery }}{{ `="` | urlquery }}{{ .Value | urlquery }}{{ `"` | urlquery }}{{ end }} - {{- `}` | urlquery }} - {{- end }} - {{define "slack.dashboard"}} - {{- if (index .Alerts 0).Annotations.dashboard}}{{(index .Alerts 0).Annotations.dashboard}}{{else}}https://radar.golabs.io{{end}} - {{- end -}} - {{define "slack.runbook"}} - {{- if (index .Alerts 0).Annotations.playbook}}{{(index .Alerts 0).Annotations.playbook}}{{end}} - {{- end -}} + helper.tmpl: |- + {{define "__alert_severity_prefix_emoji" -}} + {{if ne .Status "firing" -}} + :white_check_mark: + {{- else if eq .CommonLabels.severity "CRITICAL" -}} + :fire: + {{- else if eq .CommonLabels.severity "WARNING" -}} + :warning: + {{- else -}} + :question: + {{- end}} + {{- end}} + {{ define "slack.pretext" -}} + {{- template "__alert_severity_prefix_emoji" . }} [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] + {{- if eq .Status "resolved" }} ~[{{ .CommonLabels.severity | toUpper }}]~ + {{- else }} *[{{ .CommonLabels.severity | toUpper }}]* + {{- end}} {{ .CommonLabels.alertname }} + {{- end }} + {{define "slack.color" -}} + {{if eq .Status "firing" -}} + {{if eq .CommonLabels.severity "WARNING" -}} + warning + {{- else if eq .CommonLabels.severity "CRITICAL" -}} + danger + {{- else -}} + #439FE0 + {{- end -}} + {{else -}} + good + {{- end}} + {{- end}} + {{ define "slack.title" -}} + {{$first := true}}{{ range .CommonLabels.SortedPairs}}{{if $first}}{{$first = false}}{{else}}{{` | `}}{{end}}{{ .Value }}{{end }} + {{- end }} + {{ define "slack.body"}} + {{ range .Alerts -}} + {{ .Annotations.summary }} + {{ end }} + {{ end}} + {{ define "alertmanager_root_url" }}http://localhost:8080{{ end }} + {{ define "slack.warning.name" }}{{ end }} + {{ define "slack.warning.webhook_url" }}Not Supported: https://github.com/prometheus/alertmanager/issues/2207{{ end }} + {{ define "slack.critical.name" }}{{ end }} + {{ define "slack.critical.webhook_url" }}Not Supported: https://github.com/prometheus/alertmanager/issues/2207{{ end }} + {{ define "pagerduty.service_key" }}xyz{{ end }} + {{ define "slack.default.name" }}none{{ end }} + {{ define "silence_url" -}} + {{ template "alertmanager_root_url" }}/api/prom/alertmanager/#/silences/new?filter={{ `{` | urlquery -}} + {{$first := true}}{{range .CommonLabels.SortedPairs }}{{if $first}}{{$first = false}}{{else}}{{`,` | urlquery }}{{end -}} + {{ .Name | urlquery }}{{ `="` | urlquery }}{{ .Value | urlquery }}{{ `"` | urlquery }}{{ end }} + {{- `}` | urlquery }} + {{- end }} + {{define "slack.dashboard"}} + {{- if (index .Alerts 0).Annotations.dashboard}}{{(index .Alerts 0).Annotations.dashboard}}{{else}}https://radar.golabs.io{{end}} + {{- end -}} + {{define "slack.runbook"}} + {{- if (index .Alerts 0).Annotations.playbook}}{{(index .Alerts 0).Annotations.playbook}}{{end}} + {{- end -}} alertmanager_config: |- - templates: - - 'helper.tmpl' - global: - pagerduty_url: https://events.pagerduty.com/v2/enqueue - resolve_timeout: 5m - slack_api_url: https://slack.com/api/chat.postMessage - receivers: - - name: default - webhook_configs: - - url: 'http://host.docker.internal:8080/v1beta1/alerts/cortex/1' - route: - receiver: default - group_by: - - alertname - - severity - - owner - - service_name - - time_stamp - - identifier - group_wait: 30s - group_interval: 30m - repeat_interval: 4h + templates: + - 'helper.tmpl' + global: + pagerduty_url: https://events.pagerduty.com/v2/enqueue + resolve_timeout: 5m + slack_api_url: https://slack.com/api/chat.postMessage + receivers: + - name: default + webhook_configs: + - url: 'http://host.docker.internal:8080/v1beta1/alerts/cortex/1/1' + route: + receiver: default + group_by: + - alertname + - severity + - owner + - service_name + - time_stamp + - identifier + group_wait: 30s + group_interval: 5m + repeat_interval: 4h